以下是文档: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.');
});
答案 0 :(得分:2)
这实际上非常简单。由于没有一个答案确实给出了明确的答案,我自己也在回答。
在文件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
{
}
最后要做的是在Handler.php
render
函数(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);
}
那就是它! :)
答案 1 :(得分: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 :: boot方法
中$router->model('uuid', 'App\User', function () {
throw new UserNotFoundException;
});
并确保将其包含在您的视图文件中
此论坛帖子可能会帮助您
https://scotch.io/tutorials/creating-a-laravel-404-page-using-custom-exception-handlers
答案 2 :(得分:0)
为此,您需要检查模型中是否存在ID,如下所示:
public function dashboard(User $uuid)
{
if(User::find($uuid))
{
return View::make('user.dashboard');
} else {
redirect('xyz');
}
}
答案 3 :(得分: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);
}
编辑1: 这段代码来自一个工作项目,所以如果这不起作用,它必须在其他地方出错:
if ($e instanceof \Illuminate\Database\Eloquent\ModelNotFoundException) {
$data= \App\Data::orderBy('order', 'asc')->get();
return response()->view('errors.404', [
'data' => $data
], 404);
}
编辑2: 您可以使用上面的代码和this tutorial来创建新的Exception类型,以便获得所需的行为。至少对我的理解。 :)
答案 4 :(得分:0)
我认为本教程对您有用[{3}}