Php Symfony2表格及;条令:将具有多个地址的EmailType持久化到简单的\u数组中
似乎没有直接的方法可以通过Symfony 2表单将Php Symfony2表格及;条令:将具有多个地址的EmailType持久化到简单的\u数组中,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,似乎没有直接的方法可以通过Symfony 2表单将的结果保存到条令的简单数组字段中 详情: 我的实体是简单数组类型: 表单类型具有 $builder->add('emails',EmailType::class,array('attr'=>array('multiple'=>'multiple')) 呈现(如预期的那样): 现在,当我在表单中输入两个电子邮件地址时(如HTML5所预期的那样,逗号分隔),实体将收到一个逗号分隔的字符串 但是,当持久化到simple_array字段时,条令
的结果保存到条令的简单数组
字段中
详情:
- 我的实体是
:简单数组类型
- 表单类型具有
$builder->add('emails',EmailType::class,array('attr'=>array('multiple'=>'multiple'))代码>
- 呈现(如预期的那样):
simple_array
字段时,条令需要一个数组,它会调用infrade()
因此,我得到的错误消息是:警告:内爆():传递的参数无效
原因:Symfony在将逗号分隔的字符串交给Doctrine之前不会将其分解为数组
解决方案:手动执行:$entity->setEmails(分解(',',$entity->getEmails())代码>
所以最后我的问题是:有没有更简单的方法呢?我可以为这个表单字段推荐ModelTransformer。Transformer将把值从数组转换为字符串作为表单,从字符串转换为数组作为条令
也许您可以在实体的setter中完成,通过测试给定的参数是字符串还是数组
public function setEmails($emails)
{
if (is_string($emails)) {
$emails = explode(',', $emails);
}
$this->emails = $emails;
}
在@Max p.和@jeremy的回答之后:
两种方法原则上都有效!但是,它们破坏了验证(参见注释)
下面是我最终提出的启用验证的方法:
跟随
您甚至可以使用All
约束对每个数组元素应用验证:
谢谢 这-有点-有效;-)副作用是它破坏了验证:从LengthValidator.php
发出的错误消息预期参数类型为“string”,“array”给定
,如果您正在等待数组,则无法对字符串进行验证。我将第一个函数更改为return$original代码>(原因内爆()
失败,因为$original
是一个字符串)。副作用是它破坏了验证:错误消息来自LengthValidator.php
的类型为“string”、“array”的预期参数。明天我要做更多的测试…你不能为数组类型fieldsSinceexplode()
在空输入上添加字符串验证器如果不返回空数组,最好包含if(empty($submitted))
public function setEmails($emails)
{
if (is_string($emails)) {
$emails = explode(',', $emails);
}
$this->emails = $emails;
}
// src/AppBundle/Validator/Constraints/Array255Validator.php
class Array255Validator extends ConstraintValidator
{
public function validate($value, Constraint $constraint)
{
$string = implode(',', $value);
if (strlen($string) > 255) {
$this->context->buildViolation($constraint->message)
->setParameter('%string%', $string) // use $string here, since $value is an array!
->addViolation();
}
}
}
properties:
email:
- AppBundle\Validator\Constraints\Array255: ~
- All:
- NotBlank: ~
- Length:
min: 5
- Email:
checkMX: true
message: "Some message for {{ value }}"