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?
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.
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);
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
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));
});
$request = Request::create('common_slider', 'GET', $parameters);
return Controller::getRouter()->dispatch($request)->getContent();
Pour laravel 5.1
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);
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.