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

更新日期: 2019-02-11 阅读次数: 1008 字数: 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 的实现。

爱评论不评论

近期节日

2019年08月23日 处暑
2019年09月03日 抗日胜利纪念日
2019年09月08日 白露
2019年09月08日 国际扫盲日
2019年09月10日 教师节
2019年09月13日 中秋节
2019年09月16日 国际臭氧层保护日
2019年09月16日 世界清洁地球日
2019年09月18日 "九一八"事变纪念日
2019年09月20日 国际爱牙日
2019年09月21日 国际和平日
2019年09月22日 世界无车日
查看更多节日