使用Laravel 4资源控制器时,如何处理页面未找到错误

时间:2015-01-03 12:56:07

标签: php laravel laravel-4 controller http-status-code-404

我有一条通往控制器的资源丰富的路线

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动作方法就像这样

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,所以如果不清楚,请接受我的道歉。

3 个答案:

答案 0 :(得分:2)

我总是抛出(404)异常。 Pro的:

  1. 您可以使用catchApp::abortApp::error来处理错误
  2. Laravel本身也会抛出同样的异常,所以你是一致的
  3. 您不必返回任何东西。假设你在某处有辅助功能。在那里你不能只是简单地返回一个视图,但抛出一个异常仍然可以工作并立即停止执行。
  4. 此外,如果没有找到模型,您可以使用findOrFail自动抛出404异常:

    $user = User::findOrFail($id);
    

答案 1 :(得分:0)

IMO最好的方法是抛出404错误(NotFoundHttpException)。为什么?例如here如果具有指定ID的用户不存在,则会抛出404错误。

  

注意:如果在数据库中找不到匹配的模型实例,则会抛出404错误。

答案 2 :(得分:0)

这是一种在模型异常后显示未找到的消息的方法。
在你的路线:

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>