Вот документация: 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: Вы можете использовать приведенный выше код и этот учебник , чтобы создать новый тип исключения, чтобы получить желаемое поведение. По крайней мере, я понимаю. 🙂