【问题标题】:Symfony form - Choicetype - Error "Array to string covnersion"Symfony 表单 - Choicetype - 错误“数组到字符串转换”
【发布时间】:2019-01-15 14:07:56
【问题描述】:

我正在运行带有 FosUserBundle 的 Symfony 3.4。 我定制了注册表以获取包含的Roles

<?php

    $form->add('roles', ChoiceType::class, array(
        'choices' => array(
            'user' => 'ROLE_USER',
            'admin' => 'ROLE_ADMIN'
        ),
        'label' => 'Role :',
        'expanded' => true,
        'multiple' => true
    ));

然后,现在可以通过 2 个新复选框在注册表单中选择角色...但我想用 &lt;select&gt; 标记显示它。当我将expanded 选项设置为false 时,我得到了一个选择,但如果我将multiple 选项设置为FALSE,我得到一个错误:

数组到字符串的转换

有什么办法可以解决我的问题吗?

编辑:下面是堆栈跟踪:

Symfony\Component\Debug\Exception\ContextErrorException:
Notice: Array to string conversion

  at vendor\symfony\symfony\src\Symfony\Component\Form\ChoiceList\ArrayChoiceList.php:73
  at Symfony\Component\Form\ChoiceList\ArrayChoiceList->Symfony\Component\Form\ChoiceList\{closure}(array('ROLE_USER'))
  at call_user_func(object(Closure), array('ROLE_USER'))
     (vendor\symfony\symfony\src\Symfony\Component\Form\ChoiceList\ArrayChoiceList.php:158)
  at Symfony\Component\Form\ChoiceList\ArrayChoiceList->getValuesForChoices(array(array('ROLE_USER')))
     (vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\DataTransformer\ChoiceToValueTransformer.php:32)
  at Symfony\Component\Form\Extension\Core\DataTransformer\ChoiceToValueTransformer->transform(array('ROLE_USER'))
     (vendor\symfony\symfony\src\Symfony\Component\Form\Form.php:1104)
  at Symfony\Component\Form\Form->normToView(array('ROLE_USER'))
     (vendor\symfony\symfony\src\Symfony\Component\Form\Form.php:350)
  at Symfony\Component\Form\Form->setData(array('ROLE_USER'))
     (vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper.php:49)
  at Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper->mapDataToForms(object(User), object(RecursiveIteratorIterator))
     (vendor\symfony\symfony\src\Symfony\Component\Form\Form.php:383)
  at Symfony\Component\Form\Form->setData(object(User))
     (vendor\friendsofsymfony\user-bundle\Controller\RegistrationController.php:70)
  at FOS\UserBundle\Controller\RegistrationController->registerAction(object(Request))
  at call_user_func_array(array(object(RegistrationController), 'registerAction'), array(object(Request)))
     (var\cache\dev\classes.php:4659)
  at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), 1)
     (var\cache\dev\classes.php:4614)
  at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), 1, true)
     (vendor\symfony\symfony\src\Symfony\Component\HttpKernel\Kernel.php:200)
  at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
     (web\app_dev.php:29)

【问题讨论】:

  • 堆栈跟踪中还有更多信息吗?
  • 尝试添加'empty_value' =&gt; null
  • 你应该使用 'expanded' => false 和 'multiple' => true
  • @MatthewUsurp 我在第一个主题中添加了堆栈跟踪。
  • @gogaz 如果我添加它,我会收到一个新错误:选项“empty_value”不存在

标签: php symfony symfony-forms symfony-3.4


【解决方案1】:

要解决您的问题,您需要一个数据转换器,因为角色字段实际上是一个数组:

将数据转换器与角色字段一起添加到您的 FormType 类中,而不是将其添加到控制器中:

$builder->add('roles', ChoiceType::class, array(
    'choices' => array(
        'user' => 'ROLE_USER',
        'admin' => 'ROLE_ADMIN'
    ),
    'label' => 'Role :'
));

//roles field data transformer
$builder->get('roles')
    ->addModelTransformer(new CallbackTransformer(
        function ($rolesArray) {
             // transform the array to a string
             return count($rolesArray)? $rolesArray[0]: null;
        },
        function ($rolesString) {
             // transform the string back to an array
             return [$rolesString];
        }
));

【讨论】:

    【解决方案2】:

    发生的事情是正常的:您的属性角色是一个字符串数组。在你的实体中,你得到了类似的东西:

    /**
     * @var array
     */
    private $roles = [];
    

    而且从逻辑上讲,当您输入选项 multiple => 'true' 时,Symfony 表单会将其视为一个数组并将数组的每个元素转换为字符串(它们已经是)。

    另一方面,如果你把多个 => 设为 false,它会认为数组是一个单一的选择,它不是。

    简单地说,您的角色属性是字符串数组的模型与您尝试创建的表单之间存在不一致,该表单将角色视为单个值。

    在您的情况下,您必须放置多个 => true。

    【讨论】:

    • 如果你坚持要多个=> false,我建议你看看答案answer这正是你的问题
    【解决方案3】:

    2020 - Symfony 5.0.8:

    在您的 FormType 文件中:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('roles', ChoiceType::class, [
                'required' => true,
                'multiple' => false,
                'expanded' => false,
                'choices'  => [
                    'User' => 'ROLE_USER',
                    'Admin' => 'ROLE_ADMIN',
                ],
            ]);
    
        $builder->get('roles')
            ->addModelTransformer(new CallbackTransformer(
                function ($rolesArray) {
                    // transform the array to a string
                    return count($rolesArray)? $rolesArray[0]: null;
                },
                function ($rolesString) {
                    // transform the string back to an array
                    return [$rolesString];
                }
            ));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 2012-07-15
      • 2020-09-15
      • 2017-12-02
      • 2013-06-23
      • 2013-08-24
      相关资源
      最近更新 更多