在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);