Laravel - 如果模型/行不存在或软删除则显示异常

时间:2015-12-08 10:14:04

标签: php laravel exception laravel-5 laravel-5.1

假设我有一个名为“制造商”的模型,其控制器具有show方法

public function show($id)
{
    $manufacturer = json_decode( $this->manufacturer->find($id) );
    return view('viewManufacturer', compact('manufacturer'));
}

带有find方法的Eloquent-repository

public function find($id)
{
    return Manufacturer::find($id)->toJson();
}

现在,如果模型不存在或软件删除,则会给我一个致命的例外

FatalErrorException in ManufacturerRepository.php line 22:
Call to a member function toJson() on null

如何设置例外,因此它会显示一个自定义错误页面,而不是默认错误页面,例如“找不到制造商”。

修改 嗯,我实际上尝试过,但它返回一个错误。上面提到的查询仅用于演示,实际上我有另一种称为车辆的模型。制造商与Vehicle有一对多的关系。

public function find($id, $columns1 = array('*'), $columns2 = array('*'))
{
    return Manufacturer::with(['vehicles' => function($q) use ($columns2){
           $q->select($columns2);
    }])->get($columns1)->find($id)->toJson();
}

因此,如果我用findOrFail替换find,则会发出错误Call to undefined method Illuminate\Database\Eloquent\Collection::findOrFail()

2 个答案:

答案 0 :(得分:1)

而不是 find()方法调用 findOrFail() - 如果找不到模型,此方法将抛出 ModelNotFoundException ,这将导致您的申请中 404 页。

<强>更新

在你的第二个例子中,替换:

return Manufacturer::with(['vehicles' => function($q) use ($columns2){
  $q->select($columns2);
}])->get($columns1)->find($id)->toJson();

return Manufacturer::with(['vehicles' => function($q) use ($columns2){
  $q->select($columns2);
}])->findOrFail($id, $columns1)->toJson();

答案 1 :(得分:1)

如果您想显示自定义视图而不是404页面。

public function find($id) {
    $manufacturer = Manufacturer::find($id)->first();
    if($manufacturer) {
       return $manufacturer->toJson();
    }
    return false;
}

public function show($id) {        
    $manufacturer = $this->manufacturer->find($id);
    if($manufacturer) {
        $manufacturer = json_decode($manufacturer);
        return view('viewManufacturer', compact('manufacturer'));
     }
     else {
        return view('viewManufacturerNotFound');
     }
}

顺便说一下,为什么使用toJson()然后使用json_decode()

没有json编码/解码:

public function find($id) {
    return Manufacturer::find($id)->first(['column1','column2']);        
}

public function show($id) {        
    $manufacturer = $this->manufacturer->find($id);
    if($manufacturer) {            
        return view('viewManufacturer', compact('manufacturer'));
     }
     else {
        return view('viewManufacturerNotFound');
     }
}