4

我正在尝试按名称构建一个 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;
}));

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

4

4 回答 4

4

为什么不直接使用

$app['form.factory']->createBuilder('Namespace\\Form\\Types\\Form')
于 2015-09-20T00:26:48.203 回答
3

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

我认为你应该扩展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();

好好享受!

于 2013-09-16T11:51:03.760 回答
1

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

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

$app['form.types'] = $app->share($app->extend('form.types', function ($types) use ($app) {
   $types[] = new AddressType();
   return $types;
}));
于 2015-10-08T13:56:54.113 回答
0

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

从 Symfony如何创建表单类型扩展

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

因此,正如您的代码显示的那样,您希望添加一个存在于 Symfony 中的 FormType,但您将在 Silex 中使用FormServiceProvider而不定义 anAbstractType并且只使用该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()
;
于 2013-05-14T13:58:55.840 回答