Laravel: метод загрузки в другом контроллере без изменения URL-адреса

У меня есть этот маршрут: Route::controller('/', 'PearsController'); Возможно ли в Laravel заставить PearsController загрузить метод с другого контроллера, чтобы URL-адрес не изменился?

Например:

 // 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!' } } 

Вы можете использовать (только L3)

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

В L4 вы можете использовать

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

В этом случае вам нужно определить маршрут для ApplesController , что-то вроде этого

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

В array() вы можете передавать аргументы, если это необходимо.

(по neto в вызове контроллера в Laravel 4 )

Использовать IoC …

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

Например:

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

и вы также можете дать параметры

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

Тебе не следует. В MVC контроллеры не должны «разговаривать» друг с другом, если им приходится делиться «данными», они должны делать это с помощью модели, которая является типом класса, ответственного за совместное использование данных в вашем приложении. Посмотрите:

 // 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!'; } } 

РЕДАКТИРОВАТЬ

Вместо этого вы можете использовать BaseController для создания общих функций, которые будут использоваться всеми вашими контроллерами. Взгляните на commonFunction в BaseController и на то, как он используется в двух контроллерах.

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

если вы были в AbcdController и пытаетесь получить доступ к public function test() которая существует в OtherController вы можете просто сделать:

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

Это должно работать в L5.1