Php Symfony2表格及;条令:将具有多个地址的EmailType持久化到简单的\u数组中

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字段时,条令

似乎没有直接的方法可以通过Symfony 2表单将
的结果保存到条令的
简单数组
字段中

详情:

  • 我的实体是
    简单数组类型
  • 表单类型具有
    $builder->add('emails',EmailType::class,array('attr'=>array('multiple'=>'multiple'))
  • 呈现(如预期的那样):

现在,当我在表单中输入两个电子邮件地址时(如HTML5所预期的那样,逗号分隔),实体将收到一个逗号分隔的字符串

但是,当持久化到
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”的预期参数。明天我要做更多的测试…你不能为数组类型fieldsSince
explode()
在空输入上添加字符串验证器如果不返回空数组,最好包含
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 }}"