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!'
}
}
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.
(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);
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();
}
}
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