呼叫Laravel 4中的控制器

呼叫Laravel 4中的控制器,laravel,laravel-4,Laravel,Laravel 4,在Laravel3中,可以使用controller::call方法调用控制器,如下所示: Controller::call('api。items@index“,$params) 我查看了L4中的控制器类,发现这个方法似乎取代了旧方法:callAction()。虽然这不是一个静态的方法,我不能让它工作。可能不是正确的方法 在Laravel 4中如何实现这一点?如果我理解正确,您正试图构建一个以API为中心的应用程序,并希望在web应用程序中内部访问API,以避免发出额外的HTTP请求(例如,使用c

在Laravel3中,可以使用controller::call方法调用控制器,如下所示:

Controller::call('api。items@index“,$params)

我查看了L4中的控制器类,发现这个方法似乎取代了旧方法:callAction()。虽然这不是一个静态的方法,我不能让它工作。可能不是正确的方法


在Laravel 4中如何实现这一点?

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

您可以执行以下操作:

$request = Request::create('api/items', 'GET', $params);
return Route::dispatch($request)->getContent();
请注意,不是指定controller@method目的地,您将需要使用通常用于从外部访问API的uri路由

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

Laurent的解决方案可以工作(尽管您需要一个前导的
/
,传递给
request::create
$params
是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+');

希望我遗漏了一些明显的东西。

这不是最好的方法,但您可以创建一个函数来实现这一点:

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));
});
你可以使用国际奥委会

试试这个:

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

您还可以给params:

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

正如Neto所说,您可以:

App::make('HomeController')->getIndex($params);
但是,例如,要发送包含额外数据的帖子,您可以在以下情况之前使用“合并”方法:

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

return App:make('HomeController')->someMethodInController();
这对我有用

再见


对于Laravel5.1来说,这是一个老问题。但也许是有用的。还有其他方法吗

在控制器中:您可以将函数声明为publicstatic

public static function functioNAME(params)
{
    ....
}
然后在Routes文件或视图中:

ControllerClassName::functionNAME(params);

看起来你应该使用。你在用
{rest}
占位符做什么?资源控制器确实应该做这项工作(昨天刚开始使用L4,还没有学到所有的新东西),但我希望有一种更“可定制”的方式来处理事情,以防万一。我想使用Request::create并没有那么糟糕。(
{rest?}
这样就可以在标题中的ID后面添加内容,以获得更友好的URL。)无论如何,谢谢!Gabriel Koerich这太棒了!但唯一的问题是Route::currentRouteAction()如果我需要这些信息,你能给我你的输入吗?我创建了一个问题,你能在参数中传递一个“名称”和这个路由的操作吗?这对我不起作用-laravel 4.2,原型是
callAction($method,$parameters)
,因此您不需要包含
$app
。此外,callAction将参数作为参数传递,而不是将其设置为输入值。在我回答此问题时,该方法还需要应用程序和路由器的实例。它为什么要将其作为输入值发送?它不是发送http请求,只是调用一个方法。Anyway、 您不应该使用此方法调用控制器。在这种方法中,不调用任何筛选器。这取决于您需要什么。对于具有类似
/{slug}的路由的情况
它可能是一个产品或页面,您想调用一个函数来检查数据库中的slug,然后调用相应的控制器。这对我不起作用。我得到
Symfony\Component\HttpKernel\Exception\NotFoundHttpException
错误,它说找不到的URL不是
api/items
,而是ra正在进行该调用的控制器。知道它在L4中被更改为什么吗。*?如何将参数作为get请求传递?如果在数组中传递,则无法在方法中访问参数?有关如何使用Input::get和最新版本的PHP,
App::make(\Path\to\controller::class)->方法($param1,[$param2]);
让您的IDE知道您在做什么,并允许更容易的重构,同时看起来更干净(我讨厌Laravel代码中到处都是字符串)
public static function functioNAME(params)
{
    ....
}
ControllerClassName::functionNAME(params);