2014-05-13 2 views
6

Sono nuovo in laravel e sto davvero cercando di capire come passare più parametri URL facoltativi.Laravel 4: Come passare più parametri facoltativi

Qual è il modo standard per codificare i percorsi quando si passano 3 parametri opzionali al controller?

È inoltre possibile codificare un percorso per consentire il passaggio dei parametri denominati al controller?

quali

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

Grazie per qualsiasi aiuto

+1

id = 1 & page = 2 & opt = 1 è il classico, vecchio modo di trasmettere parametri al server; id/1/page/2/opt/1 è la nuova modalità framework. –

+0

Qual è il nome di questa tecnica Andrew? Grazie – clarenswd

risposta

7

Se si dispone di più parametri opzionali

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

e dentro il Controller

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

parametri Named si realizza come segmenti del percorso ma senza denominazione esplicita. Così, per esempio si potrebbe o qualcosa di simile:

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

$id, $page e $opt sono tutti opzionali qui come definito dal ? nelle definizioni di segmento, e il fatto che essi hanno valori di default nella funzione. Tuttavia, si noterà che c'è qualcosa di un problema qui:

  1. Devono comparire nella URL nell'ordine corretto
  2. Solo $opt è veramente opzionale, $page devono essere forniti se $opt è, e $id mosto essere se $page è

Questa è una limitazione causata dal modo in cui laravel associa i segmenti denominati operato/parametri del metodo. Si potrebbe teoricamente implementare la propria logica per fare questo lavoro, però:

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 che questa è una soluzione molto ingenuo, basandosi su Esplodere cieco = così come l'impostazione del nome di una variabile arbitrariamente-immesso (che è ovviamente in cerca di guai). Dovresti aggiungere più controllo a questo codice, ma dovrebbe darti un'idea di come superare i due problemi menzionati sopra.

Si dovrebbe probabilmente notato che questo è un pò andare contro il 'modo giusto' per fare il routing e URI in laravel, quindi a meno che davvero bisogno di questa funzionalità, si dovrebbe ripensare il modo in cui si stanno formando questi URI ad un in modo che il framework Laravel sia più predisposto per.