はじめに
LaravelのFormRequestではファイル形式のバリデーションもサポートしていますが、ファイル名でバリデーションしたい場合は、カスタムルールを作成する必要があります。
本記事では、カスタムルールFilename
を作成し、ファイル名の長さと正規表現チェックを実装します。
Filename実装
Rules\Filenameクラス作成
php artisan make:rule Filename
実装内容
Filename.php
<?php
namespace App\Rules;
use Closure;
use Illuminate\Contracts\Validation\ValidationRule;
class Filename implements ValidationRule
{
/**
* Run the validation rule.
*
* @param \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString $fail
*/
public function validate(string $attribute, mixed $value, Closure $fail): void
{
$name = $value->getClientOriginalName();
// 長さ
$nameLengthMax = 100;
$nameLength = mb_strlen($name);
if ($nameLength > $nameLengthMax) {
$fail(":attributeのファイル名は拡張子を含めて{$nameLengthMax}字以内にしてください。");
}
// 正規表現
$pattern = "/[^a-zA-Z0-9ぁ-んァ-ヴー一-龠!_.*'()\-]/u"; // 絵文字などは引っかかる
if (preg_match_all($pattern, $name, $matches)) {
$invalidCharacters = $matches[0];
$fail(":attributeのファイル名に不正な文字(" . implode(', ', $invalidCharacters) . ")が含まれています。");
}
}
}
Filename
では、ファイル名の長さと正規表現を確認しています。正規表現については、引っかかったものをエラーメッセージで全て列挙するようにしています。
使用する場合は、お好みに応じて調整頂ければと思います。
使用例
使い方は以下になります。
SampleRequest.php
use App\Rules\Filename;
class SampleRequest extends FormRequest
{
// 〜省略〜
public function rules(): array
{
return [
'sample_file' => ['nullable', 'mimetypes:image/jpeg,image/png', 'max:1024', new Filename()],
];
}
まとめ
デフォルトで多くのルールを網羅しているFormRequestですが、細かいことをするにはカスタムルールを作成する必要があります。
カスタムルールを使えば、複雑な条件にも対応できるので、ぜひ使っていきましょう。
告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。
みなさまからのご応募をお待ちしております。