在Laravel 4中调用控制器

问题描述 投票:38回答:7

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

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

我浏览了L4中的Controller类,发现此方法似乎替代了较早的方法:callAction()。虽然它不是静态方法,但我无法使其正常工作。可能不是正确的方法吗?

如何在Laravel 4中做到这一点?

laravel laravel-4
7个回答
50
投票

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

您可以执行以下操作:

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

注意,除了指定controller @ method的目标,您需要使用通常用于从外部访问API的uri路由。

甚至更好,您现在可以指定请求应响应的HTTP动词。


90
投票

您可以使用IoC。

尝试一下:

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

例如:

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

您也可以给出参数:

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

10
投票

像Neto所说的您可以使用:

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

但是要发送带有额外数据的POST,您可以在之前使用“合并”方法:

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

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

它对我有用!

再见


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
投票

Laurent的解决方案有效(尽管您需要前导/,并且传递给$paramsRequest::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+');

希望我缺少明显的东西。


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

对于laravel 5.1


0
投票

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

在您的控制器中:您可以将函数声明为公共静态

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

然后在“路线”文件或视图中:

ControllerClassName::functionNAME(params);
© www.soinside.com 2019 - 2024. All rights reserved.