2014-05-13 4 views
6

Je suis nouveau à laravel et j'ai vraiment du mal à comprendre comment passer plusieurs paramètres url optionnels.Laravel 4: Comment passer plusieurs paramètres optionnels

Quelle est la manière standard de coder les routes lors de la transmission de 3 paramètres optionnels au contrôleur?

Existe-t-il un moyen de coder un itinéraire pour permettre le passage de paramètres nommés au contrôleur?

tels que

public/test/id=1&page=2&opt=1 
or 
public/test/id=1/page=2/opt=1 

Merci pour toute aide

+1

id = 1 & page = 2 & opt = 1 est le classique, ancienne façon de transmettre les paramètres au serveur; id/1/page/2/opt/1 est la nouvelle façon de procéder. –

+0

Comment s'appelle cette technique Andrew? Merci – clarenswd

Répondre

7

Si vous avez plusieurs paramètres optionnels

Route::get('test',array('as'=>'test','uses'=>'[email protected]')); 

Et à l'intérieur de votre contrôleur

class HomeController extends BaseController { 
    public function index() 
    { 
     // for example public/test/id=1&page=2&opt=1 
     if(Input::has('id')) 
      echo Input::get('id'); // print 1 
     if(Input::has('page')) 
      echo Input::get('page'); // print 2 
     //... 
    } 
} 
6

Les paramètres nommés sont généralement effectués sous forme de segments de route, mais sans nommer explicitement. Ainsi, par exemple, vous pouvez o quelque chose comme ceci:

Route:get('test/{id?}/{page?}/{opt?}', function ($id = null, $page = null, $opt = null) { 
    // do something 
}); 

$id, $page et $opt sont tous facultatifs ici tels que définis par le ? dans les définitions de segment, et le fait qu'ils ont des valeurs par défaut dans la fonction. Cependant, vous remarquerez qu'il ya quelque chose d'un problème ici:

  1. Ils doivent apparaître dans l'URL dans l'ordre
  2. seulement $opt est vraiment facultative, $page doit être fourni si $opt est, et $id doit être si $page est

Ceci est une limitation provoquée par la façon dont les cartes Laravel segments appelés à fonctionner/paramètres de la méthode. Vous pourriez théoriquement mettre en œuvre votre propre logique pour faire ce travail, cependant:

Route:get('test/{first?}/{second?}/{third?}', function ($first = null, $second = null, $third = null) { 
    if ($first) { 
     list($name, $value) = @explode('=', $first, 2); 
     $$name = $value; 
    } 
    if ($second) { 
     list($name, $value) = @explode('=', $second, 2); 
     $$name = $value; 
    } 
    if ($third) { 
     list($name, $value) = @explode('=', $third, 2); 
     $$name = $value; 
    } 

    // you should now have $id, $page and $opt defined if they were specified in the segments 
}); 

Non que ce soit une solution très naïve, en se fondant sur Exploding aveugle par = ainsi que la définition du nom d'une variable arbitrairement entrée (qui est évidemment demander des ennuis). Vous devriez ajouter plus de vérification à ce code, mais cela devrait vous donner une idée de la façon de surmonter les deux problèmes mentionnés ci-dessus.

Il devrait probablement noter que cela va un peu contre la « bonne façon » de faire du routage et URIs Laravel, donc à moins que vous vraiment besoin de cette fonctionnalité, vous devez repenser la façon dont vous formez ces URIs à un manière que le cadre Laravel est plus mis en place pour.