在Symfony2中设置一个变量,用于所有Doctrine调用

时间:2012-02-06 05:27:03

标签: symfony doctrine-orm

好的,所以我甚至不确定如何提出这个问题(更不用说搜索它了)。但是在我的系统中,我有一个变量,几乎每行都形成一个关系。用户不知道它,并且每次用户登录时都将其设置为会话变量。

我需要将此变量提供给Doctrine。它不是默认值或静态值,因此在类属性中设置它不是一个选项。将其作为隐藏形式存在安全风险。我老实说不知所措。我已经避免了这个问题,直到我再也无法避免它......

暂时接受一种解决方法。我真的需要尽快启动这个项目。

非常感谢任何帮助。即使帮助解释我想要完成的事情也会受到赞赏!

1 个答案:

答案 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()(可能是因为第一个对象已经有其他对象)。

我整天都在这方面工作,所以,如果我的答案措辞不好,抱怨,我会在早上解决它!