symfony 4中`getBlockPrefix`的限制值

时间:2018-06-14 07:23:45

标签: forms symfony symfony4

我使用symfony 4构建一个简单的CRUD 我的一个实体名为Color。没什么好看的。它只有4个属性:name,description,sortOrder和id(PK) 我还构建了一个表单类,以便能够添加/编辑我的实体实例。 表格如下:

<?php
namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;

class Color extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('id', HiddenType::class)
            ->add('name', TextType::class)
            ->add('description', TextareaType::class, ['required' => false])
            ->add('sort_order', IntegerType::class);
    }
}

当我尝试渲染表单时出现错误

  

在渲染模板期间抛出异常(&#34; Catchable Fatal Error:类App的实体\ Entity \ Color无法转换为字符串&#34;)。

我有其他形式看起来相似但它们有效。

如果我不让symfony根据类名决定块前缀并添加方法

public function getBlockPrefix()
{
    return 'anything-else-but-color';
}

然后呈现表格 我不想这样做,因为我的应用程序有点#&#34;惯例&#34;基于,我需要实体类名称和表单名称之间的匹配 我知道我可以更改实体和表单类名称(我可能会这样做)但这会让我感到困惑,因为我不知道会发生什么,以及是否还有其他可能的保留字搞砸我的应用程序。

其他信息...
我可以部分调试这个。
我看到,当表单生成时会生成类似的内容

<input type="color" id="color" name="color" class="form-control" ....

(注意类型颜色) 对于以相同方式构建的不同实体和表单(名为group),我将其呈现在与上面相同的位置。

<div id="group">...

所以我的问题是:

  1. 表格中是否有任何不能用于getBlockPrefix的保留字?
  2. 我是否可以使用单词color作为块前缀,而不会跳过许多箍?

1 个答案:

答案 0 :(得分:1)

documentation涉及到这一点:

  

当表单类的名称与任何内置字段匹配时   类型,则您的表单可能无法正确呈现。名为的表单类型   App\Form\PasswordType将具有与内置块相同的块名   PasswordType,并且无法正确呈现。覆盖   getBlockPrefix()方法返回唯一的块前缀(例如   app_password)以避免冲突。

但是,出于完整性考虑,根据您的评论,我希望这会在您的表单类型称为ColorType时触发:

  

我认为它对我来说是崩溃的,因为在课程末尾的Type   名称将被忽略。   StringUtil::fqcnToBlockPrefix('Symfony\Component\Form\Extension\Core\Type\ColorType');   并且StringUtil::fqcnToBlockPrefix('Whatever\YouWant\Color');返回   同一件事:color