我有以下实体字段:
/**
* @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
任何解决方法?我希望在一个地方使用正则表达式模式,即在我的实体中,而不是在控制器或表单中。
答案 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验证。