2013-03-04 5 views
38

В Laravel 3, вы можете вызвать контроллер с помощью контроллера :: метода вызова, например, так:Вызов контроллера в Laravel 4

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

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

Как это сделать в Laravel 4?

ответ

50

Если я правильно понимаю, вы пытаетесь создать приложение, ориентированное на API, и хотите получить доступ к API внутри вашего веб-приложения, чтобы избежать дополнительного HTTP-запроса (например, cURL). Это верно?

Вы можете сделать следующее:

$request = Request::create('api/items', 'GET', $params); 
return Route::dispatch($request)->getContent(); 

Обратите внимание, что, вместо того, чтобы указать метод управления @ назначения, вы должны будете использовать Ури маршрут, который вы обычно используете для доступа к API извне.

Еще лучше, теперь вы можете указать HTTP-глагол, на который должен отвечать запрос.

+0

Это не работает для меня. Я получаю ошибку 'Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException', а URL-адрес, который, по его словам, не найден, не является' api/items', а скорее контроллером, который делает этот вызов. – Kousha

+0

Любые идеи, на что он был изменен, в L 4. *? –

+0

Как передать параметры как получить запрос? Параметры недоступны в методе, если они переданы в массиве? –

0

решение Лорана работает (хотя вам нужен ведущий / и $params вы передаете в Request::create являются GET PARAMS, а не тех, кто занимается Laravel (должен поместить их после того, как api/items/ в примере).

я не могу верю, что нет более простого способа сделать это, хотя (не то, что это сложно, но для меня это выглядит неловко). В принципе, Laravel 4 не обеспечивает простой способ сопоставления маршрута с контроллером с использованием функции обратного вызова ? Серьезно? Это самая распространенная вещь в мире ...

Я должен был это сделать o n один из моих проектов:

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+'); 

Надеюсь, что мне не хватает чего-то очевидного.

+1

Похоже, вы должны использовать [находчивые контроллеры] (http://four.laravel.com/docs/controllers#resource-controllers). Что вы делаете с помощью '{rest}' placeholder? –

+0

Контроллеры ресурсов должны действительно выполнять работу (только начали использовать L4 вчера или около того, еще не узнали о всех новых материалах), но мне бы хотелось, чтобы на всякий случай мне понравился более «настраиваемый» способ обработки вещей. Думаю, использование Request :: create не так уж плохо. ('{rest?}' есть так, что там могут быть вещи сразу после ID в заголовке, для более дружественных URL-адресов.) В любом случае, спасибо! – Jeto

1

Это не самый лучший способ, но вы можете создать функцию, чтобы сделать это:

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)); 
}); 
+0

Gabriel Koerich это здорово! Единственная проблема с этим заключается в том, что Route :: currentRouteAction() является нулевым, и в моем случае мне нужна эта информация, не могли бы вы дать мне свой вклад. Я создал вопрос на – user391986

+0

. Ну, вы можете передать «имя» и действие для этот маршрут в параметре? –

+0

Это не работает для меня - laravel 4.2, прототипом является 'callAction ($ method, $ parameters)', поэтому вам не нужно включать '$ app'. Кроме того, callAction передает параметры в качестве аргументов, он не устанавливает их как входные значения. – Benubird

88

Эй, ребята, вы можете использовать IoC ...

попробовать этот

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

Например: App :: make ('HomeController') -> getIndex();

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

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

В этом подходе фильтры не называются – neoascetic

+2

Это зависит от того, что вам нужно. Для случая, когда у вас есть маршрут, например '/ {slug}', и это может быть продукт или страница, вы хотите вызвать функцию, которая проверяет базу данных для slug, а затем вызывает соответствующий контроллер. – rootman

7

Как Нету сказал, что вы можете пользователь:

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

Но отправить, например, пост с дополнительными данными, которые вы могли бы использовать «сливаться» метод до:

$input = array('extra_field1' => 'value1', 'extra_field2' => 'value2'); 
Input::merge($input); 

return App:make('HomeController')->someMethodInController(); 

Это работает для меня!

свиданья

0
$request = Request::create('common_slider', 'GET', $parameters); 
return Controller::getRouter()->dispatch($request)->getContent(); 

Для Laravel 5.1

+1

Кажется, что это не работает. –

0

Это старый вопрос. Но, может быть, полезно. Есть ли другой способ.

В контроллере: Вы можете объявить функцию как общественный статический

public static function functioNAME(params) 
{ 
    .... 
} 

А затем в файле маршрутов или в представлении:

ControllerClassName::functionNAME(params); 
Смежные вопросы