今天這篇是把第 9 天:表單處理與請求的自定義提出更細部的說明,尤其是在定義自訂驗證邏輯這部分。
文件:表单验证
內建驗證規則: 使用 Laravel 的內建規則進行常見資料驗證。
自訂驗證規則: 建立自訂規則以滿足特定需求。
表單請求: 使用表單請求類別封裝驗證邏輯,提升程式碼的整潔性和可維護性。
Laravel 提供了許多內建的驗證規則,可以在表單提交時進行資料驗證,當然也可以在控制器方法中使用這些規則來確保資料的有效性。
範例 - 控制器中的驗證
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
public function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'name' => 'required|string|max:255',
        'email' => 'required|email|unique:users,email',
        'password' => 'required|confirmed|min:8',
    ]);
    if ($validator->fails()) {
        return redirect()->back()->withErrors($validator)->withInput();
    }
    // 驗證通過,繼續處理數據
}
有時內建的驗證規則可能不滿足需求,這時可以建立自訂驗證規則。
step 1 - 建立自訂規則
用指令 php artisan make:rule CustomRule 建立自訂規則類
step 2 - 定義自訂驗證邏輯
在 app/Rules 目錄下產生一個新的規則類別檔案 app/Rules/CustomRule.php。
編輯該文件以定義自訂驗證邏輯:
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class CustomRule implements Rule
{
    public function passes($attribute, $value)
    {
        // 自訂驗證邏輯
        return $value === 'special';
    }
    public function message()
    {
        // 自訂錯誤訊息
        return 'The :attribute must be "special".';
    }
}
step 3 - 在控制器中使用自訂規則
use App\Rules\CustomRule;
public function store(Request $request)
{
    $validator = Validator::make($request->all(), [
        'attribute' => ['required', new CustomRule()],
    ]);
    if ($validator->fails()) {
        return redirect()->back()->withErrors($validator)->withInput();
    }
    // 驗證通過,繼續處理數據
}
表單請求(Form Request)是 Laravel 提供的一種更整潔的驗證處理方法,可以將驗證邏輯封裝在單獨的請求類別中。
step 1 - 建立表單請求
用指令 php artisan make:request StoreUserRequest 建立表單請求
step 2 - 定義自訂驗證規則和授權邏輯
在 app/Http/Requests 目錄下產生一個新的請求類別檔案 app/Http/Requests/StoreUserRequest.php。
編輯該文件以定義驗證規則和授權邏輯:
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreUserRequest extends FormRequest
{
    public function authorize()
    {
        // 是否授權該請求
        return true;
    }
    public function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users,email',
            'password' => 'required|confirmed|min:8',
        ];
    }
    public function messages()
    {
        return [
            'name.required' => 'The name field is required.',
            'email.email' => 'Please provide a valid email address.',
            'password.confirmed' => 'Passwords do not match.',
        ];
    }
}
step 3 - 在控制器中使用表單請求
將表單請求類別作為控制器方法的參數:
use App\Http\Requests\StoreUserRequest;
public function store(StoreUserRequest $request)
{
    // 驗證通過,繼續處理數據
}