Laravel 4:如果项目不存在,则重定向';t存在,ModelNotFoundException不存在';反正不行我试试看

Laravel 4:如果项目不存在,则重定向';t存在,ModelNotFoundException不存在';反正不行我试试看,laravel,laravel-4,Laravel,Laravel 4,我正在学习Dayle Rees的书《光明代码》教程,内容是如何使用Laravel(Playstation游戏集)构建一个基本应用程序 到目前为止,这个应用程序还不错,但是,按照他在本章末尾的建议,我正在做我的家庭作业,试图改进它 因此,对于现有模型,此代码段工作正常,但如果该项不存在,则会抛出错误: public function edit(Game $game){ return View::make('/games/edit', compact('game')); } 换句话说,ht

我正在学习Dayle Rees的书《光明代码》教程,内容是如何使用Laravel(Playstation游戏集)构建一个基本应用程序

到目前为止,这个应用程序还不错,但是,按照他在本章末尾的建议,我正在做我的家庭作业,试图改进它

因此,对于现有模型,此代码段工作正常,但如果该项不存在,则会抛出错误:

public function edit(Game $game){
    return View::make('/games/edit', compact('game'));
}
换句话说,
http://laravel/games/edit/1
显示ID=1的项目,但
http://laravel/games/edit/21456
抛出错误,因为没有具有该ID的项目

让我们改进这一行为,调整StackOverflow()上的一些脚本:

嗯。。。什么也没发生!我仍然有错误,没有重定向到操作的GamesController@index'... 请注意,我的控制器中没有名称空间

我几乎什么都试过了:

  • catch(ModelNotFoundException$e)
    替换为
    catch(lighting\Database\elounce\ModelNotFoundException$e)
    :不可能
  • put
    使用Illumb\Database\Eloquent\ModelNotFoundException在模型中而不是控制器中
  • 返回一个简单的
    返回'fail'而不是
    返回重定向::操作('GamesController@index');
    查看问题是否存在

  • 几乎把这段代码放在所有建议的地方

  • 好吧,只是什么都没发生:我的错误还在那里

    想看看吗?以下是错误堆栈中的前两项:

  • 拜托,有人能告诉我我错过了什么吗?这让我发疯


    提前谢谢

    以下是我的一些解决方案:

    第一个解决方案

    解决问题最直接的方法是使用
    ->find()
    而不是
    ->findOrFail()

    第二种解决方案

    我注意到,根据Laravel的说法,您可能一直在使用模型绑定到您的路线:

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

    因此,在定义模型绑定的地方,可以添加闭包来处理错误:

    Route::model('game', 'Game', function()
    {
        return Redirect::action('GamesController@index');
    });
    
    第三种解决方案


    在您的屏幕截图中,您的
    App::error
    似乎可以正常工作,因为错误显示为
    HttpNotFound Exception
    ,这是Laravel表示404错误的方式。因此,最后一个解决方案是将重定向写在那里,尽管这适用于全球(非常不鼓励)。

    嗨,Jofry,谢谢你的回复!是的,根据教程,我正在使用路由模型绑定:我刚刚尝试了方法2(这对我来说似乎是最清楚的),但我得到了一个新错误:“传递给GamesController::edit()的参数1必须是游戏的实例,Illumb\Http\RedirectResponse的实例给定”。。。有时我会后悔过去的程序性日子…:-)在这种情况下,我可能会求助于第一个。因为第二个解决方案实际上将返回传递回控制器操作。使用
    ->find()
    而不是
    ->findOrFail()
    是您的选择吗?
    App::error(function(ModelNotFoundException $e)
    {
        return Response::make('Not Found', 404);
    });
    
    public function edit(Game $game){
        // Using find will return NULL if not found instead of throwing exception
        $current = Game::find($game->id);
    
        // If NOT NULL, show view, ELSE Redirect away
        return $current ? View::make('/games/edit', compact('game')) : Redirect::action('GamesController@index');
    }
    
    Route::model('game', 'Game', function()
    {
        return Redirect::action('GamesController@index');
    });