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