web-dev-qa-db-fra.com

Laravel: méthode de chargement dans un autre contrôleur sans changer l'url

J'ai cette route: Route::controller('/', 'PearsController'); Est-il possible dans Laravel d'obtenir que PearsController charge une méthode à partir d'un autre contrôleur afin que l'URL ne change pas?

Par exemple:

// route:
Route::controller('/', 'PearsController');


// controllers
class PearsController extends BaseController {

    public function getAbc() {
        // How do I load ApplesController@getSomething so I can split up
        // my methods without changing the url? (retains domain.com/abc)
    }

}

class ApplesController extends BaseController {

    public function getSomething() {
        echo 'It works!'
    }

}
19
enchance

Vous pouvez utiliser (L3 uniquement)

Controller::call('ApplesController@getSomething');

Dans L4, Vous pouvez utiliser

$request = Request::create('/apples', 'GET', array());
return Route::dispatch($request)->getContent();

Dans ce cas, vous devez définir une route pour ApplesController, quelque chose comme ça

Route::get('/apples', 'ApplesController@getSomething'); // in routes.php

Dans la array(), vous pouvez passer des arguments si nécessaire.

37
The Alpha

(par neto in Appeler un contrôleur en Laravel 4 )

Utiliser IoC ...

App::make($controller)->{$action}();

Par exemple:

App::make('HomeController')->getIndex();

et vous pouvez également donner des paramètres

App::make('HomeController')->getIndex($params);
27
Joeri

Tu ne devrais pas. Dans MVC, les contrôleurs ne doivent pas se "parler" les uns aux autres, s'ils doivent partager des "données", ils doivent le faire en utilisant un modèle, qui est le type de classe responsable du partage de données dans votre application. Regardez:

// route:
Route::controller('/', 'PearsController');


// controllers
class PearsController extends BaseController {

    public function getAbc() 
    {
        $something = new MySomethingModel;

        $this->commonFunction();

        echo $something->getSomething();
    }

}

class ApplesController extends BaseController {

    public function showSomething() 
    {
        $something = new MySomethingModel;

        $this->commonFunction();

        echo $something->getSomething();
    }

}

class MySomethingModel {

    public function getSomething() 
    {
        return 'It works!';
    }

}

MODIFIER

Ce que vous pouvez faire à la place est d'utiliser BaseController pour créer des fonctions communes à partager par tous vos contrôleurs. Jetez un œil à commonFunction dans BaseController et comment il est utilisé dans les deux contrôleurs.

abstract class BaseController extends Controller {

    public function commonFunction() 
    {
       // will do common things 
    }

}

class PearsController extends BaseController {

    public function getAbc() 
    {
        return $this->commonFunction();
    }

}

class ApplesController extends BaseController {

    public function showSomething() 
    {
        return $this->commonFunction();
    }

}
11

si vous étiez dans AbcdController et que vous tentiez d'accéder à la méthode public function test() qui existe dans OtherController, vous pourriez simplement faire:

$getTests = (new OtherController)->test();

Cela devrait fonctionner dans L5.1

8
Kal