如果参数不是整数,如何以不同方式定义路径

Mat*_*oli 12 php routes laravel

我正在使用Laravel 5并在我的本地工作.我创建了一个参数为{id}的路由和另一个具有特定名称的路由,如下所示:

Route::get('contacts/{id}', 'ContactController@get_contact');
Route::get('contacts/new', 'ContactController@new_contact');
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果我尝试访问localhost/contacts/new,它将自动访问get_contact方法.我知道我已经创建了一个{id}参数但是如果我只想在我的参数是一个整数时调用get_contact怎么办?如果不是,请检查它是否为"new"并访问new_contact方法.然后,如果它不是整数而不是"新",则错误页面404.

我怎么能在Laravel 5中做到这一点?

谢谢你的帮助!

Lim*_*nte 32

只需添加->where('id', '[0-9]+')到您想要接受仅限数字参数的路线:

Route::get('contacts/{id}', 'ContactController@get_contact')->where('id', '[0-9]+');
Route::get('contacts/new', 'ContactController@new_contact');
Run Code Online (Sandbox Code Playgroud)

阅读更多:http://laravel.com/docs/master/routing#route-parameters


Inu*_*aki 8

也有可能只是切换它们,因为路由文件将从上到下遍历所有行,直到找到有效的路由。

Route::get('contacts/new', 'ContactController@new_contact');
Route::get('contacts/{id}', 'ContactController@get_contact');
Run Code Online (Sandbox Code Playgroud)

如果您想将该路线限制为纯数字,则标记的解决方案是正确的。

只是在这里添加它,我知道它已经很旧了;)


小智 8

一个简单的解决方案是使用显式方法.

Route::get('contacts/{id:[0-9]+}', 'ContactController@get_contact');
Route::get('contacts/new', 'ContactController@new_contact');
Run Code Online (Sandbox Code Playgroud)

  • 这在 Laravel 5.8 中不起作用,显示“此路由不支持 GET 方法。支持的方法:PUT、PATCH。” 错误.... (3认同)

Joh*_*ank 5

尽管可以接受的答案非常好,但是通常一个参数会被多次使用,因此您可能希望通过使用DRY方法bootRouteServiceProvider.php位于app/Providers (Laravel 5.3及更高版本)下的文件中的函数中定义一个模式:

 /**
 * Define your route model bindings, pattern filters, etc.
 *
 * @return void
 */
public function boot()
{
    Route::pattern('id', '[0-9]+');

    parent::boot();
}
Run Code Online (Sandbox Code Playgroud)

这样,无论您{id}在何处使用参数,都将应用约束。