Установите переменную в Symfony2, которая будет использоваться для всех вызовов Doctrine - PullRequest
3 голосов
/ 06 февраля 2012

Хорошо, так что я даже не уверен, как задать этот вопрос (а тем более искать его).Но в моей системе у меня есть переменная, которая формирует отношения почти для каждой строки.Пользователь не знает об этом, и он устанавливается как переменная сеанса каждый раз, когда пользователь входит в систему.

Мне нужно, чтобы эта переменная была доступна для Doctrine.Это не по умолчанию или не статический, поэтому установка его в свойстве класса не вариант.Наличие скрытой формы создает угрозу безопасности.Я честно в растерянности.Я избегал проблемы до тех пор, пока не смогу избежать этого ...

Пока что это обходное решение.Мне действительно нужно запустить этот проект как можно скорее.

Любая помощь будет принята с благодарностью.Буду признателен даже за помощь в объяснении того, чего я пытаюсь достичь!

1 Ответ

1 голос
/ 08 февраля 2012

Хотя это не решает мою проблему полностью, это конкретное решение может помочь кому-то еще в подобном затруднительном положении ...

Для того, чтобы внедрить (я свободно использую термин) объект в мои данные формыиспользуя расширение формы и прослушиватель событий.

Расширение:

<?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.
  }
}

(Нужна была помощь от с этого сайта .)

Это позволяет вам делать что угодно с формой или данными формы для каждой формы.Вот как я вводил объект изначально.Моя проблема в том, что встроенные формы, по-видимому, не вызывают setData() (предположительно, потому что у первого объекта уже есть другие объекты).

Я работал над этим весь день, поэтому, если мой ответ плохо сформулированЖалуйся, а утром исправлю!

...