假设我有一个名为“制造商”的模型,其控制器具有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()
答案 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');
}
}