我正在使用Laravel 5并在我的本地工作。 我创建了一个参数为{id}的路由和另一个具有特定名称的路由,如下所示:
Route::get('contacts/{id}', 'ContactController@get_contact');
Route::get('contacts/new', 'ContactController@new_contact');
我的问题是,如果我尝试访问localhost / contacts / new,它将自动访问get_contact方法。我知道我已经创建了一个{id}参数但是如果我只想在我的参数是一个整数时调用get_contact怎么办?如果不是,请检查它是否为“new”并访问new_contact方法。然后,如果它不是整数而不是“新”,则错误页面404.
我怎样才能在Laravel 5中做到这一点?
感谢您的帮助!
答案 0 :(得分:28)
只需将->where('id', '[0-9]+')
添加到您要接受仅限数字参数的路线:
Route::get('contacts/{id}', 'ContactController@get_contact')->where('id', '[0-9]+');
Route::get('contacts/new', 'ContactController@new_contact');
了解详情:http://laravel.com/docs/master/routing#route-parameters
答案 1 :(得分:8)
一个简单的解决方案是使用明确的方法。
Route::get('contacts/{id:[0-9]+}', 'ContactController@get_contact');
Route::get('contacts/new', 'ContactController@new_contact');
答案 2 :(得分:3)
还有可能只是切换它们,因为路径文件将从上到下遍历所有行,直到找到有效路径。
@Test
public void observableOnErrorResumeException() {
Integer[] numbers = {0, 1, 2, 3, 4, 5};
Observable.from(numbers)
.doOnNext(number -> {
if (number > 3) {
try {
throw new IllegalArgumentException();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
})
.onErrorResumeNext(t -> Observable.just(666))
.subscribe(System.out::println);
}
如果您想将该路线限制为纯数字,则标记的解决方案是正确的。
在这里添加它,我知道它已经很老了;)
答案 3 :(得分:3)
尽管接受的答案非常好,但是通常会多次使用参数,因此您可能希望通过在位于boot
文件中的RouteServiceProvider.php
函数中定义模式来使用DRY方法在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();
}
通过这种方式,无论您使用{id}
参数如何,约束都适用。
答案 4 :(得分:0)
创建您自己的请求并添加验证规则。此外,将此请求用作控制器方法的参数
import Test from 'button-publishing'
function HomePage() {
return <Test/>
}
export default HomePage
答案 5 :(得分:0)
只需改变行的顺序
Route::get('contacts/new', 'ContactController@new_contact');
Route::get('contacts/{id}', 'ContactController@get_contact');
它会起作用!