簡體   English   中英

使用Symfony3組件時,Silex FormServiceProvider無法加載“form”類型

[英]Silex FormServiceProvider could not load type “form” when using Symfony3 Components

在嘗試構建表單時,我收到此錯誤:

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 Component symfony / form v3.0.1

我能夠在之前版本的Silex中成功地做到這一點; 做了什么破壞或我錯過了什么?

似乎最新版本的Silex不適用於Symfony Forms v3 要使其工作,請在您的composer文件中替換require:

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

實際上,您可以將Symfony Form 3與Silex一起使用,但createBuilder函數現在要求您遵循將Types作為參數傳遞的新方法。 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:這是這里討論的總結。 我測試過這個有效。

將Symfony組件降級到版本2.8.1解決了這個問題; 這顯然是Silex和Symfony3之間的向后兼容問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM