Laravel: метод загрузки в другом контроллере без изменения URL-адреса
У меня есть этот маршрут: Route::controller('/', 'PearsController');
Возможно ли в Laravel заставить PearsController загрузить метод с другого контроллера, чтобы URL-адрес не изменился?
Например:
// route:
Route::controller('/', 'PearsController');
// controllers
class PearsController extends BaseController {
public function getAbc() {
// How do I load [email protected] 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!'
}
}
Ответы
Ответ 1
Вы можете использовать (только L3)
Controller::call('[email protected]');
В L4
вы можете использовать
$request = Request::create('/apples', 'GET', array());
return Route::dispatch($request)->getContent();
В этом случае вам нужно определить маршрут для ApplesController
, что-то вроде этого
Route::get('/apples', '[email protected]'); // in routes.php
В array()
вы можете передать аргументы, если требуется.
Ответ 2
(neto в Вызовите контроллер в Laravel 4)
Использовать IoC...
App::make($controller)->{$action}();
Например:
App::make('HomeController')->getIndex();
и вы также можете дать параметры
App::make('HomeController')->getIndex($params);
Ответ 3
Вы не должны. В 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();
}
}
Ответ 4
если вы были в AbcdController
и пытаетесь получить доступ к методу public function test()
, который существует в OtherController
, вы можете просто сделать:
$getTests = (new OtherController)->test();
Это должно работать в L5.1