4

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

FormRegistry.php 第 87 行中的 InvalidArgumentException:无法加载类型“form”

我已经注册了 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 基于 Symfony 组件的 PHP 微框架 symfony/security-core
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 中成功地做到这一点;有什么东西坏了还是我错过了什么?

4

3 回答 3

8

似乎最新版本SilexSymfony Forms v3. 要使其正常工作,请将作曲家文件中的 requires 替换为:

{
    "require": {
        "silex/silex": "^1.3",
        "symfony/form": "~2.3",
        "symfony/security-csrf": "~2.3"
    }
}
于 2016-01-07T19:26:51.787 回答
5

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

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

所以,曾经的form现在变成了Symfony\Component\Form\Extension\Core\Type\FormType::class。并text变成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();

请参考官方文档

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

于 2016-02-28T23:37:37.027 回答
3

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

于 2016-01-07T19:49:28.070 回答