Laravel逆引きTips – Validation

Laravel Laravel

Laravel逆引きTIps一覧へ戻る

ルールの一覧

公式サイト日本語版)にて確認できます。

コントローラーでのバリデーション

class UserController extends Controller
{
    public function store(Request $request)
    {
        $validatedData = $request->validate([
            'name' => 'required|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:8|confirmed',
        ]);

        // バリデーション成功後の処理
        User::create($validatedData);
    }
}
PHP

フォームリクエストの使用

独立したフォームリクエストクラスを作成し、rules()メソッド内でバリデーションルールを定義します。これにより、コントローラーがスリムになり、バリデーションロジックを再利用できます。

class StoreUserRequest extends FormRequest
{
    public function rules()
    {
        return [
            'name' => 'required|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:8|confirmed',
        ];
    }
}
PHP
class UserController extends Controller
{
    public function store(StoreUserRequest $request)
    {
        // バリデーション済みのデータを使用
        $validatedData = $request->validated();
        User::create($validatedData);
    }
}
PHP

カスタムバリデーションルールの作成

Validator::extend('uppercase', function ($attribute, $value, $parameters, $validator) {
    return strtoupper($value) === $value;
});

// 使用例
$request->validate([
    'name' => 'required|uppercase',
]);
PHP

条件付きバリデーション

$request->validate([
    'email' => 'required_if:contact_method,email',
    'phone' => 'required_if:contact_method,phone',
]);
PHP

エラーメッセージのカスタマイズ

$messages = [
    'required' => 'The :attribute field is required.',
    'email.unique' => 'This email is already registered.',
];

$validator = Validator::make($request->all(), [
    'name' => 'required|max:255',
    'email' => 'required|email|unique:users',
], $messages);
PHP

バリデーション後の処理

if ($validator->fails()) {
    return redirect('post/create')
                ->withErrors($validator)
                ->withInput();
}

// バリデーション成功後の処理
$validatedData = $validator->validated();
User::create($validatedData);
PHP

Laravel逆引きTIps一覧へ戻る

Follow me!

コメント

PAGE TOP
タイトルとURLをコピーしました