如何在表单提交的set方法中注入参数?

时间:2015-02-27 20:29:35

标签: symfony symfony-forms

提交表单时,使用相应的数据调用对象的set方法(League#setInformation)。一切正常。 (参见下面的代码作为例子)

我需要将其他参数传递给setInformation,即存储在会话数据中的当前用户ID。

这个技巧有助于保持会话和模型的分离。也许在不同情况下也很有用。

你知道处理它的方法吗?

class LeagueFormType extends AbstractType {

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

        $builder->add('name');

        $builder->add('information', 'collection', [
            'type' => new LeagueInformationFormType(),
        ]);
    }

    public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver) {
        $resolver->setDefaults([
            'data_class' => 'xxx\Models\League',
        ]);
    }

    public function getName() {
        return 'league';
    }

}

class League {

    public function getInformation() {
        //...
    }

    public function setInformation($data) {
        ...
    }

}

2 个答案:

答案 0 :(得分:0)

我要做的是将表单声明为服务,并从会话中注入数据。如果可以,尝试将setInformation()函数重构为两个函数,例如,因此您不必通过该函数提供所有信息。但是,我认为表单事件可以帮助您设置所有内容。

答案 1 :(得分:0)

如果您使用的是Doctrine2且League类实际上是Doctrine2实体,我建议使用Doctrine2订阅者/监听器。

您可以将订阅者/侦听器配置为在将数据发送到数据库(onFlush)之前,在告知有关新实体的原则(持久性)之后或者在更新现有记录(更新)之前执行某事,无论哪个是在你的情况下最合适的。

将SecurityContext(DIC中的@ security.context)注入订阅者/侦听器以提取当前用户信息。 (确保检查是否有用户,因为当没有人登录并且保存了League对象时,也会运行用户)

这样做的主要优点是不会污染您的表单或控制器。如果由于某种原因你以其他方式创建一个联盟实体,那么当前用户也将被设置。

一些文档: http://doctrine-orm.readthedocs.org/en/latest/reference/events.html

如果你不使用Doctrine2,那就不一样了。