首頁 > php框架 > Laravel > 主體

如何用Laravel 5.5+框架更好的來實現404響應

不言
發布: 2018-09-10 14:48:59
原創
1998 人瀏覽過

如何實現404頁面?方法其實有很多種,接下來這篇文章就跟大家介紹如何用Laravel 5.5 框架更好的來實現404響應,話不多說,讓我們來看看具體的內容。

Laravel 5.5.10 封裝了兩個有用的路由器方法,可以幫助我們為使用者提供更好的 404 頁面。現在,當拋出404 個異常時,Laravel 會顯示一個漂亮的404.blade.php 視圖文件,你可以自訂顯示給用戶UI,但在該視圖中,你無權訪問sessioncookie,驗證(auth)等...

在laravel 5.5.10 中,我們有一個新的Route::fallback() 方法,用於定義當沒有其他路由與請求匹配時Laravel 回退的路由。

Route::fallback(function () {
    return 'Sorry' . auth()->user()->name . '! This page does not exist.';
});
登入後複製

所以,現在我們可以使用具有正常頁面和頁腳的應用程式佈局,來取代簡單的 404 視圖,同時還能給使用者顯示一個友善的提示訊息。

Route::fallback(function() {
    return response()->view('notFound', [], 404);
});
登入後複製
@extends('layout.app')

@section('content')
    <h3>Sorry! this page doesn't exist.</h3>
@stop
登入後複製

當Laravel 渲染這個回退(fallback)路由時,會運行所有的中間件,因此當你在web.php 路由檔案中定義了回退路由時,所有處在web 中間件群組的中間件都會被執行,這樣我們就可以取得session 資料了。

API 介面說明

現在當你點擊/non-existing-page 時,你會看到在回退路由中定義的視圖,甚至當你點擊/api/non-existing-endpoint 時,如果你也不想提供這個接口,你可以到​​api 回退路由定義JSON 回應,讓我們到api. php 路由檔案中定義另一個回退路由:

Route::fallback(function() {
    return response()->json(['message' => 'Not Found!]);
});
登入後複製

由於api 中間件群組帶有/api 前綴,所有帶有/api 前綴的未定義的路由,都會進入到api.php 路由檔案中的回退路由,而不是web.php 路由檔案中所定義的那個。

使用abort(404) 和ModelNotFound 例外

當使用abort(404) 時會拋出一個NotFoundHttpException,此時處理器會為我們渲染出404.blade.php 視圖文件,同樣的ModelNotFoundException 異常也會做同樣的處理,那麼我們應該如何處理才能在更好的渲染出回退路由的視圖,而不是一個普通的視圖呢?

class Handler extends ExceptionHandler
{
    public function render($request, Exception $exception)
    {
        if ($exception instanceof NotFoundHttpException) {
            return Route::responseWithRoute('fallback');
        }

        if ($exception instanceof ModelNotFoundException) {
            return Route::responseWithRoute('fallback');
        }

        return parent::render($request, $exception);
    }
}
登入後複製

Route::respondWithRoute('fallback') 回去跑名為fallback 的路由,我們可以像下面這樣為回退路由命名:

Route::fallback(function() {
    return response()->view('notFound', [], 404);
})->name('fallback');
登入後複製

甚至,你也可以為特定的資源指定回退路由:

if ($exception instanceof ModelNotFoundException) {
    return $exception->getModel() == Server::class
                ? Route::respondWithRoute('serverFallback') 
                : Route::respondWithRoute('fallback');
}
登入後複製

現在我們需要在路由檔案中定義這個回退路由:

Route::fallback(function(){
    return 'We could not find this server, there are other '. auth()->user()->servers()->count() . ' under your account ......';
})->name('serverFallback');
登入後複製

相關推薦:

mac mamp ngiux laravel框架 報404錯誤

如何實作Laravel 5.5可回應介面

以上是如何用Laravel 5.5+框架更好的來實現404響應的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板