38

In Laravel 3, you could call a controller using the Controller::call method, like so:

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

I looked through the Controller class in L4 and found this method which seems to replace the older method: callAction(). Though it isn't a static method and I couldn't get it to work. Probably not the right way to do it?

How can I do this in 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 中心のアプリケーションを構築しようとしており、追加の HTTP リクエスト (cURL など) を作成しないように、Web アプリケーションの内部で API にアクセスしたいと考えています。あれは正しいですか?

次のことができます。

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

controller@method 宛先を指定する代わりに、外部から API にアクセスするために通常使用する uri ルートを使用する必要があることに注意してください。

さらに良いことに、リクエストが応答する HTTP 動詞を指定できるようになりました。

于 2013-03-05T20:16:06.843 に答える
10

ネトが言ったように、次を使用できます:

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 は、コールバック関数を使用してルートをコントローラーにマップする簡単な方法を提供していませんか? 真剣に?これは世界で最も一般的なことです...

私は私のプロジェクトの1つでこれをしなければなりませんでした:

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

それは古い質問です。しかし、多分便利です。別の方法はありますか。

コントローラーで: 関数を public static として宣言できます。

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

次に、Routes ファイルまたはビューで:

ControllerClassName::functionNAME(params);
于 2016-10-25T09:30:51.987 に答える
0
$request = Request::create('common_slider', 'GET', $parameters);
return  Controller::getRouter()->dispatch($request)->getContent();

laravel5.1の場合

于 2015-06-16T10:23:16.040 に答える