繁体   English   中英

形式从 symfony2.8 升级到 3.0 时向后兼容性中断

[英]Backward compatibility breaks in forms upgrading from symfony2.8 to 3.0

因此,我一直拖着脚步从 symfony 2.8 升级到 3.0(或实际上是现在的目标 3.4)与之前的一些小更新一样麻烦。 有些框架就是喜欢强迫你重写代码,我猜......

无论如何,我知道这已在许多其他帖子中得到处理,但我想让它万无一失,就像“傻瓜的 symfony 表单”将您的表单从 symfony 2.8 移动到 3.0 一样。

如果您通过 app_dev.php 运行您的应用程序,您会在页脚中获得关于不推荐使用的内容的很好的提示,换句话说,哪些内容在 3.0 版中不起作用。

此特定问题的弃用消息是:

将类型实例传递给 FormBuilder::add()、Form::add() 或 FormFactory 已从 2.8 版开始被弃用,并且在 3.0 中将不受支持。 改用完全限定的类型类名

我必须对表单做的第一件事是更改从控制器调用它们的方式。 symfony 文档满意地说:

前:

$form = $this->createForm(new MyType());

后:

$form = $this->createForm(MyType::class);

但是等等,那么我如何传递我的变量? 我的表单调用看起来更像这样:

$form = $this->createForm(new extraOpeningType($user), $extraOpening);

我传递了与表单匹配的实体,以及用于许可目的的附加实体。 对于 Sensiolabs 的优秀变更日志人员来说,这个问题甚至不足以对其发表评论。

其他人注意到了这一点并在这里写了一个问题( https://github.com/symfony/symfony/issues/18662 ),尽管他的示例代码中有一个或两个错字。 这里还有一篇 SO 文章( Passing data to buildForm() in Symfony 2.8, 3.0 and above )对解决这个问题非常有帮助。

所以就我而言,在 symfony3.0 之前的版本中,我曾经这样调用表单:

$form = $this->createForm(new extraOpeningType($user), $extraOpening);

$user 是我在表单数据中出于权限处理目的而传入的变量,而 $extraOpening 是与表单匹配的实际实体。 从现在开始,您现在必须通过以下方式传递这些变量:

use ExtraOpeningBundle\Form\ExtraOpeningType as extraOpeningType; //this goes in the controller head, among your USE statements
...
$form = $this->createForm(extraOpeningType::class, $extraOpening, ['user' => $user]);

如果你不想在头部使用 USE 语句,你可以把完全限定的路径放到你的 Type 中,像这样(注意 Type 路径上的前导反斜杠):

$form = $this->createForm(\ExtraOpeningBundle\Form\ExtraOpeningType::class, $extraOpening, ['user' => $user]);

在接收方,在您的表单中(类型,如 symfony 所称),您之前有一个构造函数来拉入传递的变量......

class ExtraOpeningType extends AbstractType
{
    function __construct($user)
    {
        $this->user = $user;
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $user = $this->user;

现在它看起来像这样:

class ExtraOpeningType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $this->user = $options['user'];  

尽管您需要将刚刚创建的这个自定义选项添加到批准的选项列表中,否则您将面临一个错误,指出“用户”不是一个有效的选项。 因此,修改您的 configureOptions 方法如下(如果您尚未使用该方法,请创建该方法):

class ExtraOpeningType extends AbstractType
{

...

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'user' => null
        ));
    }

Symfony 通常是一个梦想,但在更新时它可能是一场噩梦。 许多向后兼容性中断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM