web-dev-qa-db-fra.com

Appeler un contrôleur en Laravel 4

Dans Laravel 3, vous pouvez appeler un contrôleur à l'aide de la méthode Controller :: call, comme suit:

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

J'ai regardé à travers la classe Controller dans L4 et trouvé cette méthode qui semble remplacer l'ancienne méthode: callAction (). Bien que ce ne soit pas une méthode statique et que je ne pouvais pas la faire fonctionner. Probablement pas la bonne façon de le faire?

Comment puis-je faire cela dans Laravel 4?

38
Thomas Clackston

Si je comprends bien, vous essayez de créer une application centrée sur l'API et souhaitez accéder à l'API en interne dans votre application Web pour éviter de créer une requête HTTP supplémentaire (par exemple avec cURL). Est-ce exact?

Vous pouvez faire ce qui suit:

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

Notez qu'au lieu de spécifier la destination de la méthode controller @, vous devez utiliser la route uri que vous utiliseriez normalement pour accéder à l'API en externe.

Mieux encore, vous pouvez maintenant spécifier le verbe HTTP auquel la requête doit répondre.

50

Hé les gars, vous pouvez utiliser IoC ...

essaye ça

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

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

et vous pouvez aussi donner des params

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

Comme Neto a dit, vous pouvez utiliser:

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

Mais pour envoyer par exemple un POST avec des données supplémentaires, vous pouvez utiliser la méthode "fusion" avant:

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

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

Ça marche pour moi!

au revoir

9
dani24

Ce n'est pas la meilleure façon, mais vous pouvez créer une fonction pour le faire:

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));
});
1
Gabriel Koerich
$request = Request::create('common_slider', 'GET', $parameters);
return  Controller::getRouter()->dispatch($request)->getContent();

Pour laravel 5.1

0
PHP Connect

C'est une vieille question. Mais peut-être est utile. Y a-t-il un autre moyen?.

Dans votre contrôleur: Vous pouvez déclarer la fonction en tant que public statique

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

Et ensuite dans le fichier Routes ou dans la vue:

ControllerClassName::functionNAME(params);
0
rebduvid

La solution de Laurent fonctionne (bien que vous ayez besoin d'un / principal et du $params que vous passez à Request::create sont des paramètres GET, et non ceux gérés par Laravel (il faut les mettre après api/items/ dans l'exemple). 

Je ne peux pas croire qu'il n'y ait pas de moyen plus facile de faire cela (pas que c'est dur, mais ça me semble un peu ridicule). En gros, Laravel 4 ne fournit pas un moyen facile de mapper un itinéraire sur un contrôleur en utilisant une fonction de rappel? Sérieusement? C'est la chose la plus commune dans le monde ...

Je devais le faire sur l'un de mes projets:

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+');

J'espère que je manque quelque chose d'évident.

0
Jeto