Php Symfony2-使用自定义表单类型&x27;调用createForm;s名称/别名抛出“s”;无法加载类型“;例外

Php Symfony2-使用自定义表单类型&x27;调用createForm;s名称/别名抛出“s”;无法加载类型“;例外,php,forms,symfony,Php,Forms,Symfony,我正在阅读关于将表单定义为服务的文档,并遵循了指南。但我一直遇到以下错误: 无法加载类型“提交” 这是我的服务。yml services: submission.form.type.submission: class:Awesome\SubmissionBundle\Form\Type\SubmissionType tags: - {name: form.type, alias: submission} 这是我的表格 <?p

我正在阅读关于将表单定义为服务的文档,并遵循了指南。但我一直遇到以下错误:

无法加载类型“提交”

这是我的
服务。yml

services:
    submission.form.type.submission:
        class:Awesome\SubmissionBundle\Form\Type\SubmissionType
        tags:
            - {name: form.type, alias: submission}
这是我的表格

<?php

namespace Awesome\SubmissionBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class SubmissionType extends AbstractType 
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('contact', 'text')
            ->add('message', 'textarea')
            ->add('submit', 'submit')
        ;
    }

    public function getName() 
    {
        return 'submission';
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    {
        $resolver->setDefaults(array(
            'data_class' => 'Awesome\SubmissionBundle\Entity\Submission',
        ));
    }
}
无论我将配置放在何处,命令
container:debug submission.form.type.submission
总是给出相同的输出,这对我来说似乎很好:

[container] Information for service submission.form.type.submission
Service Id       submission.form.type.submission
Class            Awesome\SubmissionBundle\Form\Type\SubmissionType
Tags
    - form.type                      (alias: submission)
Scope            container
Public           yes
Synthetic        no
Required File    -
还有一个问题: 它是
data\u class
,而不是
data

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{
    $resolver->setDefaults(array(
        'data_class' => 'Awesome\SubmissionBundle\Entity\Submission',
    ));
}
还有一个问题: 它是
data\u class
,而不是
data

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{
    $resolver->setDefaults(array(
        'data_class' => 'Awesome\SubmissionBundle\Entity\Submission',
    ));
}

我认为您的问题在于在编译器类中加载services.yml。 “form.type”标记的加载也发生在编译器类中(
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\FormPass
)。因此,您的CompilerPass在表单CompilerPass之后执行,它将找不到您的表单类型

如果您使用的是Symfony标准版,并且您已使用创建了捆绑包,则DependencyInjection文件夹中将有一个
AwesomeSubmissionExtension
类,用于加载服务文件

以下代码是加载yaml文件时更改的扩展代码。(默认为XmlFileLoader)


我认为您的问题在于在编译器类中加载services.yml。 “form.type”标记的加载也发生在编译器类中(
Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\FormPass
)。因此,您的CompilerPass在表单CompilerPass之后执行,它将找不到您的表单类型

如果您使用的是Symfony标准版,并且您已使用创建了捆绑包,则DependencyInjection文件夹中将有一个
AwesomeSubmissionExtension
类,用于加载服务文件

以下代码是加载yaml文件时更改的扩展代码。(默认为XmlFileLoader)


名称空间中的不匹配是您的复制/粘贴/编辑失败,对吗?类名称空间
Awesome\SubmissionBundle\Form\Type与服务定义中的
Guide\SubmissionBundle\Form\Type\SubmissionType
不匹配。你清除缓存了吗?@nifr是的,我已经编辑了。我已经编辑了你问题中的代码。请确保代码中没有选项卡。此外,我建议您坚持使用symfony2,即方法声明。执行
this->createForm($this->get('submission.form.type.submission'),$submission)工作?@nifr没有意识到我的IDE正在放置标签。谢谢你发现了!是的,这确实有效。但我仍然想知道为什么文档化的方式不起作用?你发布的内容应该有效。删除缓存。名称空间中的不匹配是您的复制/粘贴/编辑失败,对吗?类名称空间
Awesome\SubmissionBundle\Form\Type与服务定义中的
Guide\SubmissionBundle\Form\Type\SubmissionType
不匹配。你清除缓存了吗?@nifr是的,我已经编辑了。我已经编辑了你问题中的代码。请确保代码中没有选项卡。此外,我建议您坚持使用symfony2,即方法声明。执行
this->createForm($this->get('submission.form.type.submission'),$submission)工作?@nifr没有意识到我的IDE正在放置标签。谢谢你发现了!是的,这确实有效。但我仍然想知道为什么文档化的方式不起作用?你发布的内容应该有效。删除缓存。
namespace Awesome\SubmissionBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;

class AwesomeSubmissionExtension extends Extension
{
    /**
     * {@inheritDoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
    }
}