【问题标题】:Laravel 4 using App::error with App::abort(404)Laravel 4 使用 App::error 和 App::abort(404)
【发布时间】:2014-09-23 12:14:53
【问题描述】:

我正在尝试使用 Laravel 编写一个 RESTful API。

我的路线是这样的:

Route::resource('user', 'UserController');

方法是这样的:

public function show($id)
{
    return User::findOrFail($id);
}

但如果模型实例不存在,我会收到 500 错误,而我认为我需要 404 错误。

所以在 start/global.php 我有这个:

App::error(function(Illuminate\Database\Eloquent\ModelNotFoundException $exception)
{
    App::abort(404);
});

这给了我一个 200 代码和异常处理程序中的错误消息。

我做错了吗?我希望没有输出和 404 代码。

谢谢,

迈克尔

【问题讨论】:

  • 您确定您仍然收到200 吗?因为我刚刚在我的虚拟机上尝试过,它给了我一个404,即使它确实显示了错误堆栈。您如何检查错误代码?
  • 我可以重现 OP 的行为,遇到这个使用 HTTP 200 代码发送的字符串:Error in exception handler: in /home/vagrant/CiFR/vendor/laravel/framework/src/Illuminate/Foundation/Applicatio‌​n.php:910
  • 好吧,我也设法重现了它。发生这种情况是因为您在错误处理程序内部抛出了一个错误。我认为这里最好的解决方案是寻找@MichaelBearjaws 的答案。

标签: php rest laravel laravel-4


【解决方案1】:

您将希望使用 Response::make("Not Found", 404); 来实际返回 404 标头并显示 "Not Found" 消息。

您还可以使用视图来呈现您自己的自定义 404 显示,如下所示

return Response::view('missing', array(), 404);

您还可以向您的应用程序添加 Missing 处理程序,以便它可以与您的代码一起使用

App::missing(function($exception) { 
    return Response::view('missing', array(), 404); 
}); 

【讨论】:

  • 只有当你有一个 404 处理程序时它才起作用 App::missing(function($exception) { return Response::view('missing', array(), 404); });
  • 我没有 404 处理程序,它可以正常工作。就像App::abort(500) 给了 500,我没有处理程序。
  • 对不起,我的错误。我在路由内测试App::abort(404),而不是在错误处理程序内。你完全正确。声明 App::missing() 并不能解决它。
  • 嘿,我想到了Response::view(),但那会输出文本。我将其用作 API,因此我只想要没有输出的 404 状态代码。就像将App::abort() 直接放入路由一样。
  • 试试Response::make('', 404)编辑:因为这是一个 API,@lowerends 建议使用 Response::json(null, 404) 似乎更好。
【解决方案2】:

app/config/local/app.php 中的debug 配置值更改为false(如果你在本地,你应该这样做)以断言你实际上得到了404。

你也可以:

  • 使用 phpdoc 运行单元测试:@expectedException Symfony\Component\HttpKernel\Exception\NotFoundHttpException推荐
  • 推动您对开发的承诺,看看它是否真的有效。

【讨论】:

  • 这似乎不是真的,我刚刚得到了一个404 错误堆栈跟踪。你测试过吗?还是我遗漏了一些细节?
  • @Raphael_ 你说得对,我对中断 404 的单元测试感到困惑,而不是将响应代码断言为 404。修复了我的答案。
【解决方案3】:

为了完整起见,OP 提到的行为(并且可以复制)之前在 Laravel 的 Github 上讨论过:https://github.com/laravel/framework/issues/1807。决定按设计进行,不会更改。

因此,正如Michael Bearjaws 已经提到的那样,从错误处理程序中为 JSON 返回 Response::make("Not Found", 404);Response::json(null, 404); 是目前唯一的解决方案。

【讨论】:

    猜你喜欢
    • 2015-12-31
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2017-03-10
    相关资源
    最近更新 更多