2013-03-22 51 views
4

我試圖獲得實體上的所有驗證約束並將約束轉換爲Jquery驗證規則,現在我們能夠獲得註釋定義的約束(感謝: Symfony2 get validation constraints on an entity),但即時通訊xml和yml的一些麻煩。symfony2獲取對實體的所有驗證約束條件(yml,xml,annotations)

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

使用類似的代碼意味着,我需要事先知道其中的XML/YML文件所在,I M試圖以某種方式寫一個通用的代碼,可以自動執行此操作。

沒有辦法一次獲得所有約束嗎?如果不是我怎麼知道xml/yml文件的位置,並且在繼承的情況下,我需要檢查父級約束......這是可行的嗎?

+0

你可以使用這個理由 - https://github.com/Abhoryo/APYJsFormValidationBundle。 – 2013-03-24 21:54:50

+0

我已經試過了,它只能得到註釋限制... – Youssef 2013-03-25 08:53:52

回答

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現在包含所有元數據abou t涉及您的特定實體的驗證。

+0

還有沒有更好的方法? – 2014-12-01 21:06:36

+0

我在這裏添加一個問題(我知道很久以前)。我已經跟着你的腳本,它很順利。但是在我的constraint.yml中,我在我的消息中使用了{{limit}},當我使用腳本時,這個關鍵字不會被symfony解析。你有辦法嗎? – Eagle1 2015-01-06 12:35:10

+0

我試過了,它並不在乎父母的約束。 – Alsatian 2016-07-08 16:48:06