2017-07-03 56 views
1

我需要在用戶點擊不存在的url時或當我以編程方式強制應用程序:: abort(404)時觸發自定義控制器。使用Laravel 5在404個網址上使用控制器

我該怎麼辦?

我的404視圖需要一些數據,並且一個簡單的刀片視圖(或ViewComposer)是不夠的。

感謝

PS捕獲所有的url不起作用,因爲他們不抓編程推出404

回答

0

編輯render功能App\Exceptions\Handler類,並添加一些關於404這裏:

if ($this->isHttpException($exception) && $this->getStatusCode() == 404) { 
    // Do what you want... 
    // You can even use the $request variable 
} 

舉例:

public function render($request, Exception $exception) 
{ 
    if ($this->isHttpException($exception) && $this->getStatusCode() == 404) { 
     echo 'hello from 404 renderer'; 
     dd($request); // Or you can a view. 
    } 
    return parent::render($request, $exception); 
} 
+0

我需要使用控制器,因爲我需要層次鏈中的一些方法 –

+0

不確定使用太多控制器繼承是安全的設計。也許你可以將這些輔助方法從你的控制器中移開。但假設,你知道你在做什麼,我的方法不起作用,所以IDK如何在控制器中處理404(我*仍*認爲這不是正確的方式) –

+0

你爲什麼認爲這是不安全的?我有一些複雜的邏輯來構建頁面。 層次鏈不是那麼大,我只有3層,有一些共享視圖邏輯。 404也將是一個複雜的頁面,它需要一些共享邏輯。我不能將這些方法移動到助手或ViewComponents中,因爲它們在很大程度上取決於請求哪個頁面。 –

0

如果例外是404,請嘗試將redirect()返回到您的自定義Controller而不是response()Handlerrender()方法。您可以從$request中檢索請求的頁面,對嗎?

下面是示例:

public function render($request, Exception $exception) 
{ 
    if ($this->isHttpException($exception) && $this->getStatusCode() == 404) { 
     return redirect(route('route.to.custom.controller'))->with('request', $request); 
    } 

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

希望這將有助於,乾杯!

+0

這種方法迫使一個不想要的301 –