Liaisons vers les routes avec laravel 4

j’ai déjà parlé des liaisons route/controleur; mais si il y a quelque chose de confus avec Laravel ce sont bien les routes. En fait Laravel nous laisse trop de possibilités pour gérer nos routes :

Des appels directs a des méthodes ou fonctions
Des liens vers des contrôleurs
Des liens  vers des contrôleurs de ressources restfull.

Des routes nommées ou non.

Des paramètres obligatoires, optionnels, nommés ou non.

Avec du mal, j’arrive a écrire mes routes, mais faut-il encore les utiliser, tester…

Il est simple de créer un lien vers une route donnée ? Je dirais que non :( Laravel nous donne trop de liberté et nous donne une bibliothèque qui me semble très limite. Donc pour y voir plus clair, je me suis fait quelques tests avec les principales méthodes permettant de créer un lien (html) vers une route Laravel.

Premier point, il existe des fonctions : link_to_route(), route() et  link_to_action(), elles ne sont la que pour me distraire, elles correspondent en gros a URL::route() et URL::action(), donc, je n’ai donc a tester que 3 méthodes du helper URL :
URL::route ( $nomRoute , $params )
URL::action ( $methodeController , $params )
URL::to ( $uri , $params )
Et la, j’espère que ça vous saute aux yeux !


Pour mes tests, j’ai bien sur fait une route :

Route::get('route/{id}/edit',
	array('as'=>'redit', 'uses'=>'RouteController@edit')
);
Route::get('route/{id}/edit/{any?}',
	array('as'=>'pedit', 'uses'=>'RouteController@edit')
);
Route::controller('route','RouteController');

Donc, la si j’ai bien compris, je vais faire des liens vers :
/route/44/edit /route/01/edit[/44]
/route/test/44
/route/

URL::route ( $nomRoute , $params )

echo URL::( ‘redit’, array( 1 ) );

http://www.intranet.local/laravel/public/route/1/edit

echo URL::route( ‘redit’, array( ‘id’=>2 ) );

http://www.intranet.local/laravel/public/route/2/edit

echo URL::route( ‘redit’, array( ‘id’=>2, ‘plus’=>44 ) );

http://www.intranet.local/laravel/public/route/2/edit?plus=44

try{
echo URL::route( ‘redit’, array( ‘plus’=>44 ) );
} catch (Exception $e) {
echo ‘{id} non entré, donc plantage normal ‘.$e->getMessage();
}

{id} non entré, donc plantage normal Some mandatory parameters are missing ("id") to generate a URL for route "redit".

Résultat :

  1. URL::route attend obligatoirement une route nommée en premier paramètre
  2. si paramètre(s) dans la route, il est obligatoire de le renseigner dans $params
  3. le paramètre peut être passé indifféremment sans clé ou avec
  4. si paramètre non présent dans route, il est ajouté a l’url après le charactère ?

URL::action ( $methodeController , $params )

echo URL::action( ‘RouteController@edit’, array( 1 ) );
echo URL::action( ‘RouteController@edit’, array( ‘id’=>2 ) );
echo URL::action( ‘RouteController@edit’, array( ‘plus’=>2 ) );…

Résultat :

  1. URL::action attend obligatoirement une méthode de contrôleur
  2. même utilisation des paramètres que URL::route

URL::to ( $uri , $params )

echo URL::to(‘/route/8/edit’, array(‘id’=>1,’plus’=>44) );
echo  URL::to(‘route/{id}/edit’, array(‘id’=>1,’plus’=>44) );

http://www.intranet.local/laravel/public/route/{id}/edit/1/44

echo URL::to(‘/’, array(‘id’=>2,’plus’=>44) );
echo URL::to(‘/’, array(2,44) );

http://www.intranet.local/laravel/public/2/44

Résultat :

  1. URL::to attend obligatoirement une url
  2. n’ interprète pas les paramètres de l’url (pas une route)
  3. si paramètre(s), il est ajouté dans l’url (pas comme action et route !)
  4. donc rien a voir avec les routes ! juste bon pour indiquer la racine

En fait c’est beaucoup plus simple que je ne le pensais :) une méthode pour les routes nommées, une méthode pour les actions et, la dernière juste bonne pour m’indiquer la racine de mon site puis pour faire des url a la main.

Les paramètres fonctionnent de la même façon avec action() et route(), et la clé n’est pas obligatoire.


Il existe aussi quelques méthodes d’informations :
URL::full() même chose que Request::fullUrl() : url avec tous paramètres ?test=1
URL::current() même chose que Request::url() : url sans params ?test=1

Existe aussi : Route::currentRouteName(); et Route::currentRouteAction(); qui nous indiquent où nous sommes à l’exécution.
pour plus de détails : var_dump(Route::getCurrentRoute( ));

Share Button

Vous devriez aimer...

1 Response

  1. Eric dit :

    Les routes sous laravel au premier abord semble simple, mais très franchement comme tu le dis si bien, le système de route de laravel est très flexible mais les exemples sur la doc qui sont plus en masse n’aident pas vraiment dans le contexte du controller. Déjà que je m’étais sacrément pris la tête avec le système de route de kohana qui est vraiment stupide syntaxiquement parlant, et là je me retrouve avec laravel dont les routes son plus clair mais qui laisse perplexe sur de simple action.

    Dans mon routing qui plus est dans mon bundle (ou package selon la version) je vais me retrouver avec une route de type :
    Route::get(‘(:bundle)/(:any?)’, ‘admin::home@(:1))
    Donc une route bien dynamic avec des paramètres optionnel, et là je veux simplement faire une route nomé en rapport avec un controller et sa méthode. J’ai trouvé cela vraiment chiant et pas intuitif.
    Car la plus part des exemples te montre :
    Route::get(‘/’, function() {
    return « hello »;

    });

    La plus part des exemples te montrent le callback et retourne une vue alors que le routing n’est pas sensé retourner une vue mais une méthode. Donc pas évident et obligé de regarder la class pour voir les méthodes implémenté. J’ai trouvé cela sur la doc vraiment léger et inapproprié en rapport à la plus part des besoins. Que prenne les premiers, second argument etc.. Enfin j’ai pas mal perdu de temps à cause de ça franchement.