Вызовите контролера в Laravel 4
В Laravel 3 вы можете вызвать контроллер, используя метод Controller:: call, например:
Controller::call('[email protected]', $params);
Я просмотрел класс Controller в L4 и нашел этот метод, который заменяет старый метод: callAction(). Хотя это не статический метод, и я не мог заставить его работать. Вероятно, это не правильный способ сделать это?
Как я могу сделать это в Laravel 4?
Ответы
Ответ 1
Если я правильно понимаю, вы пытаетесь создать приложение, ориентированное на API, и хотите получить доступ к API внутри вашего веб-приложения, чтобы избежать дополнительного HTTP-запроса (например, cURL). Это правильно?
Вы можете сделать следующее:
$request = Request::create('api/items', 'GET', $params);
return Route::dispatch($request)->getContent();
Обратите внимание, что вместо указания адресата контроллера @вам нужно будет использовать маршрут uri, который вы обычно используете для доступа к API извне.
Еще лучше, теперь вы можете указать HTTP-глагол, на который должен отвечать запрос.
Ответ 2
Эй, ребята, вы можете использовать IoC...
попробуйте это
App::make($controller)->{$action}();
Например: App:: сделать ( 'HomeController') → GetIndex();
и вы также можете дать параметры
App::make('HomeController')->getIndex($params);
Ответ 3
Как и Neto, вы можете:
App::make('HomeController')->getIndex($params);
Но для отправки, например, POST с дополнительными данными, вы можете использовать метод "merge":
$input = array('extra_field1' => 'value1', 'extra_field2' => 'value2');
Input::merge($input);
return App:make('HomeController')->someMethodInController();
Это работает для меня!
до свидания
Ответ 4
Это не лучший способ, но вы можете создать функцию для этого:
function call($controller, $action, $parameters = array())
{
$app = app();
$controller = $app->make($controller);
return $controller->callAction($app, $app['router'], $action, $parameters);
}
Route::get('/test', function($var = null) use ($params)
{
return call('TestController', 'index', array($params));
});
Ответ 5
Решение Laurent работает (хотя вам нужен ведущий /
, а $params
, который вы передаете в Request::create
, являются параметрами GET, а не те, которые обрабатываются Laravel (нужно положить их после api/items/
в примере).
Я не могу поверить, что нет более простого способа сделать это, хотя (не то, чтобы это было трудно, но для меня это выглядит как-то неловко). В принципе, Laravel 4 не обеспечивает простой способ сопоставления маршрута с контроллером с помощью функции обратного вызова? Серьезно? Это самая распространенная вещь в мире...
Мне пришлось сделать это по одному из моих проектов:
Route::controller('players', 'PlayerController');
Route::get('player/{id}{rest?}', function($id)
{
$request = Request::create('/players/view/' . $id, 'GET');
return Route::dispatch($request)->getContent();
})
->where('id', '\d+');
Надеюсь, что мне не хватает чего-то очевидного.
Ответ 6
$request = Request::create('common_slider', 'GET', $parameters);
return Controller::getRouter()->dispatch($request)->getContent();
Для laravel 5.1
Ответ 7
Это старый вопрос. Но, может быть, полезно. Есть ли другой способ.
В вашем контроллере: вы можете объявить эту функцию как общедоступную статическую
public static function functioNAME(params)
{
....
}
И затем в файле Routes или в представлении:
ControllerClassName::functionNAME(params);