I just follow some tutorial and so far what I do is :
my App/Exceptions/Handler.php
<?php
use IlluminateDatabaseEloquentModelNotFoundException;
public function render($request, Exception $e)
{
if ($e instanceof ModelNotFoundException){
abort(404);
}
return parent::render($request, $e);
}
and my UsersController
looks like this :
public function edit($id)
{
$data = User::findOrFail($id);
$roles = Role::where('title', '!=', 'Super Admin')->get();
return View('admin.user.edit', compact(['data', 'roles']));
}
with the above code if I visit http://my.url/users/10/edit
I get NotFoundHttpException in Application.php line 901:
, yes because there is no id 10 in my record, but with User::find($id);
I get normal view without data, since no id 10 in my record.
What I want is show default 404 then redirect to somewhere or return something if record not found with User::findOrFail($id);
? How I can do that ?
Thanks, any help appreciated.
ps: .env APP_DEBUG = true
Advertisement
Answer
This does what you asked. No need for exceptions.
public function edit($id)
{
$data = User::find($id);
if ($data == null) {
// User not found, show 404 or whatever you want to do
// example:
return View('admin.user.notFound', [], 404);
} else {
$roles = Role::where('title', '!=', 'Super Admin')->get();
return View('admin.user.edit', compact(['data', 'roles']));
}
}
Your exception handler is not necessary as it is. Regarding IlluminateDatabaseEloquentModelNotFoundException
:
If the exception is not caught, a 404 HTTP response is automatically sent back to the user, so it is not necessary to write explicit checks to return 404 responses when using [findOrFail()].
Also, I’m pretty sure you get the exception page instead of 404 now because you’re in debug mode.