開発環境
- 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)],
]);
}