在Laravel 4中调用控制器

时间:2013-03-04 15:37:41

标签: laravel laravel-4

在Laravel 3中,您可以使用Controller :: call方法调用控制器,如下所示:

Controller::call('api.items@index', $params);

我查看了L4中的Controller类,发现这个方法似乎取代了旧方法:callAction()。虽然它不是静态方法,但我无法使其工作。可能不是正确的方法吗?

我怎样才能在Laravel 4中做到这一点?

7 个答案:

答案 0 :(得分:89)

嘿,你们可以使用IoC ......

试试这个

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

例如:     应用::使( '的HomeController') - > getIndex();

你也可以提供参数

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

答案 1 :(得分:51)

如果我理解正确,您正在尝试构建以API为中心的应用程序,并希望在Web应用程序内部访问API,以避免发出额外的HTTP请求(例如使用cURL)。这是对的吗?

您可以执行以下操作:

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

请注意,您不需要指定控制器@方法目标,而是需要使用通常用于从外部访问API的uri路由。

更好的是,您现在可以指定请求应响应的HTTP谓词。

答案 2 :(得分:10)

就像Neto所说,你可以使用:

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

但是要发送一个带有额外数据的POST,你可以使用" merge"之前的方法:

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

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

对我有用!

再见

答案 3 :(得分: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));
});

答案 4 :(得分:0)

Laurent的解决方案有效(虽然你需要一个领先的/而你传递给$params的{​​{1}}是GET参数,而不是Laravel处理的那些(需要在{{1在示例中)。

我无法相信没有更简单的方法可以做到这一点(不是很难,但它看起来有点像我的hackish)。基本上, Laravel 4不提供使用回调函数将路径映射到控制器的简单方法吗?严重吗?这是世界上最常见的事情......

我必须在我的一个项目中这样做:

Request::create

希望我错过了一些明显的东西。

答案 5 :(得分:0)

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

laravel 5.1

答案 6 :(得分:0)

这是一个老问题。但也许是有用的。还有另一种方式。

在您的控制器中:您可以将该功能声明为公共静态

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

然后在Routes文件或View:

ControllerClassName::functionNAME(params);