使用 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) 异常。专业人士:

  1. 您可以使用 catchApp::abortApp::error 的情况来处理错误
  2. Laravel本身有时也会抛出同样的异常,所以你是一致的
  3. 您不必 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>