Laravel11、enumをvalidateする

ライブラリからソースを見失った際の備忘的なものです。
そのままでは動きませんのでご注意ください。

<?php

namespace App\Rtl\Laravel\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\Facades\Validator;

class _AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        // もし強制HTTPSにするのであればめんどくさいですが、.htaccessで行ってください、こちらでは直リンクでhttpにできてしまいます。
        // if (config('app.env') === 'production') {
        //     \URL::forceScheme('https');
        // }
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // paginatorのCSSにBootstrapを使用します。
        /* 追記、Laravel11ではblade側に記述することで不要です
            <div class="d-flex justify-content-center mt-3">
                {{ $rows->links('pagination::bootstrap-5') }}
            </div>
        */
        // Paginator::useBootstrap();

        /* 
        独自のvalidatorを追加しました。
        resources/lang/ja/validation.php
        に以下の追記をしてください。
        'zenkaku_hiragana'   => ':attribute は全角のひらがなで入力してください',
        'zenkaku_katakana'   => ':attribute は全角のカタカナで入力してください',

        継承先の子クラスのboot()はオーバーライドするか削除するのを忘れないでください。
        */
        Validator::extend('zenkaku_hiragana', function ($attribute, $value, $parameters) {
            return !(preg_match('/[^ぁ-んー]/u', $value) !== 0);
        });
        Validator::extend('zenkaku_katakana', function ($attribute, $value, $parameters) {
            return !(preg_match('/[^ァ-ヴー ]/u', $value) !== 0);
        });

        /* 
        enumのvaluesとvalidateします。
        使用方法:カスタムリクエストに以下のように実装します。
        'section' => ['required', 'integer', 'enum:' . UserSection::class],
        */
        Validator::extend('enum', function ($attribute, $value, $parameters, $validator) {
            $enumClass = $parameters[0];
            $enumValues = array_map(fn($case) => $case->value, $enumClass::cases());
            // 第三引数をtrueにすると型判定を厳格にしますが、<input>は文字列で入りますのでfalseにしています、厳格にしたい場合は継承先でオーバーライドしてください。
            return in_array($value, $enumValues, false);
        }, '選択された値は無効です。');
    }
}

投稿者プロフィール

TakaharaRyuji
PAGE TOP