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

Symfony 如何在表单提交时在set方法中注入参数?,symfony,symfony-forms,Symfony,Symfony Forms,提交表单时,将使用相应的数据调用对象的set方法(League#setInformation)。一切正常。(参见下面的代码作为示例) 我需要将其他参数传递给setInformation,即存储在会话数据中的当前用户id 这一技巧将有助于保持会话和模型的分离。也许在不同的情况下也有用 你知道怎么处理吗 class LeagueFormType extends AbstractType { public function buildForm(FormBuilderInterface $bu

提交表单时,将使用相应的数据调用对象的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) {
        ...
    }

}

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

如果您使用的是Doctrine2,并且League类实际上是一个Doctrine2实体,我建议您使用Doctrine2订阅方/侦听器

您可以将订阅服务器/侦听器配置为在将数据发送到数据库之前(onFlush)、在告知新实体之后(persist)或在更新现有记录之前(update),以您的情况中最合适的为准

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

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

一些文档:


如果您不使用Doctrine2,情况就不同了。

感谢您的指导,我将看看如何使用form as a service。另请参见以下回答:我使用的是silex和doctrine dbal,因此没有可用的ORM功能。这个项目很复杂,我需要尽可能多的自由。您的方法与修改应用程序的实体或模型部分有关,这是我想要避免的。我需要将控制器中可用的数据传递给设置我的联盟对象的方法,该方法由Symfony \…\Form调用。显然,没有一个简单的方法可以做到这一点。我将尝试在联盟的构造器中注入依赖性。谢谢你的意见@JamilNajafov难道你不能在你的buildForm的$options数组中传递你的数据吗?我可以传递它,它工作得很好。提交表单时,如何将其传递给setInformation方法?