【问题标题】:Laravel route when where condition is false条件为假时的 Laravel 路由
【发布时间】:2020-07-30 21:40:02
【问题描述】:

我有下一个代码:

Route::get('/{lang}/user/sort-by-{class}', function ($lang,$class) {
        return view('users.list',compact("lang","class"));
})->where('class', '[a-z]+');

Route::get('/{lang}/user/{user}', function ($lang,$user) {
        return view('users.user',compact("lang","user"));
});

当 where 条件为 false 时,当 sort-by- 是例如数字时,如何将其直接发送到 404?问题是它以用户身份进入二级路由。

例如:

/en/user/sort-by-name 没问题

/en/user/sort-by-4446 必须显示 404 页面

我知道我可以在他们之间做另一条路线

Route::get('/{lang}/user/sort-by-{class}', function ($lang,$class) {
        return \Response::view('errors.404',array(),404);
})->where('class', '.*');

但这看起来很丑,我想同一句话

【问题讨论】:

  • 为什么你使用其他路由来显示错误?我认为如果您的路线与 where() 条件不匹配,它将自动通过 404 页面。您只需在资源目录中创建“错误”文件夹,然后在该文件夹中创建 404.blade.file。
  • 问题是我有另一个有效的路由器之后:Route::get('/{lang}/user/{user}', function ($lang,$user) .. then它进入......我会更好地解释它,谢谢。
  • 我已经更好地编辑和评论了它。
  • 我认为您应该更改user 的路线,例如Route::get('/{lang}/user/user_{user}'
  • [^a-z]+ 与正则表达式相反。

标签: php laravel routes


【解决方案1】:

基本上,你可以这样做

Route::get('/{lang}/user/sort-by-{class}', function ($lang,$class) {
    if (is_numeric($class)) {
        abort(404, 'Your reason');
    }
    return view('heros.list',compact("lang","class"));
});

不过,在路由中使用闭包是一种不好的做法,因为它们不能在生产模式下序列化。这就是为什么您应该使用控制器来返回您的视图,并为此路由分配一个中间件,该中间件将检查您的class 并在需要时中止请求。

【讨论】:

  • 这行不通,因为 where 是正则表达式,它只会检查字符
  • 好吧,数字只是一个例子,它可以是符号或任何其他东西..我只是想要与常规表达式相反的...,我知道我可以在路线内使用php,但这不是想法:(
  • 我在 1 条路线上为您提供了 2 个解决方法,我不知道您还想要什么
猜你喜欢
  • 2020-08-23
  • 2021-09-30
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
相关资源
最近更新 更多