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

更新日期: 2019-02-11 阅读次数: 154 字数: 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年02月24日 第三世界青年日
2019年02月28日 世界居住条件调查日
2019年03月01日 国际海豹日
2019年03月03日 全国爱耳日
2019年03月05日 学雷锋日
2019年03月06日 惊蛰
2019年03月08日 三八妇女节
2019年03月08日 龙抬头
2019年03月12日 植树节
2019年03月14日 白色情人节
2019年03月15日 消费者权益日
2019年03月17日 国际航海日
查看更多节日