2013-06-23 43 views
2

我想對Symfony窗​​體進行擴展。這不是Symfony 類型擴展名。 (如何?也許作爲服務)註冊symfony的配置我的自定義擴展如何注入Symfony表單擴展?

例子已經在Symfony的是:

Symfony\Bridge\Doctrine\Form\DoctrineOrmExtension 
Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension 

根據this唯一可用的標籤是:

form.type 
form.type_extension 
form.type_guesser 

有沒有form.extension我需要

回答

6

確實沒有form.extension tag in symfony2和這些擴展甚至沒有在容器中註冊爲使用標籤或事件的服務。 (實際上它們甚至沒有被使用......)

只需註冊一個標記爲的服務form.type_extension並將您的擴展添加到buildForm()方法的構建器中。

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->addExtension(new YourWhateverExtension()); 
} 

這是他們如何手動添加註冊。

use Symfony\Component\HttpFoundation\Session\Session; 
use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension; 
use Symfony\Component\Form\Extension\Csrf\CsrfExtension; 
use Symfony\Component\Form\Extension\Csrf\CsrfProvider\SessionCsrfProvider; 

$session = new Session(); 
$secret = 'V8a5Z97e...'; 
$formFactory = Forms::createFormFactoryBuilder() 
    ->addExtension(new HttpFoundationExtension()) 
    ->addExtension(new CsrfExtension(new SessionCsrfProvider($session, $secret))) 
    ->getFormFactory(); 

Symfony的使用工廠服務@ form.factory

@ form.factory聲明可以找到here

進一步挖掘,你會發現@ form.registry服務here

<!-- FormRegistry --> 
    <service id="form.registry" class="%form.registry.class%"> 
     <argument type="collection"> 
      <!-- 
      We don't need to be able to add more extensions. 
      * more types can be registered with the form.type tag 
      * more type extensions can be registered with the form.type_extension tag 
      * more type_guessers can be registered with the form.type.type_guesser tag 
      --> 
      <argument type="service" id="form.extension" /> 
     </argument> 
     <argument type="service" id="form.resolved_type_factory" /> 
    </service> 

提示:

您可以在Symfony2中使用app/console container:debug命令,因爲2.2調試容器的標籤 - 見this PR

使用列表中

app/console container:debug --tags 

搜索使用

app/console container:debug --tag=form.type_guesser --show-private 
某個標記的所有標記