tohokuaikiのチラシの裏

技術的ネタとか。

LaravelでEthnaのフォームフィルターみたいなやつ(2024年版)

前にも書いた記事LaravelでEthnaのフォームフィルターみたいなやつ - tohokuaikiのチラシの裏 が2024年ではcomposerでインストールできなくなっていた。Laravelのバージョンとかそんな感じ。

で、調べたらGitHub - elegantweb/sanitizer: Sanitization library for PHP and Laravel framework.が、https://github.com/Waavi/SanitizerにInspiredされて作られたとかいうので、使ってみた。

インストール

普通にcomposer require

 composer require elegantweb/sanitizer

Requestクラスを設定

php artisan make:request UserRequest

で、app/Http/Requests/UserRequest.php ができるので、これにuse SanitizesInput をtraitする。

<?php
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Elegant\Sanitizer\Laravel\SanitizesInput;

class UserRequest extends FormRequest
{
    use SanitizesInput;

    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
     */
    public function rules(): array
    {
        return [
            'name' => ['required']
        ];
    }

    
    public function filters()
    {
        return [
            'name' => 'lowercase',
            
        ];
    }
}

あとは、rules() methodでフォームのキーを指定して、 filters() で指定したいフィルターを設定する。上記の場合は、nameプロパティを小文字への変換する。

ControllerクラスでFilterする。

UserRequestクラスをRequestで受け付けるようにして、その内部で validated() してやればFilterがかかる。

<?php
    public function update(UserRequest $request, string $id)
    {
        $data = $request->validated();

カスタムフィルター

全角英数字を半角にする奴とかですね。

Providerを作成

./artisan make:provider ElegantwebFilter

このProviderでフィルター名とフィルタの実装クラスを登録する。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ElegantwebFilter extends ServiceProvider
{
    /**
     * Register services.
     */
    public function register(): void
    {
    }

    /**
     * Bootstrap services.
     */
    public function boot(): void
    {
        //
        \Sanitizer::extend("zentohan", \App\Http\Requests\Filters\Zentohan::class);
    }
}

Filterクラスを作る

\App\Http\Requests\Filters\Zentohan::class の実装

<?php
namespace App\Http\Requests\Filters;

use \Elegant\Sanitizer\Contracts\Filter;

/**
 * Class Zentohan
 */
class Zentohan implements Filter
{
    /**
     * @param mixed $value
     * @param array $options
     * @return mixed|string|string[]
     */
    public function apply($value, $options = [])
    {
        return mb_convert_kana($value, 'KVa', 'UTF-8');
    }
}

Requestクラスでカスタムフィルタを使う。

これで zentohan が使えるようになった。

<?php
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Elegant\Sanitizer\Laravel\SanitizesInput;

class UserRequest extends FormRequest
{
    use SanitizesInput;

    public function filters()
    {
        return [
            'name' => ['lowercase', 'zentohan',]
        ];
    }
}

<おまけ> Facadeを登録すると、VSCodeでWarningが出るのでlaravel-ide-helperで対応する。

composer require --dev barryvdh/laravel-ide-helper
php artisan ide-helper:generate

便利だなぁ…

これで、_ide_helper.phpが作られるんだけど、これが1M近くあるし当然 .gitignoreで管理対象外にしておく。