假设我有一个名为"Manufacturer"的型号,它有一个显示方法的控制器
public function show($id)
{
$manufacturer = json_decode( $this->manufacturer->find($id) );
return view('viewManufacturer', compact('manufacturer'));
}
和一个Eloquent存储库,使用查找方法
public function find($id)
{
return Manufacturer::find($id)->toJson();
}
现在,如果一个模型不存在或被软删除,它会给我一个致命的异常
FatalErrorException in ManufacturerRepository.php line 22:
Call to a member function toJson() on null
我如何设置一个异常,这样它就不会显示默认的错误页面,而是显示一个自定义错误页面,类似于"找不到制造商"。
编辑:我确实试过了,但它返回了一个错误。上面提到的问题只是为了演示,实际上我有另一个型号叫车辆。制造商与车辆有一对多的关系。
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()
不调用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();
如果您想显示自定义视图而不是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');
}
}