通过某些路由前缀捕获未找到错误[Laravel]

时间:2016-03-27 12:06:53

标签: php json laravel

我正在使用laravel 5.2中的网站建立web api,当用户在我的网络上访问不可用的网址如http://stage.dev/unavailable/link然后它会在错误视图资源上抛出404页面,然后我想要抓住不同的如果用户尝试使用http//stage.dev/api/v1/unavailable/link之类的不可用网址访问我的API,那么我想返回json/xml响应

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

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

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

解决

我在阅读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());
        }
    }

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

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

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

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

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

无论如何,回到Handler.php中的render方法。

您可以执行以下操作:

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);
}

答案 2 :(得分:0)

我在读完 Chris Alexey 的答案后发现了一些东西。这种方法对我有效,我在handler()方法中添加了几个行处理器。 / p>

    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());
        }
    }