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で管理対象外にしておく。