好的,所以我甚至不确定如何提出这个问题(更不用说搜索它了)。但是在我的系统中,我有一个变量,几乎每行都形成一个关系。用户不知道它,并且每次用户登录时都将其设置为会话变量。
我需要将此变量提供给Doctrine。它不是默认值或静态值,因此在类属性中设置它不是一个选项。将其作为隐藏形式存在安全风险。我老实说不知所措。我已经避免了这个问题,直到我再也无法避免它......
暂时接受一种解决方法。我真的需要尽快启动这个项目。
非常感谢任何帮助。即使帮助解释我想要完成的事情也会受到赞赏!
答案 0 :(得分:1)
虽然这并不能完全解决我的问题,但这个特殊的解决方案可以帮助处于类似困境的其他人......
为了使用表单扩展和事件监听器将对象注入(我使用松散的术语)对象到我的表单数据中。
扩展:
<?php
namespace Acme\DemoBundle\Form\Extension;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormEvents;
use Acme\DemoBundle\Form\EventListener\MyListener;
class FormTypeMyExtension extends AbstractTypeExtension
{
public function getExtendedType()
{
return 'form'; // because we're extending the base form, not a specific one
}
public function buildForm(FormBuilder $builder, array $options)
{
$listener = new MyListener($this->security, $this->em);
$builder->addEventListener(FormEvents::SET_DATA, array($listener, 'onSetData'));
}
}
监听器:
<?php
namespace Acme\DemoBundle\Form\EventListener;
use Symfony\Component\Form\Event\FilterDataEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Security\Core\SecurityContext;
use Doctrine\ORM\EntityManager;
class MyListener
{
public function onSetData(FilterDataEvent $event)
{
// I use form.set_data because it has a method to set data to the form.
$form = $event->getForm();
$data = $event->getData();
// do things to the form or the data.
}
}
(得到this site的帮助。)
这允许您对表单执行任何操作或将表单数据表单到每个表单。这是我最初注入对象的方式。我的问题是嵌入的表单显然不会调用setData()
(可能是因为第一个对象已经有其他对象)。
我整天都在这方面工作,所以,如果我的答案措辞不好,抱怨,我会在早上解决它!