【问题标题】:Laravel: Catch all nonexistent pagesLaravel:捕获所有不存在的页面
【发布时间】:2018-10-09 18:14:53
【问题描述】:

我想为所有不存在的页面创建一个 404 页面。 例如我有这个代码

public function category($category)
    {
        $category = Category::find($category);
        if($category === null) return abort(404); // return 404 page with 404 header status error
        return view('pages.category', compact('category'));
    }

我的路线文件

Route::get('/category/{category}', 'CategoryController@category');

我还有其他组件,例如子类别、文章、评论等。在第一种情况下,我可以输入 app/category/1234
如果我的应用在类别表中没有 id = 1234 的类别,那么不检查 variable === null 我可以获得一个默认但为空的页面,它将具有 200 http 状态。这不正常。

我可以检查所有组件中的 null,但我认为它不正确。

还有一个关于 SQL 错误的问题。 “id”字段具有整数类型,如果我在浏览器中转到 app/category/1sdsds 我会得到

SQLSTATE[22P02]:文本表示无效:7 错误:整数输入语法无效

我该如何解决?

谢谢!

【问题讨论】:

  • 不幸的是,检查 NULL 是在错误破坏其他任何东西之前捕获错误的唯一方法。有一种方法可以创建自定义 404 页面,只需在 resources/assets/views/errors/404.blade.php 创建一个页面。您也可以使用findOrFail,如果发现错误,将调用 404。这是一种捷径。
  • @DimitriMostrey,谢谢。

标签: sql laravel postgresql laravel-5 eloquent


【解决方案1】:

让 Laravel 知道你只接受整数

Route::get('/category/{category}', 'CategoryController@category')->where('category', '[0-9]+');

对于控制器

public function category(Category $category){...}

如果没有找到它应该返回 404 页面。您不需要其他检查,也不需要分配 $category,它已经被分配了。

另一种方法是

public function category($category){
    $category = Category::firstOrFail($category);
}

【讨论】:

  • 我使用findOrFail($category) 而不是firstOrfail($category)。非常感谢!它现在正在工作。
  • 顺便说一下,您在上面的代码中有一点印刷错误。不是[0-9+],应该是[0-9]+。当我的新类别的 id 超过 10 时,我发现了这一点。
猜你喜欢
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 2021-08-13
  • 2014-01-29
  • 2011-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多