断言\正则表达式和TypeGuessing

时间:2016-03-01 10:13:50

标签: symfony symfony-forms

我有以下实体字段:

/**    
* @Assert\Regex(
*   pattern = "/^d+\.(jpg|png|gif)$/",
*   htmlPattern = "/^d+\.(jpg|png|gif)$/"
* )
**/

protected $src;

表单由以下内容创建:

$builder
   ->add('src', TextareaType::class, array( //neither is TextType::class working
      'attr' => array('class' => 'mysrc'),
)); //pattern will not be rendered

问题是,只要我提供字段类型类TextareaType::class,正则表达式模式就不会呈现为表单的约束。或者换句话说:如果猜测字段类型,则仅渲染正则表达式模式:

$builder
   ->add('src', null, array(    
      'attr' => array('class' => 'mysrc'),
)); //pattern will be rendered

任何解决方法?我希望在一个地方使用正则表达式模式,即在我的实体中,而不是在控制器或表单中。

2 个答案:

答案 0 :(得分:3)

Yepp,这是应该如何运作的。不仅猜测了字段类型,而且还有一些选项,如果类型没有猜到选项也没有。

BTW textarea元素不支持pattern属性,但是如果你想要添加一个:'attr' => array('pattern' => '/jsregex/'),你应该使用不同于客户端的模式而不是服务器端。如果您想在一个地方提供模式,请使用constant

答案 1 :(得分:1)

也许这个可以帮到你:

<强> FormType

use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\Validator\Constraints\Regex;
use YourBundle\Entity\YourEntity;

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

public function getRegexPattern($property)
{
    $pattern = null;
    $metadata = $this->validator->getMetadataFor(new YourEntity());
    $propertyMetadata = $metadata->getPropertyMetadata($property);
    $constraints = $propertyMetadata[0]->constraints;

    foreach($constraints as $constraint) {
        if ($constraint instanceof Regex) {
            $pattern = $constraint->pattern;
        }
    }

    return $pattern;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('src', TextType::class, array(
        'attr' => array(
            'class' => 'mysrc',
            'pattern' => $this->getRegexPattern('src')
        ),
    )); 
}

services.yml (需要在类型中注入验证程序)

services:
    app.form.type.your_entity_type:
        class: YourBundle\Form\YourEntityType
        arguments:
            validator: "@validator"
        tags:
            - { name: form.type }

<强>渲染

<input type="text" pattern="/^d+\.(jpg|png|gif)$/" class="src"/>

像这样,即使手动设置TextType,也可以通过从属性约束中检索到的模式获得html验证。