2016-07-23 4 views
0

Вот документация: https://laravel.com/docs/5.2/routing#route-model-bindingПользовательская настройка "Not Found" Поведение маршрутизации Laravel в "Явное Binding"

Маршруты:

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

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 в качестве третьего аргумента, но я не знаю, как это сделать с моим текущим кодом.

EDIT 1

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

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

    Route::get('{uuid}', ['as' => 'userDashboard', 'uses' => '[email protected]'], function() { 
     App::abort(403, 'Test.'); 
    }); 
+0

Вы находитесь в режиме отладки? здесь документы: https://laravel.com/docs/5.2/errors#custom-http-error-pages – ClearBoth

+0

@ClearBoth Да. Я хочу сделать перенаправление на другую страницу вместо того, чтобы показывать ошибку. – RektByAyyLMAO

ответ

1

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

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

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

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

<?php 

namespace App\Exceptions; 

use Exception; 

class AdvertiserNotFoundException extends Exception 
{ 

} 

Последнее, что do - это исключение в функции Handler.phprender (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); 
} 

Вот и все! :)

0

Чтобы сделать это, вам нужно проверить, если идентификатор существует в модели, как так:

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

Он даже не запускает функцию, если переданный аргумент не найден в таблице базы данных указанной модели ('User'). – RektByAyyLMAO

+0

hmmm .. Я вижу, что лучший способ - это использовать промежуточное ПО. – ClearBoth

0

Вы можете добавить исключение и лечить в 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); 
} 

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

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

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

+0

Как настроить различные ошибки для разных моделей/маршрутов? В этом случае я хочу перенаправить на страницу создания пользователя, но в другой реализации я мог бы перенаправить на другую страницу. Ваш метод будет применять одно и то же правило для каждого 'ModelNotFoundException'. – RektByAyyLMAO

0

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

+0

Это показывает почти то же самое, что и документация. [Это] (https://mattstauffer.co/blog/implicit-model-binding-in-laravel-5-2#custom-exceptions-for-route-model-binding) является той частью, которая мне интересна, но может 't выяснить, как использовать его с контроллерами. Я передаю третий аргумент, но он ничего не делает. – RektByAyyLMAO

1

для подобного случая я сделал, я взял функцию родительского 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 :: загрузочном

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

});

и убедитесь, чтобы включить это в файл представления

и этот пост на форуме, возможно, поможет вам

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

Спасибо. Как вы сделали работу '-> with()' (flash session)? Я пробовал все, и он просто не работает. – RektByAyyLMAO

+0

, пожалуйста, проверьте измененную строку для перенаправления, и да обязательно включите '{{session (' error ')}} ошибка в шаблоне клинка –

+0

Я не могу сделать работу флеш-сессии, пожалуйста, проверьте мой другой вопрос, если вы быть таким добрым: [здесь] (http://stackoverflow.com/questions/38553083/laravel-5-2-flash-session-not-working) – RektByAyyLMAO

Смежные вопросы