🎻

[Symfony] エンティティのプロパティが必須項目かどうかをフォーム以外でも表示したい

2020/06/16に公開

やりたかったこと

フォームをレンダリングするとFormTypeの required オプションの値に応じてビューに自動でクラスを付けるといったことは簡単にできますよね。

これをフォームを通さずにやりたかったのです。

  • 一覧画面
  • 詳細画面
  • 編集画面

があって、編集画面だけじゃなく一覧画面や詳細画面でもそのプロパティが必須かどうかを表示したかった。

やったこと

エンティティのインスタンスとプロパティ名を渡すと必須項目かどうかを判定してくれるTwig関数を作りました。便利です。

<th class="{% if isRequired(user, 'email') %}required{% endif %}">{{ user.email }}</th>

やり方

「必須項目かどうか」の判定基準は「エンティティのプロパティに @Assert\NotBlank() アノテーションが付いているかどうか」としました。

これなら、Validatorコンポーネントの ClassMetadata クラスにアクセスすれば判定できます。

具体的なコードは以下のとおり。(Twig Extensionのコードです)

class AppExtension extends AbstractExtension
{
    private $validator;

    public function __construct(ValidatorInterface $validator)
    {
        $this->validator = $validator;
    }

    public function getFunctions()
    {
        return [
            new TwigFunction('isRequired', [$this, 'isRequired']),
        ];
    }

    public function isRequired($entity, $propertyName): bool
    {
        /** @var ClassMetadata $classMetadata */
        $classMetadata = $this->validator->getMetadataFor($entity);
        $propertyMetadataList = $classMetadata->getPropertyMetadata($propertyName);

        foreach ($propertyMetadataList as $propertyMetadata) {
            foreach ($propertyMetadata->getConstraints() as $constraint) {
                if (NotBlank::class === get_class($constraint)) {
                    return true;
                }
            }
        }

        return false;
    }
}

参考:php - Extract constraints form Doctrine 2 entity in symfony 2 - Stack Overflow

GitHubで編集を提案

Discussion