2014-10-29 11 views
55

लार्वेल 5, App::missing और App::error में उपलब्ध नहीं है, तो अब आपके पकड़ अपवाद और गायब पृष्ठ कैसे हैं?मैं लैरवेल 5 में अपवाद/गायब पृष्ठों को कैसे पकड़ूं?

मुझे दस्तावेज़ में इस बारे में कोई जानकारी नहीं मिली।

उत्तर

87

लार्वेल 5 में आप render विधि app/Exceptions/Handler.php में संपादित करके अपवादों को पकड़ सकते हैं।

यदि आप एक लापता पृष्ठ (NotFoundException के रूप में भी जाना जाता है) पकड़ना चाहते हैं तो आप यह जांचना चाहते हैं कि अपवाद, $e, Symfony\Component\HttpKernel\Exception\NotFoundHttpException का उदाहरण है।

public function render($request, Exception $e) { 
    if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) 
     return response(view('error.404'), 404); 

    return parent::render($request, $e); 
} 
ऊपर कोड के साथ

, हम जांच अगर $eSymfony\Component\HttpKernel\Exception\NotFoundHttpException के instanceof है और हम HTTP status code 404 के साथ सामग्री के रूप में view फ़ाइल error.404 के साथ एक response भेज अगर यह होता है।

इसका उपयोग किसी भी अपवाद के लिए किया जा सकता है। तो यदि आपका ऐप App\Exceptions\MyOwnException का अपवाद भेज रहा है, तो आप इसके बजाय उस उदाहरण की जांच करें।

public function render($request, Exception $e) { 
    if ($e instanceof \App\Exceptions\MyOwnException) 
     return ''; // Do something if this exception is thrown here. 

    if ($e instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException) 
     return response(view('error.404'), 404); 

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

आपको यह उत्तर कैसे पता चला , मुझे इसके बारे में और जानकारी कहां मिल सकती है? –

+0

@adityamenon, यह लैरवेल 5 के पिछले विकास संस्करण के लिए था। मैंने इसे लैरवेल 5 के वर्तमान संस्करण से मेल करने के लिए फिर से लिखा है। – Marwelln

+2

हैंडलर.एफ़पी की मूल बातें आदित्य मेनन और रेंडर() फ़ंक्शन को दस्तावेज़ों में समझाया गया है http://laravel.com/docs/5.0/errors (लेकिन मारवेल का जवाब इसका उपयोग करने का एक अच्छा उदाहरण है)। – orrd

4

के बाद से 30681dc और 9acf685missing() विधि करता Illuminate\Exception\Handler वर्ग के लिए ले जाया गया था।

तो, कुछ समय के लिए, आप ऐसा कर सकता है:

app('exception')->missing(function($exception) 
{ 
    return Response::view('errors.missing', [], 404); 
}); 


... लेकिन फिर हाल ही में एक रिफैक्टरिंग 62ae860 में किया गया है।

अब, आप क्या कर सकते app/Http/Kernel.php में निम्नलिखित को जोड़ रहा है:

// add this... 
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 
use Response; 

class Kernel extends HttpKernel { 

    (...) 

    public function handle($request) 
    { 
     try 
     { 
      return parent::handle($request); 
     } 

     // ... and this: 
     catch (NotFoundHttpException $e) 
     { 
      return Response::view('errors.missing', [], 404); 
     } 

     catch (Exception $e) 
     { 
      throw $e; 
     } 
    } 


अंत में, कृपया ध्यान रखें Laravel भारी विकास के तहत अब भी है, और परिवर्तनों को फिर हो सकती है।

+0

के माध्यम से पारित किया जाना चाहिए, मुझे उम्मीद है कि जल्द ही बदलाव नहीं होगा! –

15

आज (9 डीबी 7 9 3) से प्रतिबद्धता के साथ, आपको बस/संसाधन/विचार/त्रुटियों/फ़ोल्डर में 404.blade.php फ़ाइल जोड़ने की आवश्यकता है और यह स्वचालित रूप से इसे प्रदर्शित और प्रदर्शित करेगा।

+1

नहीं, यह मेरे लिए काम नहीं करता –

+1

मेरे लिए काम किया ... – sehummel

+1

यह सभी एचटीपी त्रुटि कोड प्रतिक्रियाओं के लिए 5.0.1 के रूप में काम करता है। तो आप 500, 401, 403 ect के लिए कस्टम विचार हो सकते हैं। – Joe

2

कोणीय एचटीएमएल 5 मोड गायब पृष्ठों का एक समूह (उपयोगकर्ता बुकमार्क कुछ पेज और पुनः लोड करने का प्रयास कर सकता है) का कारण बन सकता है। यदि आप इसे संभालने के लिए सर्वर सेटिंग्स को ओवरराइड नहीं कर सकते हैं, तो आप गायब पृष्ठ व्यवहार को ओवरराइड करने के बारे में सोच सकते हैं।

आप 404 कोड के साथ पुश 404 टेम्पलेट के बजाय 200 के साथ सामग्री को धक्का देने के लिए \ App \ Exceptions \ हैंडलर रेंडर विधि को संशोधित कर सकते हैं।

/** 
* Render an exception into an HTTP response. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Exception $e 
* @return \Illuminate\Http\Response 
*/ 
public function render($request, Exception $e) 
{ 
    if ($this->isHttpException($e) && $e->getStatusCode() == 404) 
    { 
     return response()->view('angular', []); 
    } 
    return parent::render($request, $e); 
} 
+0

वही किया, लेकिन '$ this-> हैहट अपवाद ($ ई)' भूल गया। धन्यवाद – midan888

-2

एक तरीका यह है कि आप इसे संभाल सकते हैं लेकिन रीडायरेक्ट में बदलना सबसे अच्छा नहीं है।

<?php namespace App\Exceptions; 

use Exception; 
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; 

class Handler extends ExceptionHandler { 

     /** 
     * A list of the exception types that should not be reported. 
     * 
     * @var array 
     */ 
     protected $dontReport = [ 
       'Symfony\Component\HttpKernel\Exception\HttpException' 
     ]; 

     /** 
     * Report or log an exception. 
     * 
     * This is a great spot to send exceptions to Sentry, Bugsnag, etc. 
     * 
     * @param \Exception $e 
     * @return void 
     */ 
     public function report(Exception $e) 
     { 
       return parent::report($e); 
     } 

     /** 
     * Render an exception into an HTTP response. 
     * 
     * @param \Illuminate\Http\Request $request 
     * @param \Exception $e 
     * @return \Illuminate\Http\Response 
     */ 
     public function render($request, Exception $e) 
     { 
     return redirect('/'); 
       //return parent::render($request, $e); 
     } 

} 
0

डिफ़ॉल्ट त्रुटि पृष्ठ के साथ Laravel जहाजों, आप आसानी से की तरह कस्टम त्रुटि पृष्ठ जोड़ सकते हैं इस

1 - ध्यान में रखते हुए एक त्रुटि दृश्य बनाएँ -> त्रुटियों फ़ोल्डर
2 - नाम की तरह HTTP त्रुटियों से मेल खाना चाहिए 404 या 403 500

`Route::get('/page/not/found',function($closure){ 
    // second param is optional 
    abort(404, 'Page Not found'); 
});` 
0

जोड़कर कोड

protected $dontReport = [ 
      'Symfony\Component\HttpKernel\Exception\HttpException' 
    ]; 
निम्नलिखित

और

public function render($request, Exception $e) 
    { 
    return redirect('/'); 
      //return parent::render($request, $e); 
    } 

के लिए मुझे

0

ठीक से काम करेंगे मामले में आप अपने वेब मार्गों फ़ाइल में हैंडलर रखने के लिए, अपने मौजूदा मार्गों के बाद हैं:

Route::any('{all}', function ($missingRoute) { 
    // $missingRoute 
})->where('all', '(.*)'); 
संबंधित मुद्दे