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

时间:2015-05-23 16:11:08

标签: php laravel routes

我正在使用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中做到这一点?

感谢您的帮助!

6 个答案:

答案 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');

它会起作用!