提交表单时,使用相应的数据调用对象的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) {
...
}
}
答案 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,那就不一样了。