findOrFail / firstOrFail 规避搜索引擎爬虫抓取已删除数据时报错

文章目录

    早上看到几个 Laravel 的网站项目报同一个错误

    ERROR: Creating default object from empty value {"userId":5,"exception":"[object] (ErrorException(code: 0): Creating default object from empty value at app/Http/Controllers/ProductController.php:15)
    

    从 Nginx 日志看,错误是因为搜素引擎的爬虫,抓取了一个不存在的商品链接,例如
    https://www.sunzhongwei.com/product?id=1024

    而这个商品 ID 并不存在。

    public function detail(Request $request, $product_id)
    {
        $item = Product::find($product_id);    // 返回 NULL
        $item->view_count += 1;		// 报错:Creating default object from empty value
        $item->timestamps = false;
        $item->save();
    
        return view('detail', [
            "item" => $item,
        ]);
    }
    

    合理的做法应该是,直接返回 404。

    Laravel 内置的 findOrFail 可以一行代码实现这个功能。

    $item = Product::findOrFail($product_id);
    

    这样,在对不存在的 model 对象进行操作时,就会直接返回 404 页面。

    对应的,first 函数,也有 firstOrFail 的实现。

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式