Laravel 4:如果项目不存在,则重定向';t存在,ModelNotFoundException不存在';反正不行我试试看
我正在学习Dayle Rees的书《光明代码》教程,内容是如何使用Laravel(Playstation游戏集)构建一个基本应用程序 到目前为止,这个应用程序还不错,但是,按照他在本章末尾的建议,我正在做我的家庭作业,试图改进它 因此,对于现有模型,此代码段工作正常,但如果该项不存在,则会抛出错误: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
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)
:不可能使用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');
});