Silex FormServiceProvider无法加载类型" form"使用Symfony3组件时

时间:2016-01-07 19:09:12

标签: php symfony silex symfony2-forms

尝试构建表单时收到此错误:

  

FormRegistry.php第87行中的InvalidArgumentException:无法加载   输入"表格"

我已注册FormServiceProvider,TranslationServicerProvider和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安全性   组件 - CSRF库   symfony / translation v3.0.1   Symfony翻译组件   symfony / twig-bridge v3.0.1 Symfony Twig Bridge   symfony / validator v3.0.1 Symfony Validator组件   symfony / form v3.0.1

我能够在先前版本的Silex中成功完成此操作;做了什么破坏或我错过了什么?

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

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

在pre 2.8中,类型曾经作为字符串传递,例如'form','text','email'等等,Symfony组件将它解析为正确的类。现在你必须传入一个类名。

那么,以前的form现在变为Symfony\Component\Form\Extension\Core\Type\FormType::classtext变为Symfony\Component\Form\Extension\Core\Type\TextType::class。当然,您可以导入这些类,这样就不必使用完整的命名空间。

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

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();

请参阅official documentation

P.S:这是here讨论的摘要。我测试过这个有效。

答案 2 :(得分:3)

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