Symfony 2.1:如何将参数传递给自定义表单字段类型

smo*_*eno 4 symfony symfony-2.1

我正在构建一个从'EntityType'扩展的自定义表单字段类型.我总是希望根据传递的选项返回元素的子集.

在我的类型:

$builder->add('Categories','choice_category', array('code'=> 'CAT1', 'multiple'=> true))   ;
Run Code Online (Sandbox Code Playgroud)

我已经将choice_category声明为服务.工作还可以!

  bt.form.type.category:
  class: My\MBundle\Form\Type\CategoryType
  tags:
      - { name: form.type, alias: choice_category }
Run Code Online (Sandbox Code Playgroud)

在CategoryChoiceType.php中

public function setDefaultOptions(OptionsResolverInterface $resolver)
{

    $resolver->setDefaults(
        array(
            'class'=> 'CmComunBundle:Comun\Nomenclador',
            'code'          => null,                
        )
    );
}


public function getParent()
{
    return 'entity';
}
Run Code Online (Sandbox Code Playgroud)

我正在考虑使用query_builder选项,但我不知道如何将代码选项传递给setDefaultOptions方法,我这里不访问$ options数组.

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
        $resolver->setDefaults(
        array(
            'class'=> 'CmComunBundle:Comun\Nomenclador',
            'code'          => null,
            'query_builder' => function(\Doctrine\ORM\EntityRepository $er) use ($options['code']) {
               return $er->createQueryBuilder('c')
                    ->where('c.parent_code = :code')
                    ->orderBy('c.name', 'ASC')
                    ->setParameter('code', $options['code']);;
            }
        )
    );
);
Run Code Online (Sandbox Code Playgroud)

Ber*_*sek 12

你几乎做对了,但你需要使用这个特殊的语法使"query_builder"依赖于其他选项"code":

use Symfony\Component\OptionsResolver\Options;

$resolver->setDefaults(array(
    'query_builder' => function (Options $options) {
        // return default value of the "query_builder" option
        // you can access $options['code'] here
    },
));
Run Code Online (Sandbox Code Playgroud)

所以在你的具体例子中:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'class' => 'CmComunBundle:Comun\Nomenclador',
        'code' => null,
        'query_builder' => function (Options $options) {
            return function(EntityRepository $er) use ($options) {
                return $er->createQueryBuilder('c')
                    ->where('c.parent_code = :code')
                    ->orderBy('c.name', 'ASC')
                    ->setParameter('code', $options['code']);;
            };
        },
    ));
}
Run Code Online (Sandbox Code Playgroud)

这也在OptionsResolver自述文件中有记录.