0

我正在尝试在我的表单中使用查询字符串给出的一些数据。我搜索了互联网并找到了一个很好的解释(http://bicknoyle.com/2014/04/passing-query-string-params-form-symfony/):

class RegistrationFormType extends BaseType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        $builder->add('refer', 'user_refer_type');

        $builder->addEventListener(FormEvents::POST_SET_DATA, function(FormEvent $event) use ($options) {
            if (isset($options['request'])) {
                $form = $event->getForm();
                $form->get('source')->setData($options['request']->query->get('source'));
            }
        });
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setOptional(array(
            'request'
        ));

        $resolver->setAllowedTypes(array(
            'request' => 'Symfony\Component\HttpFoundation\Request'
        ));
    }

我找到了另一种使用请求范围的方法:

class RegistrationFormType extends BaseType
{

    private $request = null;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        $builder->add('refer', 'user_refer_type');

        $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event)
        {
            $form = $event->getForm();
            $form->get('refer')->setData($this->request->query->get('refer'));
        });
    }

我对代码有一些疑问:

  1. 实施此类事情的“更好”方式是什么?
    一般来说,我可以总结一下,第一种方法需要访问控制器来传递请求对象,第二种方法需要请求范围。
  2. 我错过了另一个好方法吗?
4

1 回答 1

2

我建议使用第二种方法,但不是注入 Request 对象,而是应该根据这篇文章注入 RequestStack 服务..

这是我通常如何做的一些例子:

class CustomType extends AbstractType
{
    /**
     * @var RequestStack
     */
    private $requestStack;

    /**
     * @param RequestStack $requestStack
     */
    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $currentRequest = $this->requestStack->getCurrentRequest();

        ...

        $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) use ($currentRequest)
        {
            $form = $event->getForm();
            $form->get('refer')->setData($currentRequest->query->get('refer'));
        });
    }

    ...
}
于 2014-08-15T01:39:52.837 回答