Silex FormServiceProvider无法加载类型“”;形式“;使用Symfony3组件时


Silex FormServiceProvider could not load type "form" when using Symfony3 Components

当尝试构建表单时,我收到以下错误:

FormRegistry.php中的InvalidArgumentException第87行:无法加载类型"表单"

我已经注册了FormServiceProvider、TranslationServiceProvider和ValidatorServiceProvider。

这是我代码的相关部分:

        $this->_form = $this->_app['form.factory']->createBuilder('form', $this->_map())
        ->add('firstName', 'text', [
            'constraints' => [new Assert'NotBlank()]
        ])
        ->add('lastName', 'text', [
            'constraints' => [new Assert'NotBlank()]
        ])
        ->add('email', 'text', [
            'constraints' => [new Assert'Email()]
        ])
        ->getForm();

以下是我正在使用的相关组件的版本号:

silex/silex v1.3.4 PHP微框架基于Symfony组件symfony/安全核心
v3.0.1 Symfony安全组件-核心库symfony/security csrf v3.0.1 symfony security组件-CSRF库symfony/translation v3.0.1Symfony翻译组件symfony/twick桥接v3.0.1 symfony-Twicg桥接symfony/validator v3.0.1 symfony validator组件symfony/form v3.0.1

我能够在以前版本的Silex中成功地做到这一点;是什么东西坏了还是我错过了什么?

最新版本的Silex似乎不适用于Symfony Forms v3。要使其工作,请将composer文件中的requires替换为:

{
    "require": {
        "silex/silex": "^1.3",
        "symfony/form": "~2.3",
        "symfony/security-csrf": "~2.3"
    }
}

您实际上可以将Symfony Form 3与Silex一起使用,但createBuilder函数现在要求您遵守将类型作为参数传入的新方法。Silex文件尚未更新以反映这一点。

在2.8之前的版本中,类型通常以字符串形式传入,如"form"、"text"、"email"等,Symfony组件将其解析为正确的类。现在您必须传入一个类名。

所以,以前的form现在变成了Symfony'Component'Form'Extension'Core'Type'FormType::class。并且CCD_ 5变为CCD_。当然,您可以导入这些类,这样就不必使用完整的名称空间。

这个线程中发布的特定问题可以使用以下代码修复:

use Symfony'Component'Form'Extension'Core'Type'FormType;
use Symfony'Component'Form'Extension'Core'Type'TextType;
use Symfony'Component'Form'Extension'Core'Type'EmailType;
$this->_form = $this->_app['form.factory']
    ->createBuilder(FormType::class, $this->_map())
    ->add(
        'firstName', 
        TextType::class, [
            'constraints' => [new Assert'NotBlank()]
        ]
    )
    ->add(
        'lastName', 
        TextType::class, [
             'constraints' => [new Assert'NotBlank()]
        ]
     )
    ->add(
         'email', 
         EmailType::class, [
              'constraints' => [new Assert'Email()]
         ]
    )
    ->getForm();

请参阅官方文件。

附言:这是对这里讨论的总结。我已经测试过这是有效的。

将Symfony组件降级到2.8.1版本解决了问题;这显然是Silex和Symfony3之间的向后兼容性问题。