2013-04-12 59 views
4

我試圖按名稱構建Symfony表單(以Silex)。使用下面的配置,我相信我應該可以調用$form = $app['form.factory']->createBuilder('address');,但FormRegistry找不到這種類型的表單。在Silex中使用Symfony Form 2.3

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

    return $extensions; 
})); 

有沒有別的東西,我需要做什麼或以這種方式建立的形式以不同的方式:

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提供商加入到表單註冊?

+0

您的地址類型類是否有返回'form'的getParent()函數? – gunnx

回答

0

我想當你從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() 
; 
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(); 

享受它!

4

爲什麼不使用直接

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

這對我來說是迄今爲止最好也是最簡單的答案。它像一個魅力。謝謝。 – Maximum86

1

我明白了,這個問題是很老,但:

你要做的就是創建一個新的表單類型不延長現有的,所以註冊的正確方法它將它添加到'form.types'中。 (請記住:表單類型擴展正在爲現有類型添加一些內容,因此未來所有實例都將具有這個新的「特性」。在此創建自定義表單類型。)

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