简体   繁体   中英

Laravel 5.4: Custom view for route-model-binding not finding the ID

As I'm beggining with Laravel, this should be a simple one: How can I define a custom view to be rendered when my route model binding just can't find the given ID?

Here's my route:

Route::get('/empresa/edit/{empresa}', 'EmpresaController@edit');

Here's my controller's method:

public function edit(Empresa $empresa)
{
    if ((!isset($empresa)) || ($empresa == null)):
        //I get that this won't work...
        return 'Empresa não encontrada';
    endif;

    return view('Empresa.dadosEmpresa')->with('empresa', $empresa)->with('action', URL::route('empresa_update', ['id', $empresa->id]))->with('method', 'PATCH');
}

Here's my "attempt" to use an error handler:

public function render($request, Exception $exception)
{
    if ($e instanceof ModelNotFoundException)
    {
        //this is just giving me a completely blank response page
        return 'Empresa não encontrada';
    }
    return parent::render($request, $exception);
}

How is this really done?

1. The formal way (but would it be really needed to customize in this way?)

First of all, what Laravel does is, if there is not Model Row in DB with the given id, it sends 404 response, automatically.

If a matching model instance is not found in the database, a 404 HTTP response will be automatically generated.

So if you wanna show your customized view, you need to customize error handling. So in RouteServiceProvider file, make sure it throws custom exception using 3rd param like follwoing:

public function boot()
{
    parent::boot();

    Route::model('empresa', App\Empresa::class, function () {
        throw new NotFoundEmpresaModelException;
    });
}

And then do same thing in the render function as you tried before.

2. The casual way - Pretty easy to go

I d rather suggest that you do not use model injection ability, but handle the request yourself. So take the empresa id value as it is, and then try to find the right data, and if not found, then make your custom logic. That should be pretty easy to go.

public function edit(Request $request, $empresa)
{
    $empresaObj = Empresa::find($empresa);
    if (!$empresa) {
      return 'Empresa não encontrada';
    }

    return view('Empresa.dadosEmpresa')->with('empresa', $empresa)->with('action', URL::route('empresa_update', ['id', $empresa->id]))->with('method', 'PATCH');
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM