2014-05-13 42 views
6

我是laravel的新手,我非常努力地理解如何傳遞多個可選的url參數。Laravel 4:如何傳遞多個可選參數

將3個可選參數傳遞給控制器​​時,對路徑進行編碼的標準方法是什麼?

也有一種方法來編碼路線,以允許命名參數傳遞給控制器​​嗎?

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

感謝所有幫助

+1

ID = 1&頁= 2&選擇= 1是經典,傳遞參數給服務器的老辦法; id/1/page/2/opt/1是新的框架方式。 –

+0

這種技術的名字是安德魯?謝謝 – clarenswd

回答

7

如果您有多個可選參數

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

而且你的控制器內

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

命名參數通常爲航段,但沒有明確的命名完成。因此,例如,你可以Ø是這樣的:

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

$id$page$opt都是可選的位置,通過在段定義?,他們必須在功能默認值的事實來定義,和。然而,你會發現有問題的東西在這裏:

  1. 他們在URL出現在正確的順序
  2. 只有$opt是真正可選的,$page必須如果$opt供應,並$id絕如果$page

這是由Laravel將命名段映射到函數/方法參數的方式帶來的限制。理論上你就可以實現你自己的邏輯來完成這項工作,但是:

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

不,這是一個很天真的解決方案,通過=依靠盲目的爆炸,以及設置任意輸入的變量的名稱(這顯然是要求麻煩)。你應該爲這段代碼添加更多的檢查,但它應該讓你瞭解如何克服上述兩個問題。

應該注意的是,這有點違背了Laravel中路由和URI的「正確方式」,所以除非你真的需要這個功能,否則你應該重新考慮你將這些URI形成爲Laravel框架的設置方式更多。