我使用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">...
所以我的问题是:
getBlockPrefix
的保留字? color
作为块前缀,而不会跳过许多箍? 答案 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