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

更新日期: 2019-02-11 阅读次数: 4874 字数: 203 分类: Laravel

早上看到几个 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 聊聊, 查看更多联系方式