choice_value:在非对象上调用成员函数getSlug()

时间:2016-12-31 17:13:50

标签: symfony

我使用Symfony 3.2 ,在formType中使用choice_value时出现此错误:

Error: Call to a member function getSlug() on a non-object" at D:\wamp\www\my_project\src\AppBundle\Form\Bien\BienType.php line 77 
use AppBundle\Entity\Ville;

//...

->add('ville', EntityType::class, array(
    'class' => 'AppBundle:Ville',
    'label' => 'Ville',
    'choice_label' => 'nom',
    'placeholder' => 'Ville ',
    'multiple' => false,
    'expanded' => false,
    'choice_value' => function ($ville) {
         /** @var Ville $ville */
         return $ville->getSlug();
    },
))

我在Symfony 3.1 的另一个项目中使用了相同的代码,它运行良好,问题来自Symfony版本吗?

修改

我已使用choice_label对其进行了测试,并且没有任何错误正常工作:

'choice_label' => function ($ville) {
    /** @var Ville $ville */
    return $ville->getSlug();
},

编辑2:

今天我已经安装了Symfony 3.1并且我测试了choice_value并且我得到了相同的错误但是几个月前安装的ancien Symfony3.1没有错误。 我认为Symfony上有一些更新并导致错误,是否可能?

2 个答案:

答案 0 :(得分:1)

(自2.7起)choice_value选项也被to transform the initial data to string value使用,即如果你传递一个闭包函数,你也可以控制初始数据转换,如果它是null,你需要先检查一下才能拨打$ville->getSlug()

'choice_value' => function (Ville $ville = null) {
    return $ville ? $ville->getSlug() : '';
},

在这种情况下,typehint很好,您有一个签名约束和IDE自动完成,但是您需要设置默认null以避免null初始数据的类型提示异常。

我认为应该记录下来,因为开发人员希望(与其他choice_*一样)只处理'choices'选项。

答案 1 :(得分:0)

解决:

现在使用这样的方法很好:

'choice_value' => function ($ville) {
                /** @var Ville $ville */
                return $ville ? $ville->getSlug() : '';
            },

或者像这样:

'choice_value' => function (Ville $ville = null) {

                return $ville ? $ville->getSlug() : '';
            },

github.com/symfony/symfony/issues/21116