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
也有可能只是切换它们,因为路由文件将从上到下遍历所有行,直到找到有效的路由。
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)
尽管可以接受的答案非常好,但是通常一个参数会被多次使用,因此您可能希望通过使用DRY方法boot在RouteServiceProvider.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}在何处使用参数,都将应用约束。
| 归档时间: |
|
| 查看次数: |
9223 次 |
| 最近记录: |