Lets say i have a model called "Manufacturer" with a controller which has a show method
public function show($id)
{
$manufacturer = json_decode( $this->manufacturer->find($id) );
return view('viewManufacturer', compact('manufacturer'));
}
And a Eloquent-repository with a find method
public function find($id)
{
return Manufacturer::find($id)->toJson();
}
Now if a model doesn't exist or is softdeleted it gives me a fatal exception
FatalErrorException in ManufacturerRepository.php line 22:
Call to a member function toJson() on null
How do i set an exception, so instead of the default error page it shows a custom error page with something like, "Manufacturer not found".
EDIT: Well i actually tried that, but it returns an error. The above mentioned query was just for demonstration, in actual i have another model called vehicle. And Manufacturer has one to many relationship with 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();
}
So if i replace find with findOrFail it spits an error saying Call to undefined method Illuminate\Database\Eloquent\Collection::findOrFail()
Instead of find() method call findOrFail() - if the model is not found this method will throw ModelNotFoundException which should result in 404 page in your application.
UPDATE:
In your second example replace:
return Manufacturer::with(['vehicles' => function($q) use ($columns2){
$q->select($columns2);
}])->get($columns1)->find($id)->toJson();
with
return Manufacturer::with(['vehicles' => function($q) use ($columns2){
$q->select($columns2);
}])->findOrFail($id, $columns1)->toJson();
If you want to show custom view instead of 404 page.
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');
}
}
Btw, why do you use toJson()
and then json_decode()
?
Without json encoding/decoding:
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');
}
}