カテゴリ: Symfony 更新日: 2025/11/25

Symfonyでカスタムバリデーションルールを作成する方法!初心者にもやさしく解説

Symfonyでカスタムバリデーションルールを作成する方法
Symfonyでカスタムバリデーションルールを作成する方法

先生と生徒の会話形式で理解しよう

生徒

「Symfonyで自分だけの特別なバリデーションルールって作れるんですか?」

先生

「はい、Symfonyでは標準のバリデーションルールに加えて、自作のカスタムバリデーションルールを作成できます。」

生徒

「へえ!じゃあ例えば、郵便番号が「123-4567」みたいな形式じゃないとエラーにしたい時も?」

先生

「まさにそれがカスタムバリデーションの出番です。では一緒に作り方を見ていきましょう!」

1. Symfonyでカスタムバリデーションを作るとは?

1. Symfonyでカスタムバリデーションを作るとは?
1. Symfonyでカスタムバリデーションを作るとは?

Symfony(シンフォニー)では、Constraint(制約)というクラスを使って入力値を検証します。標準でも NotBlankEmail など多くのバリデーションルールがありますが、自分で「独自のルール」を作りたい場合は カスタムConstraint を作成します。

カスタムバリデーションでは、主に以下の2つのファイルを作ります:

  • ① ルール本体のクラス(Constraint)
  • ② 実際の判定処理をするクラス(ConstraintValidator)

2. どんな場面で使うの?初心者向けにイメージしよう

2. どんな場面で使うの?初心者向けにイメージしよう
2. どんな場面で使うの?初心者向けにイメージしよう

例えば、会員登録の時に「電話番号が090や080ではじまる10桁の数字でなければならない」といった条件を追加したいとします。これをバリデーションルールとして登録することで、ユーザーが間違った形式の電話番号を入力した場合に「エラーメッセージ」を表示できます。

これは「条件によってエラーにしたい」という要求をプログラムでチェックすることです。

3. Constraintクラスを作成しよう

3. Constraintクラスを作成しよう
3. Constraintクラスを作成しよう

まずはルールの「名前」と「メッセージ」を定義するクラスを作成します。


namespace App\Validator;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class ZipCode extends Constraint
{
    public $message = '郵便番号は「123-4567」の形式で入力してください。';
}

このクラスでは、バリデーションエラーが発生したときに表示するメッセージを設定しています。

4. ConstraintValidatorを作成しよう

4. ConstraintValidatorを作成しよう
4. ConstraintValidatorを作成しよう

続いて、実際に条件に合っているかどうかを「判断」するクラスを作ります。ここが本体です。


namespace App\Validator;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class ZipCodeValidator extends ConstraintValidator
{
    public function validate($value, Constraint $constraint)
    {
        if (!preg_match('/^\d{3}-\d{4}$/', $value)) {
            $this->context->buildViolation($constraint->message)
                ->addViolation();
        }
    }
}

このコードでは、郵便番号が「123-4567」のような形式かどうかを preg_match で確認しています。正しくなければエラーメッセージを出します。

5. エンティティで使ってみよう

5. エンティティで使ってみよう
5. エンティティで使ってみよう

作成したカスタムバリデーションを、実際に使いたい場所(エンティティなど)に指定します。


use App\Validator\ZipCode;

class User
{
    /**
     * @ZipCode
     */
    protected $postalCode;
}

このように、属性の上に @ZipCode と書くだけで、Symfonyが自動的に先ほどのルールを適用してくれます。

6. サービスとして登録する必要がある?

6. サービスとして登録する必要がある?
6. サービスとして登録する必要がある?

いいえ。Symfony 5.3以降では、アノテーションを使っていれば自動でサービス登録されます。古いバージョンでは、services.yamlに手動で記述が必要な場合もありますが、最新の環境では不要です。

7. よくあるミスやエラー例と対処法

7. よくあるミスやエラー例と対処法
7. よくあるミスやエラー例と対処法

初心者の方がよくハマるポイントは以下のとおりです:

  • クラス名とファイル名が一致していない(大文字・小文字)
  • Validatorクラスの名前が Constraint名 + Validator になっていない
  • バリデータークラスに validate() メソッドを正しく書いていない
  • バリデーションを使う対象に @ZipCode を忘れている

これらの点を見直すとエラーが解消することが多いです。

8. 他にも作れる!自由なルールでバリデーションしよう

8. 他にも作れる!自由なルールでバリデーションしよう
8. 他にも作れる!自由なルールでバリデーションしよう

今回紹介した「郵便番号」以外にも、以下のようなカスタムバリデーションが考えられます:

  • ニックネームに絵文字を含めない
  • パスワードに特定の単語を禁止する
  • 生年月日が未来になっていないか
  • メールアドレスが会社のドメイン(例:example.co.jp)になっているか

これらも同じように ConstraintConstraintValidator を使えば簡単に追加できます。

関連記事:
カテゴリの一覧へ
新着記事
New1
Laravel
Laravelの認証状態をチェックする方法を完全解説!authとAuth::check()を初心者向けにやさしく説明
New2
CodeIgniter
CodeIgniterのコントローラクラスの作り方を完全ガイド!初心者でもわかる基礎から実践まで
New3
Symfony
Symfonyのフォームラベルを多言語対応!初心者でもわかる翻訳設定ガイド
New4
Laravel
Laravelでユーザー登録機能を作る方法!初心者向けにバリデーションとリダイレクトをやさしく解説
人気記事
No.1
Java&Spring記事人気No1
Laravel
Laravelのデータベース設定方法を完全ガイド!初心者でもわかる.envファイルの使い方
No.2
Java&Spring記事人気No2
Laravel
Laravelのビューとは?Bladeテンプレートの基本を解説
No.3
Java&Spring記事人気No3
Laravel
Laravelでセッションを扱う方法!保存方法と利用例を解説
No.4
Java&Spring記事人気No4
Laravel
Laravelのルート一覧を確認する方法!初心者でもわかるphp artisan route:listの使い方
No.5
Java&Spring記事人気No5
Laravel
Laravelでルーティングを設定する方法!web.phpと基本ルートの書き方を初心者向けに徹底解説
No.6
Java&Spring記事人気No6
Laravel
Laravelのルートキャッシュ機能を活用してパフォーマンス改善!初心者でもわかる完全ガイド
No.7
Java&Spring記事人気No7
Laravel
LaravelでルートをBladeテンプレートに記述する方法(route関数)
No.8
Java&Spring記事人気No8
Laravel
Laravelでログを出力する方法(Monolog・storage/logs)