1
0

Laravelでマルチバイト文字数のカスタムバリデーションを作る

Posted at

開発環境

  • Windows 10 Pro(64bit)
  • PHP 8.1.9 (cli) (built: Aug 2 2022 14:17:26) (ZTS Visual C++ 2019 x64)
  • Laravel Framework 10.44.0

マルチバイト文字数を取得する

PHPで文字数を調べる場合、strlen関数を使いますが、マルチバイト文字を使用する場合は、mb_strlen関数(事前に、php.iniでextension=mbstringを有効にすること)を使います。
ただ、絵文字などの場合、正しく1文字と認識できない場合があるので、今回は、grapheme_strlen関数(事前に、php.iniでextension=intlを有効にすること)を使っていきます。

カスタムバリデーションを作成する

今回は、カスタムルールとして、『指定したマルチバイト文字数以下』であれば、OKという風にします。

以下のコマンドでカスタムバリデーション用のファイルを作成

php artisan make:rule MultiByteCharacter

/app/Rulesディレクトリに作成されています。
作成されたファイルに対して、以下のコードを挿入。

MultiByteCharacter.php
<?php

namespace App\Rules;

use Closure;
use Illuminate\Contracts\Validation\ValidationRule;

class MultiByteCharacter implements ValidationRule
{
+  private $length;

+  public function __construct(int $length)
+  {
+    $this->length = $length;
+  }
  /**
   * Run the validation rule.
   *
   * @param  \Closure(string): \Illuminate\Translation\PotentiallyTranslatedString  $fail
   */
  public function validate(string $attribute, mixed $value, Closure $fail): void
  {
     // 指定文字数以上であればエラーメッセージを返す
+    if (grapheme_strlen($value) > $this->length) {
+      $fail('The :attribute is Too many characters.');
+    }
  }
}

カスタムバリデーションを呼び出して、使用する

例えば、PostController.php内で呼び出す場合、以下のコードを挿入してください。

PostController.php
// コード上部
use App\Rules\MultiByteCharacter;

// アクション内
public function save(Request $request): JsonResponse
{
  // postは、必須データかつ、マルチバイト文字で100文字より小さいこと
  $validated = $request->validate([
    'post' => ['required', new MultiByteCharacter(100)],
  ]);
}

参考リンク

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0