【问题标题】:Catch not found error by certain route prefix [Laravel]通过某些路由前缀捕获未找到错误 [Laravel]
【发布时间】:2016-07-14 19:31:55
【问题描述】:

我正在与 laravel 5.2 中的网站一起构建 web api,当用户访问我的 web 上不可用的 url 时,如 http://stage.dev/unavailable/link 然后它会在错误视图资源上抛出 404 页面,然后我想以不同的方式捕获如果用户尝试使用http//stage.dev/api/v1/unavailable/link 等不可用 URL 访问我的 API,然后我想返回 json/xml 响应

{
  'status' : 'not found',
  'code' : 404,
  'data' : []
}

不是视图,有没有办法通过 url 前缀 'api/*' 或如何检测它......,也许是另一种具有类似结果的方法,因此访问它的设备/客户端可以通过标准格式进行(我有所有 json 响应中的简单格式)

{
  'status' : 'success|failed|restrict|...',
  'api_id' : '...',
  'token' : '...',
  'data' : [
    {'...' : '...'},
    {'...' : '...'},
    ...
  ]
}

已解决

我在阅读ChrisAlexey 的答案后发现了一些东西,这种方法对我有用,我在handler.phprender() 方法中添加了几行,

    if($e instanceof ModelNotFoundException || $this->isHttpException($e)) {
        if($request->segment(1) == 'api' || $request->ajax()){
            $e = new NotFoundHttpException($e->getMessage(), $e);
            $result = collect([
                'request_id' => uniqid(),
                'status' => $e->getStatusCode(),
                'timestamp' => Carbon::now(),
            ]);
            return response($result, $e->getStatusCode());
        }
    }

我的标头请求响应 404 错误代码并返回我想要的 json 数据..

【问题讨论】:

  • 如果已经解决,并且是您自己的意愿,请提交答案并标记为正确

标签: php json laravel


【解决方案1】:

也许有更好的方法可以做到这一点,但您可以创建自定义错误 404 处理程序。关注this tutorial,但将case 404 部分更改为如下内容:

if(str_contains(Request::url(), 'api/v1/')){
    return response()->json(your_json_data_here);
}else{
    return \Response::view('custom.404',array(),404);
}

【讨论】:

  • 我知道如何创建自定义 404 页面。你的答案不是我的意思,只是检查 url 是否包含 'api/v1/' 字符串,当用户访问 'api/v1/article/投票'其他网址不存在,您的条件将是真实的..
  • 只有在找不到页面时才会进行此检查。请再次阅读教程和我的答案。
  • 哦,对不起,我没有意识到你输入 case 404 参考你的教程,是的,也许它有效,但在 laravel 5.2 $e 变量是 ModelNotFoundException 的实例,如果你想检查isHttpException($e) 你需要解析异常
【解决方案2】:

App\Exception\Handler.php 内部,您有一个render 方法,可以方便地进行通用错误捕获和处理。

在这种情况下,您还可以使用request()->ajax() 方法来确定它是否是ajax。它通过检查某些标题是否存在来做到这一点,特别是:

'XMLHttpRequest' == $this->headers->get('X-Requested-With')

不管怎样,回到Handler.php 中的渲染方法。

你可以这样做:

public function render($request, Exception $e)
{        

    if($e instanceof HttpException && $e->getStatusCode() == 404) {
        if (request()->ajax()) {
            return response()->json(['bla' => 'foo']);
        } else {
            return response()->view('le-404');
        }
    }

    return parent::render($request, $e);
}

【讨论】:

  • 但是 api 请求不会通过 ajax 传输,并且在 laravel 5.2 中,如果您检查变量 $e 不是 HttpException 的实例而是 ModelNotFoundException,并且我仍然希望保留请求标头返回代码 404跨度>
【解决方案3】:

我在阅读 ChrisAlexey 的回答后发现了一些东西,这种方法对我有用,我在 handler.php 的 render() 方法中添加了几行,

    if($e instanceof ModelNotFoundException || $this->isHttpException($e)) {
        if($request->segment(1) == 'api' || $request->ajax()){
            $e = new NotFoundHttpException($e->getMessage(), $e);
            $result = collect([
                'request_id' => uniqid(),
                'status' => $e->getStatusCode(),
                'timestamp' => Carbon::now(),
            ]);
            return response($result, $e->getStatusCode());
        }
    }

【讨论】:

    猜你喜欢
    • 2019-01-17
    • 1970-01-01
    • 2015-02-04
    • 2014-10-02
    • 1970-01-01
    • 2019-02-08
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多