38 votes

Appeler un contrôleur dans 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?

91voto

Neto Points 686

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

50voto

Laurent Van Winckel Points 326

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

Vous pouvez effectuer les opérations suivantes:

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

Notez que, au lieu de spécifier le contrôleur@méthode de destination, vous aurez besoin d'utiliser l'uri de l'itinéraire que vous auriez normalement utiliser pour accéder à l'API externe.

Mieux encore, vous pouvez maintenant spécifier le verbe HTTP la demande doit répondre.

1voto

Gabriel Koerich Points 147

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));
});
 

0voto

Jeto Points 50

Laurent solution fonctionne (si vous avez besoin d'un leader / et de la $params vous passez Request::create sont params, et non pas ceux manipulés par Laravel (il faut le mettre après l' api/items/ dans l'exemple).

Je ne peux pas croire il n'y a pas un moyen plus simple pour faire cela (non pas que c'est dur, mais il semble un peu hackish pour moi). Fondamentalement, Laravel 4 ne fournit pas un moyen facile de la carte, un itinéraire à un contrôleur à l'aide d'une fonction de rappel? Sérieusement? C'est le plus courant dans le monde...

J'ai dû le faire sur 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+');

Espère que je suis absent quelque chose d'évident.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X