在Laravel 4中调用一个控制器
在Laravel 3中,可以使用Controller :: call方法调用控制器,如下所示:
Controller::call('api.items@index', $params);
我查看了L4中的Controller类,发现这个方法似乎取代了以前的方法:callAction()。 虽然这不是一个静态的方法,我不能得到它的工作。 可能不是正确的做法吗?
我怎样才能在Laravel 4中做到这一点?
如果我理解正确,那么您正在尝试构build一个以API为中心的应用程序,并且希望在您的Web应用程序的内部访问API,以避免发出额外的HTTP请求(例如使用cURL)。 那是对的吗?
你可以做到以下几点:
$request = Request::create('api/items', 'GET', $params); return Route::dispatch($request)->getContent();
请注意,不是指定controller @ method目标,而是需要使用通常用于从外部访问API的uri路由。
更好的是,您现在可以指定请求应该响应的HTTP动词。
嗨,你可以使用IoC …
尝试这个
App::make($controller)->{$action}();
例如:App :: make('HomeController') – > getIndex();
你也可以给params
App::make('HomeController')->getIndex($params);
像内托说,你可以用户:
App::make('HomeController')->getIndex($params);
但是要发送一个带有额外数据的POST实例,你可以在之前使用“merge”方法:
$input = array('extra_field1' => 'value1', 'extra_field2' => 'value2'); Input::merge($input); return App:make('HomeController')->someMethodInController();
这个对我有用!
再见
这不是最好的方法,但你可以创build一个function来做到这一点:
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)); });
Laurent的解决scheme工作(虽然你需要一个领先的/
和你传递给Request::create
的$params
是GET PARAMS,而不是由Laravel处理(必须把它们放在api/items/
之后)。
我不能相信有没有一个更简单的方法来做到这一点虽然(并不难,但它看起来有点哈克我)。 基本上, Laravel 4不提供一个简单的方法来映射路由到控制器使用callback函数? 真的吗? 这是世界上最常见的事情…
我必须在我的一个项目上做到这一点:
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+');
希望我错过了一些明显的东西。
$request = Request::create('common_slider', 'GET', $parameters); return Controller::getRouter()->dispatch($request)->getContent();
对于laravel 5.1
这是一个古老的问题。 但也许是有用的。 有没有另一种方法。
在您的控制器中:您可以将该函数声明为公共静态
public static function functioNAME(params) { .... }
然后在Routes文件或View中:
ControllerClassName::functionNAME(params);