首頁 > php框架 > Laravel > 在 Laravel 中處理請求驗證的智慧方法

在 Laravel 中處理請求驗證的智慧方法

藏色散人
發布: 2019-09-20 09:41:00
轉載
3058 人瀏覽過

在 Laravel 中處理請求驗證的智慧方法

Laravel 是網路工匠的 PHP 框架。這有助於我們建立強大的應用程式和 API。很多人都知道有很多方法可以驗證 Laravel 中的請求。處理請求驗證是任何應用程式中非常重要的部分。 Laravel 有一些很好的功能,可以很好地處理這個問題。

入門

我們大多數人都熟悉在控制器中使用驗證器。這是處理傳入請求驗證的最常用方法。

以下是我們的驗證器的樣子UserController

<?php
namespace App\Http\Controllers\API\v1\Users;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use App\Entities\Models\User;
class UserController extends Controller
{
    public function store(Request $request)
    {
        // validate incoming request
        $validator = Validator::make($request->all(), [
           &#39;email&#39; => &#39;required|email|unique:users&#39;,
           &#39;name&#39; => &#39;required|string|max:50&#39;,
           &#39;password&#39; => &#39;required&#39;
       ]);
       if ($validator->fails()) {
            Session::flash(&#39;error&#39;, $validator->messages()->first());
            return redirect()->back()->withInput();
       }
       // finally store our user
    }
}
登入後複製

在控制器中驗證

在控制器中驗證傳入要求沒有任何問題,但這不是最好的方法,你的控制器看起來很亂。在我看來,這是不好的做法。控制器應該只處理來自路由的一個處理請求並傳回適當的回應。

在控制器中編寫驗證邏輯將打破單一責任原則。我們都知道需求會隨著時間的推移而變化,每次需求變更時,您的班級職責也會改變。因此,在單一班級中承擔許多責任使得管理變得非常困難。

Laravel 有表單請求,一個包含驗證邏輯的單獨請求類別。要建立一個,您可以在 Artisan 命令下使用。

php artisan make:請求UserStoreRequest

這將建立新的Request 類別app\Http\Request\UserRequest

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UserStoreRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            &#39;email&#39; => &#39;required|email|unique:users&#39;,
            &#39;name&#39; => &#39;required|string|max:50&#39;,
            &#39;password&#39; => &#39;required&#39;
        ];
    }
     /**
     * Custom message for validation
     *
     * @return array
     */
    public function messages()
    {
        return [
            &#39;email.required&#39; => &#39;Email is required!&#39;,
            &#39;name.required&#39; => &#39;Name is required!&#39;,
            &#39;password.required&#39; => &#39;Password is required!&#39;
        ];
    }
}
登入後複製

Laravel Form Request 類別有兩個預設方法auth( ) 和rules()。 auth() 無論目前使用者是否被允許要求,您都可以在方法中執行任何授權邏輯。在 rules() 方法中,您可以編寫所有驗證規則。還有一種方法 messages() 可以傳遞自己的驗證訊息數組。

現在改變我們 UserController 使用我們 UserStoreRequest. 你可以輸入提示我們的請求類,它會在呼叫我們的控制器函數之前自動解析和驗證。

<?php
namespace App\Http\Controllers\API\v1\Users;
use App\Http\Controllers\Controller;
use App\Http\Requests\UserStoreRequest;
class UserController extends Controller
{
    public function store(UserStoreRequest $request)
    {
        // Will return only validated data
        $validated = $request->validated();
    }
}
登入後複製

所以我們的控制器現在很纖薄,易於維護。現在我們的控制器不需要擔心任何驗證邏輯。我們有自己的驗證類,只有一個責任來處理驗證,讓控制器在那裡工作。

如果驗證失敗,它會將使用者重新導向到上一個位置並顯示錯誤。取決於您的請求類型錯誤訊息將在會話中閃爍。如果請求是 AJAX,則將傳回帶有 422 狀態碼的回應,並傳回 JSON 格式的錯誤。

回報

透過清理輸入來保持您的應用程式和使用者的安全。在您的應用程式中使用清潔劑,它將確保資料始終格式良好且一致。在許多情況下,由於愚蠢的格式錯誤,驗證失敗。

用戶輸入的行動電話號碼為 99-9999-999999 或 99-(9999) - (999999)。這是非常常見的錯誤,我們不能強迫我們的用戶再次重新輸入相同的細節。

其他一些例子是使用者輸入的電子郵件為 Foo@Bar.COM 或 FOO@Bar.com。或輸入名字和姓氏,如 FOO **bAR 或 foo baR**

Sanitizer 包含在提供給驗證器之前以通用格式轉換和過濾資料的方法。

我正在使用 Waavi/Sanitizer 包含許多過濾器的套件。

Waavi / 資料清洗

讓我們 BaseFormRequest 為 Form Request 建立抽象類,並 SanitizesInput 在這裡使用 trait。

<?php
namespace App\Http\Requests;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Http\JsonResponse;
use Waavi\Sanitizer\Laravel\SanitizesInput;
abstract class BaseFormRequest extends FormRequest
{
    use ApiResponse, SanitizesInput;
    /**
     * For more sanitizer rule check https://github.com/Waavi/Sanitizer
     */
    public function validateResolved()
    {
        {
            $this->sanitize();
            parent::validateResolved();
        }
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    abstract public function rules();
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    abstract public function authorize();
}
登入後複製

所以現在我們可以寫 UserStoreRequest 下面的內容。從我們的基類擴展您的表單請求,因此我們不必在所有請求類中包含特徵。

<?php
namespace App\Http\Requests;
class UserStoreRequest extends BaseFormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            &#39;email&#39; => &#39;required|email|unique:users&#39;,
            &#39;name&#39; => &#39;required|string|max:50&#39;,
            &#39;password&#39; => &#39;required&#39;
        ];
    }
    public function messages()
    {
        return [
            &#39;email.required&#39; => &#39;Email is required!&#39;,
            &#39;name.required&#39; => &#39;Name is required!&#39;,
            &#39;password.required&#39; => &#39;Password is required!&#39;
        ];
    }
    /**
     *  Filters to be applied to the input.
     *
     * @return array
     */
    public function filters()
    {
        return [
            &#39;email&#39; => &#39;trim|lowercase&#39;,
            &#39;name&#39; => &#39;trim|capitalize|escape&#39;
        ];
    }
}
登入後複製

SanitizesInputtrait 提供了一種 filters() 在提供給驗證器之前格式化我們的請求資料的方法。 filters() 方法傳回有效過濾器的陣列。在這裡,我們將使用者電子郵件轉換為小寫並修剪相同的方式將名稱轉換為大寫並轉義任何 HTML 標記。

您可以從此處詳細了解可用的篩選器。

結論

首先,似乎沒有必要為所有人製作單獨的請求類別。但是想像一下將所有驗證邏輯放在同一個控制器中。這就像是一場糟糕的噩夢 - 當它來管理你的程式碼時,如果其他人必須管理它,那就更糟了? 。

謝謝你的閱讀。

我想聽聽你對此的看法。如果您有任何問題或建議,請留下以下評論。

祝你有美好的一天。

更多Laravel相關技術文章,請造訪Laravel框架入門教學專欄進行學習!

以上是在 Laravel 中處理請求驗證的智慧方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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