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

Bài 6: Validation & Form Requests

Validation rules, custom validation. Form Request classes, authorization. Error messages, localization. File validation, conditional validation. Custom validation rules.

💻 Lập trình — Bài 6 Bài 6: Validation & Form Requests

Laravel: Từ Cơ bản đến Nâng cao

Phần 2: Database & Validation

xdev.asia

1. Validation cơ bản

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. Form Request

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. Custom Validation Rule

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. Conditional Validation

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',
    ];
}

Bài tiếp theo: API Resources & Response.