Chuyển đến nội dung chính

レッスン 6: 検証とフォームリクエスト

検証ルール、カスタム検証。フォームリクエストクラス、認可。エラーメッセージ、ローカリゼーション。ファイル検証、条件付き検証。カスタム検証ルール。

💻 プログラミング — レッスン 6 レッスン 6: 検証とフォームリクエスト

Laravel: 基本から上級まで

パート 2: データベースと検証

xdev.asia

1. 基本的な検証

public function store(Request $request)
{
    $validated = $request->validate([
        'name' => 'required|string|max:255',
        'email' => 'required|email|unique:users,email',
        'password' => 'required|min:8|confirmed',
        'role' => ['required', Rule::in(['admin', 'staff', 'customer'])],
        'avatar' => 'nullable|image|max:2048',
        'tags' => 'array|max:5',
        'tags.*' => 'string|max:50',
    ]);

    User::create($validated);
}

2. フォームリクエスト

php artisan make:request StoreProductRequest
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

class StoreProductRequest extends FormRequest
{
    public function authorize(): bool
    {
        return $this->user()->can('create', Product::class);
    }

    public function rules(): array
    {
        return [
            'name' => 'required|string|max:255',
            'slug' => ['required', Rule::unique('products')->ignore($this->product)],
            'price' => 'required|numeric|min:0',
            'category_id' => 'required|exists:categories,id',
            'description' => 'nullable|string|max:5000',
        ];
    }

    public function messages(): array
    {
        return [
            'name.required' => 'Tên sản phẩm là bắt buộc.',
            'price.min' => 'Giá phải lớn hơn hoặc bằng 0.',
        ];
    }
}

// Controller
public function store(StoreProductRequest $request)
{
    Product::create($request->validated());
}

3. カスタム検証ルール

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class NoSpam implements ValidationRule
{
    public function validate(string $attribute, mixed $value, Closure $fail): void
    {
        $spamWords = ['viagra', 'casino', 'lottery'];
        foreach ($spamWords as $word) {
            if (str_contains(strtolower($value), $word)) {
                $fail("Nội dung :attribute chứa từ không được phép.");
            }
        }
    }
}

// Sử dụng
'description' => ['required', new NoSpam],

4. 条件付き検証

public function rules(): array
{
    return [
        'payment_method' => 'required|in:card,bank_transfer',
        'card_number' => 'required_if:payment_method,card|digits:16',
        'bank_name' => 'required_if:payment_method,bank_transfer',
    ];
}

次の記事: API リソースと応答。