使用 Laravel 4 资源控制器时如何处理页面未找到错误
How do I handle page not found error when using Laravel 4 Resource Controller
我有通往控制器的这条足智多谋的路线
Route::resource ('users', 'UsersController');
UsersController 拥有资源控制器处理的所有操作
Verb Path Action RouteName
--------------------------------------------------------------------------
GET /users index users.index
GET /users/create create users.create
POST /users store users.store
GET /users /{id} show users.show
GET /users {id}/edit edit users.edit
PUT/PATCH /users /{id} update users.update
DELETE /users /{id} destroy users.destroy
我的问题和问题涉及 show($id)
操作,处理以下情况的最佳方法是什么,例如用户请求:
http://example.com/users/anyunexpectedinput
而show action的方法是这样的
public function show($id)
{
$user = User::find($id);
//should I do this
If(!is_object($user)) App::abort(404, 'Page not found');
//OR
//Return a view with message “user not found”
}
Nb:我还在学习Laravel,所以如果不清楚,请接受我的歉意。
IMO 最好的方法是抛出 404 错误 (NotFoundHttpException
)。为什么?例如 here 如果具有指定 ID 的用户不存在,它将抛出 404 错误。
Note: If a matching model instance is not found in the database, a 404 error will be thrown.
我总是抛出 (404) 异常。专业人士:
- 您可以使用
catch
或 App::abort
、App::error
的情况来处理错误
- Laravel本身有时也会抛出同样的异常,所以你是一致的
- 您不必 return 某些东西。假设你在某处有一个辅助函数。在那里你不能简单地 return 一个视图,但抛出异常仍然有效并立即停止执行。
您还可以使用 findOrFail
,如果未找到模型,它会自动抛出 404 异常:
$user = User::findOrFail($id);
这是一种显示模型异常后未找到消息的方法。
在你的路线中:
use Illuminate\Database\Eloquent\ModelNotFoundException;
App::error(function(ModelNotFoundException $e)
{
$error= BaseController::getException($e);
return View::make('404')->with('error', $error); ;
});
在你的 BaseController 中:
static public function getException($e)
{
if(!$e->getModel())
return;
// Users
if($e->getModel() == "User")
return('This user doesn\'t exist');
// Blog posts, ...
if($e->getModel() == "Post")
return('This post doesn\'t exist');
}
在您的 404 视图中:
<p>{{{ $error or 'Page not found' }}}</p>
我有通往控制器的这条足智多谋的路线
Route::resource ('users', 'UsersController');
UsersController 拥有资源控制器处理的所有操作
Verb Path Action RouteName
--------------------------------------------------------------------------
GET /users index users.index
GET /users/create create users.create
POST /users store users.store
GET /users /{id} show users.show
GET /users {id}/edit edit users.edit
PUT/PATCH /users /{id} update users.update
DELETE /users /{id} destroy users.destroy
我的问题和问题涉及 show($id)
操作,处理以下情况的最佳方法是什么,例如用户请求:
http://example.com/users/anyunexpectedinput
而show action的方法是这样的
public function show($id)
{
$user = User::find($id);
//should I do this
If(!is_object($user)) App::abort(404, 'Page not found');
//OR
//Return a view with message “user not found”
}
Nb:我还在学习Laravel,所以如果不清楚,请接受我的歉意。
IMO 最好的方法是抛出 404 错误 (NotFoundHttpException
)。为什么?例如 here 如果具有指定 ID 的用户不存在,它将抛出 404 错误。
Note: If a matching model instance is not found in the database, a 404 error will be thrown.
我总是抛出 (404) 异常。专业人士:
- 您可以使用
catch
或App::abort
、App::error
的情况来处理错误 - Laravel本身有时也会抛出同样的异常,所以你是一致的
- 您不必 return 某些东西。假设你在某处有一个辅助函数。在那里你不能简单地 return 一个视图,但抛出异常仍然有效并立即停止执行。
您还可以使用 findOrFail
,如果未找到模型,它会自动抛出 404 异常:
$user = User::findOrFail($id);
这是一种显示模型异常后未找到消息的方法。
在你的路线中:
use Illuminate\Database\Eloquent\ModelNotFoundException;
App::error(function(ModelNotFoundException $e)
{
$error= BaseController::getException($e);
return View::make('404')->with('error', $error); ;
});
在你的 BaseController 中:
static public function getException($e)
{
if(!$e->getModel())
return;
// Users
if($e->getModel() == "User")
return('This user doesn\'t exist');
// Blog posts, ...
if($e->getModel() == "Post")
return('This post doesn\'t exist');
}
在您的 404 视图中:
<p>{{{ $error or 'Page not found' }}}</p>