Настройка «Не найденного» поведения маршрутизации Laravel «Явное связывание»

Вот документация: https://laravel.com/docs/5.2/routing#route-model-binding

Маршруты:

Route::group(['prefix' => 'u'], function () { Route::post('create', ['as' => 'createUser', 'uses' => 'UserController@create']); Route::get('{uuid}', ['as' => 'userDashboard', 'uses' => 'UserController@dashboard']); }); 

UserController.php:

 public function dashboard(User $uuid) { return View::make('user.dashboard'); } 

Всякий раз, когда Пользователь не найден в базе данных, он выдает следующие два исключения:

 2/2 NotFoundHttpException in Handler.php line 103: No query results for model [App\User]. 1/2 ModelNotFoundException in Builder.php line 303: No query results for model [App\User]. 

Как настроить ошибку? Я хочу перенаправить маршрут createUser . Документация инструктирует передать Closure в качестве третьего аргумента, но я не знаю, как это сделать с моим текущим кодом.

ИЗМЕНИТЬ 1

Это то, что я пробовал до сих пор без успеха:

  Route::model('{uuid}', ['as' => 'userDashboard', 'uses' => 'UserController@dashboard'], function () { App::abort(403, 'Test.'); }); Route::get('{uuid}', ['as' => 'userDashboard', 'uses' => 'UserController@dashboard'], function () { App::abort(403, 'Test.'); }); 

для аналогичного случая я взял родительскую функцию Illuminate\Foundation\Exceptions\Handler isHttpException и скопировал ее в app/Exceptions/Handler.php и изменил ее имя на мое isUserNotFoundException .

 protected function isUserNotFoundException(Exception $e) { return $e instanceof UserNotFoundException; } 

и чем в функции рендеринга добавить

  if ($this->isUserNotFoundException($e)) return redirect('path')->with('error',"Your error message goes here"); 

Следующий код должен быть помещен в ваш метод RouteServiceProvider :: boot

 $router->model('uuid', 'App\User', function () { throw new UserNotFoundException; 

});

и обязательно включите это в свой файл просмотра

и это сообщение форума могло бы помочь вам

 https://scotch.io/tutorials/creating-a-laravel-404-page-using-custom-exception-handlers 

Это на самом деле очень просто. Поскольку ни один из ответов не дает определенного ответа, я сам отвечаю.

В файле boot функции файла RouteServiceController.php добавьте следующее:

  $router->model('advertiser', 'App\Advertiser', function () { throw new AdvertiserNotFoundException; }); 

Затем создайте новый пустой класс в App\Exceptions (в данном случае) AdvertiserNotFoundException.php :

 <?php namespace App\Exceptions; use Exception; class AdvertiserNotFoundException extends Exception { } 

Последнее, что нужно сделать, это поймать исключение в функции Handler.php ( App\Exception ) следующим образом:

 public function render($request, Exception $e) { switch ($e) { case ($e instanceof AdvertiserNotFoundException): //Implement your behavior here (redirect, etc...) } return parent::render($request, $e); } 

Это оно! 🙂

Для этого вам нужно проверить, существует ли идентификатор в модели:

 public function dashboard(User $uuid) { if(User::find($uuid)) { return View::make('user.dashboard'); } else { redirect('xyz'); } } 

Я думаю, что этот учебник будет полезен для вас Laravel Model Binding

Вы можете добавить исключение и обработать его в app/Exceptions/Handler.php

 /** * Render an exception into an HTTP response. * * @param \Illuminate\Http\Request $request * @param \Exception $e * @return \Illuminate\Http\Response */ public function render($request, Exception $e) { if (!env('APP_DEBUG')) { if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) { //treat error return response()->view('errors.404'); } return parent::render($request, $e); } 

Редактирование 1: Этот фрагмент кода выполнен из рабочего проекта, поэтому, если он не работает, он должен иметь ошибку где-то в другом месте:

 if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) { $data= \App\Data::orderBy('order', 'asc')->get(); return response()->view('errors.404', [ 'data' => $data ], 404); } 

Изменить 2: Вы можете использовать приведенный выше код и этот учебник , чтобы создать новый тип исключения, чтобы получить желаемое поведение. По крайней мере, я понимаю. 🙂