2016-03-27 14 views
2

Web sitesiyle birlikte web api web sayfası oluşturuyorum 5.2, kullanıcı web sitemde http://stage.dev/unavailable/link gibi bir URL'yi ziyaret ederse, hata görüntüleme kaynağında 404 sayfaya geçecek sonra ben sonra ben json/xml TepkisiYakalama belirli bir yol önekine göre hata bulunamadı [Laravel]

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

değil görünümünü dönmek istiyorum, kullanıcı http//stage.dev/api/v1/unavailable/link gibi kullanılamayan url ile benim API erişmeye çalışırsanız farklı şekilde yakalamak istiyorum, url öneki 'bunu algılamak için bir yol var api/* 'veya nasıl .., belki benzer bir sonuçla başka bir yaklaşım, yani erişen aygıt/istemci standart formatta ilerleyebilir (tüm json yanıtında basit format var)

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

Ben Chris ve bu yaklaşım ı render() yöntemde de handler.php satır çiftler eklemek benim için çalışıyor Alexey den

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

benim başlığını sonra cevap okunan bir yolunu

ÇÖZÜLDÜ istek yanıt olarak 404 hata kodu ve dönüş gibi json verileri ..

+0

çözüldü ve kendi isteğiyle oldu geçtiyse, bir cevap gönderin ve cevap değildir .. i özel 404 sayfası oluşturmak için biliyorum doğru – Chris

cevap

0

I (bu yaklaşım ı kaplamalar çok handler.php satır çiftler eklemek benim için çalışıyor Chris ve Alexey bir şey sonra okundu cevap anlamaya) yöntem ,,

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

Belki bunu yapmak için daha iyi bir yol var, ancak özel hata 404 işleyicisi oluşturabilirsiniz. this tutorial izleyin, ancak böyle bir şey için case 404 bölümünü değiştirin: Eğer genel amaçlı alıcı hata ve kullanım için kullanışlı olabilen bir render yöntemine sahip

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

işaretlemek ne demek istediğim, url 'api/v1 /' dizesi içeriyorsa, kullanıcı erişimi 'api/v1/article/vote' diğerlerinin URL'si yoksa ve durumunuz doğru olduğunda kontrol edilir. –

+0

Bu kontrol gerçekleşir sadece sayfa bulunamazsa. Lütfen eğiticiyi ve cevabımı tekrar okuyun. –

+0

Ah üzgünüm ben 'case 404' referans öğretici yazın biliyorum, evet belki de çalışıyor ama laravel 5.2 $ e değişken isHttpException ($ e) kontrol etmek istiyorsanız, 'ModelNotFoundException' örneğidir istisna –

1

App\Exception\Handler.php içinde.

Bu durumda, ajax olup olmadığını belirlemek için request()->ajax() yöntemini de kullanabilirsiniz. Bu özellikle, belli başlıklar mevcut olduğu kontrol ederek bunu yapar:

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

Neyse, Handler.php render yönteme.

Sen gibi bir şey yapabilirsiniz

:

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

ayrıştırmak gerekiyor ama api isteği ajax üzerinde aktarılmaz ve laravel içinde 5.2 eğer $ e, HttpException örneğidir, ancak ModelNotFoundException ,, ve hala istek başlıklarının 404 kodunu döndürmesini istiyorum –