【问题标题】:Using Symfony Form 2.3 in Silex在 Silex 中使用 Symfony Form 2.3
【发布时间】:2013-04-05 05:18:00
【问题描述】:

我正在尝试按名称构建一个 Symfony 表单(在 Silex 中)。使用下面的配置,我相信我应该可以调用$form = $app['form.factory']->createBuilder('address');,但是FormRegistry找不到这种类型的表单。

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormTypeExtensionInterface;

class AddressType extends AbstractType implements FormTypeExtensionInterface
{
    public function getName()
    {
        return 'address';
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('addressee', 'text');
        // .. fields ..
        $builder->add('country', 'text');
    }

    public function getExtendedType()
    {
        return 'form';
    }
}

然后使用form.type.extensions 提供程序将其添加到表单注册表中:

$app['form.type.extensions'] = $app->share($app->extend('form.type.extensions', function($extensions) use ($app) {
    $extensions[] = new AddressType();

    return $extensions;
}));

我还需要做其他事情或以这种方式构建表单吗?

【问题讨论】:

  • 你的地址类型类有没有返回'form'的函数getParent()?

标签: php symfony-forms silex


【解决方案1】:

我认为当您从 Symfony 转到 Silex 时,form.type.extension 可能会产生误导。

来自 Symfony How to Create a Form Type Extension:

  • 您想为多种类型添加通用功能(例如为每种字段类型添加“帮助”文本);
  • 您希望将特定功能添加到单个类型(例如将“下载”功能添加到“文件”字段类型)。

因此,正如您的代码显示的那样,您希望添加一个存在于 Symfony 中的 FormType,但您将在 Silex 中使用 FormServiceProvider 而无需定义 AbstractType,而只需使用 form.factory 服务,如下例所示:

在你的app.php

use Silex\Provider\FormServiceProvider;
$app->register(new FormServiceProvider());

在您的控制器/动作中:

$form = $app['form.factory']->createBuilder('form', $data)
    ->add('name')
    ->add('email')
    ->add('gender', 'choice', array(
        'choices' => array(1 => 'male', 2 => 'female'),
        'expanded' => true,
    ))
    ->getForm()
;

【讨论】:

    【解决方案2】:

    首先,对不起我糟糕的英语。 :)

    我认为你应该扩展form.extensions,而不是form.type.extensions

    类似这样的:

        $app['form.extensions'] = $app->share($app->extend('form.extensions',
                        function($extensions) use ($app) {
                            $extensions[] = new MyTypesExtension();
    
                            return $extensions;
                        }));
    

    那么你的班级MyTypesExtension 应该是这样的:

    use Symfony\Component\Form\AbstractExtension;
    
    class MyTypesExtension extends AbstractExtension
    {
    
        protected function loadTypes()
        {
            return array(
                new AddressType(),
                //Others custom types...
    
            );
    
        }
    
    }
    

    现在,您可以通过这种方式检索您的自定义类型:

    $app['form.factory']->createBuilder('address')->getForm();
    

    尽情享受吧!

    【讨论】:

      【解决方案3】:

      为什么不直接使用

      $app['form.factory']->createBuilder('Namespace\\Form\\Types\\Form')
      

      【讨论】:

      • 这对我来说是迄今为止最好和最简单的答案。它就像一个魅力。谢谢。
      【解决方案4】:

      我明白了,这个问题已经很老了,但是:

      您所做的是创建一个新的表单类型而不是扩展现有的表单类型,因此注册它以将其添加到“form.types”的正确方法。 (请记住:表单类型扩展正在向现有类型添加一些内容,因此将来所有实例都将具有新的“功能”。在这里,您正在创建自定义表单类型。)

      $app['form.types'] = $app->share($app->extend('form.types', function ($types) use ($app) {
         $types[] = new AddressType();
         return $types;
      }));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-19
        相关资源
        最近更新 更多