У меня есть этот маршрут: 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