Подтвердить что ты не робот

Вызовите контролера в Laravel 4

В Laravel 3 вы можете вызвать контроллер, используя метод Controller:: call, например:

Controller::call('[email protected]', $params);

Я просмотрел класс Controller в L4 и нашел этот метод, который заменяет старый метод: callAction(). Хотя это не статический метод, и я не мог заставить его работать. Вероятно, это не правильный способ сделать это?

Как я могу сделать это в Laravel 4?

4b9b3361

Ответ 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);