如何在Laravel路由中使用可选值?

时间:2014-11-11 08:05:06

标签: php laravel-4 laravel-routing

我有以下路线:

Route::get('users/search/{type?}/{value}', 'Site\UserController@search');

主要思想是简化搜索:

如果存在类型(姓名,姓名,电子邮件等),则仅搜索该字段 如果不是 - 到处搜索。

但是当我这样做时:

http://example.com/users/search/sdgfdfxg 

Laravel抛出

Symfony \ Component \ HttpKernel \ Exception \ NotFoundHttpException 

http://example.com/users/search/name/sdgfdfxg

http://example.com/users/search/surname/sdgfdfxg

一切都很好。

3 个答案:

答案 0 :(得分:1)

Yust定义了2条路线:

Route::get('users/search/{type}/{value}',function($type,$value){
    $app = app();
    $controller = $app->make('Site\UserController');
    $controller->callAction($app, $app['router'], 'search', $parameters = array($type,$value));
});
Route::get('users/search/{value}',function($value){
    $app = app();
    $controller = $app->make('Site\UserController');
    $controller->callAction($app, $app['router'], 'search', $parameters = array(null,$value));
});

但最简单的选择仍然是改变定义参数的顺序。将可选选项设置为url的末尾:

Route::get('users/search/{value}/{type?}','Site\UserController@search');

答案 1 :(得分:0)

您可以注册2条路线。一个有'类型'一个没有处理这两个案件。

Route::get('users/search/{type}/{value}', 'Site\UserController@searchByType');
Route::get('users/search/{value}', 'Site\UserController@search');

答案 2 :(得分:0)

首先,你永远不能在第一个参数中创建一个可选参数。可选参数始终是函数或URL中的最后一个参数。

根据文档,您必须在旁边放一个问号,如下所示:

Route::get('users/search/{value}/{type?}', 'Site\UserController@search');

在您的搜索功能中:

public function search($value, $type = null) {
    // Handle your code here...
}

我知道首先有一个带有值的URL,然后是类型......这似乎很奇怪 如果你对此感到困扰,我建议你使用Peh的答案。