簡體   English   中英

Laravel 防止重復表單驗證規則

[英]Laravel Prevent duplicating form validation rules

我的應用程序中有許多不同的地方,用戶可以在其中編輯他們的數據。 更具體地說,我需要通過從注冊開始(檢查他們的用戶名長度,是否需要某些字段等)並在他們登錄時檢查他們的數據(再次檢查他們的用戶名長度)來使用用戶數據驗證表單。 另外,當他們編輯他們的個人資料時,我需要檢查他們的用戶名最多可以有多少個字符,等等。這只是開始。 如果我有一個管理面板,我需要在那里做一個審核面板,我也需要在那里做。 不僅僅是用戶名,可能還有他們的全名、頭像 URL 等。

我無法為此創建一個請求文件,因為在注冊時,登錄時只有大約 4 個字段,有 2 個,而在用戶帳戶設置中,大約有 10 個。因此,請求文件在所有情況下都需要不同。

但是,驗證規則(如用戶名)需要是 x 個字符,並且需要是字母數字。 並且密碼需要最大 x 個字符,等等。這在所有不同的請求文件中都是非常重復的。

如何在不重復所有驗證規則的情況下最好地解決這個問題?

一個代碼示例:

// LoginRequest.php

public function rules()
{
    return [
        'username' => 'required|max:16|min:6',
        'password' => 'required|max:16|min:6|alphanumeric'
    ];
}

// UserAccountSettingsRequest

public function rules()
{
    return [
        'username' => 'required|max:16|min:6|alphanumeric',
        'email'    => 'required|email',
        'name'     => 'required|max:100|min:2',
        'password' => 'required|max:16|min:6',
        'avatar'   => 'required|max:256'
    ];
}

// RegistrationRequest

public function rules()
{
    return [
        'username' => 'required|max:16|min:6|alphanumeric',
        'name'     => 'required|max:100|min:2',
        'email'    => 'required|email',
        'password' => 'required|max:16|min:6',
    ];
}

如您所見,我不得不多次重復許多規則。 我怎樣才能防止這種情況?

謝謝!

考慮使用 php array_merge()函數。

您可以將常見的驗證規則重構為一個新文件,並使用 composer.json 和 composer dump-autoload 自動加載它。 (PSR4 自動加載)

例如,在validation_rules.php ,你可以這樣寫:

$validation_rules_user_pwd=['username' => 'required|max:16|min:6|alphanumeric','password' => 'required|max:16|min:6'];

當你需要使用它時,你可以這樣做

public function rules()
 {
     return array_merge($validation_rules_user_pwd,[
              'email' => 'required|email',
              'name' => 'required|max:100|min:2|,
              'avatar' => 'required|max:256
            ]);
 }

為了進一步推動它,您可以編寫一個輔助函數,它接受一個字符串數組並返回一個關聯數組。

例如

<?php
namespace App\Helpers;

class ValidationRulesBuilder
{
    private static $validation_rules_preset = ["username" => "required|max:16|min:6|alphanumeric", "name" => 'required|max:100|min:2', 'email' => 'required|email', 'password' => 'required|max:16|min:6'];

    public static function buildValidationRules($fields)
    {
        $ret = [];
        foreach ($fields as $field) {
            $ret[$field] = self::$validation_rules_preset[$field];
        }
        return $ret;
    }
}

然后,使用它

 public function rules()
     {
         return (\App\Helpers\ValidationRulesBuilder::buildValidationRules(['username','password']));
     }

要允許附加規則,只需對構建函數進行一些修改,例如:

<?php
namespace App\Helpers;

class ValidationRulesBuilder
{
    private static $validation_rules_preset = ["username" => "required|max:16|min:6|alphanumeric", "name" => 'required|max:100|min:2', 'email' => 'required|email', 'password' => 'required|max:16|min:6'];

    public static function buildValidationRules($fields)
    {
        $ret = [];
        foreach ($fields as $field) {
            $pos = strpos($field, '|');
            if ($pos !== false) {
                $ret[$field] = self::$validation_rules_preset[substr($field,0,$pos)]. substr($field, $pos);
            } else {
                $ret[$field] = self::$validation_rules_preset[$field] ;
            }
        }
        return $ret;
    }
}

用它:

 public function rules()
     {
         return (\App\Helpers\ValidationRulesBuilder::buildValidationRules(['username|min:5|custom-validation','password']));
     }

password是默認規則, username是默認規則加上"min:5|custom-validation"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM