38

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

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

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

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

4

7 回答 7

91

您可以使用 IoC。

试试这个:

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

例如:

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

你也可以提供参数:

App::make('HomeController')->getIndex($params);
于 2013-06-29T22:37:11.730 回答
50

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

您可以执行以下操作:

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

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

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

于 2013-03-05T20:16:06.843 回答
10

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

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

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

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

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

这个对我有用!

再见

于 2014-11-25T18:35:27.597 回答
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));
});
于 2013-06-19T04:24:55.927 回答
0

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

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

于 2013-05-10T12:46:36.353 回答
0
$request = Request::create('common_slider', 'GET', $parameters);
return  Controller::getRouter()->dispatch($request)->getContent();

对于 laravel 5.1

于 2015-06-16T10:23:16.040 回答
0

这是一个老问题。但也许有用。有没有别的办法。

在您的控制器中:您可以将函数声明为 public static

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

然后在 Routes 文件或视图中:

ControllerClassName::functionNAME(params);
于 2016-10-25T09:30:51.987 回答