4

エンティティのすべての検証制約を取得し、これらの制約をJquery検証ルールに変換しようとしていますが、現在、アノテーションで定義された制約を取得できません(Symfony2はエンティティの検証制約を取得します)が、xmlとymlの取得に問題がありますもの。

$xml_file_loader = new XmlFileLoader("path_to_my_project/vendor/friendsofsymfony/user-bundle\FOS\UserBundle\Resources\config\validation.xml");

同様のコードを使用するということは、xml / ymlファイルがどこにあるかを事前に知る必要があることを意味します。これを自動的に実行できる汎用コードを、なんとかして書き込もうとしています。

すべての制約を一度に取得する方法はありませんか?そうでない場合は、xml / ymlファイルの場所をどのように知ることができますか?また、継承の場合は、親の制約を確認する必要があります...これは実行可能ですか?

4

1 に答える 1

5
private function getValidations()
    {
        $validations=[];
        $validator=$this->get("validator");
        $metadata=$validator->getMetadataFor(new your_entity());
        $constrainedProperties=$metadata->getConstrainedProperties();
        foreach($constrainedProperties as $constrainedProperty)
        {
            $propertyMetadata=$metadata->getPropertyMetadata($constrainedProperty);
            $constraints=$propertyMetadata[0]->constraints;
            $outputConstraintsCollection=[];
            foreach($constraints as $constraint)
            {
                $class = new \ReflectionObject($constraint);
                $constraintName=$class->getShortName();
                $constraintParameter=null;
                switch ($constraintName) 
                {
                    case "NotBlank":
                        $param="notBlank";
                        break;
                    case "Type":
                        $param=$constraint->type;
                        break;
                    case "Length":
                        $param=$constraint->max;
                        break;
                }
                $outputConstraintsCollection[$constraintName]=$param;
            }
            $validations[$constrainedProperty]=$outputConstraintsCollection;
        }
        return $validations;
    }

戻り値:

array(13) (
      [property1] => array(4) (
        [NotBlank] => (string) notBlank
        [NotNull] => (string) notBlank
        [Type] => (string) string
        [Length] => (int) 11
      )
      [property2] => array(4) (
        [NotBlank] => (string) notBlank
        [NotNull] => (string) notBlank
        [Type] => (string) string
        [Length] => (int) 40
      )
      ..........
)

返された配列は、使用しているクライアント側の検証ライブラリ/コードに応じて、クライアント側の検証ルールを定義するために構成または使用できます。

$validator=$this->get("validator");
$metadata=$validator->getMetadataFor(new yourentity());

これで、オブジェクト$metadataには、特定のエンティティに関係する検証に関するすべてのメタデータが含まれます。

于 2013-04-26T04:58:23.353 に答える