2015-03-27 1 views
2

У меня есть несколько EntityManager для моего приложения Symfony2. Я установил значение по умолчанию, а затем добавил несколько других. Эта конфигурация работает и работает в моем коде, за исключением форм.Как указать EntityManager, используемый Symfony2 Form-> handleRequest?

При попытке обработать запрос handleRequest(mixed $request = null) представляет ошибку, так как тип Entity, который я пытаюсь проверить, форма не существует в менеджере по умолчанию, а внутри другого.

Есть ли способ указать, какой Entity Manager используется для обработки запроса?

$form = $this->createForm(
    new UserType(), $user 
); 

$form->handleRequest($request); // $request is coming from form submission 

Я получаю ошибку ясно:

An exception occurred while executing [select statement appears here] 

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'DEFAULTENTITY.User' doesn't exist 

Это правда, что таблица пользователя не существует на субъекте по умолчанию, поэтому эта ошибка не является неожиданной. Я хочу иметь возможность указать, что функция handleRequest проверяет объект EntityManager dev, где существует таблица User. Функция в целом приведена ниже. Эта функция отлично работает при использовании только по умолчанию EntityManager в, но ломается, когда я реализовал многостраничного менеджера среду:

public function addAction(Request $request) 
{ 
    $user = new User(); 

    $form = $this->createForm(new UserType(), $user); 

    $form->handleRequest($request); 

    // Respond to a form submission 
    if ($form->isValid()) { 
      $em = $this->getDoctrine()->getManager($this->currentManagerID); 
      $em->persist($user); 
      $em->flush(); 
      return $this->redirect($this->generateUrl('user_add')); 
    } 

    // Render the form 
    return $this->render(
      'MyBundle:User:create.html.twig', 
      array('form' => $form->createView()) 
    ); 
} 

Моей множественные объектной конфигурации Доктрины работу во всех других аспектах применения. Я могу использовать менеджер по умолчанию, чтобы загрузить приложения глобальных параметров и использовать субдомен выбрать EntityManager, для которого нужно проверить против входа в систему, Подборки, настройки отдельных учреждений и т.д.

orm: 
    default_entity_manager: default 
    auto_generate_proxy_classes: "%kernel.debug%" 
    entity_managers: 
     default: 
      connection: default 
      mappings: 
       MyBundle: ~ 
     dev: 
      connection: dev 
      mappings: 
       MyBundle: ~ 
+0

Вы сделали '$ php app/console doctrine: schema: update --force'? – D4V1D

+0

У меня есть; чтобы быть ясным (который был моим первым сообщением здесь, возможно, я не был), использование нескольких EntityProviders работает по различным аспектам приложения - логин, выбор (для таблиц и т. д.), захват данных и т. д. Проблема, с которой я столкнулся, - это когда я использую Form Builder: встроенная функция handleRequest проверяет EntityManager по умолчанию Doctrine. Было бы замечательно, если бы была опция 'handleRequest ($ request, $ em)'.Поскольку нет, я надеялся найти способ указать, какой менеджер я бы хотел использовать. –

+0

Правильно, извините, я больше не могу вам помочь, я никогда не использовал более одного EntityManager в своих приложениях 'SF'. – D4V1D

ответ

0

Оказывается что handleRequest - это функция, которая проходит и анализирует аннотации Entity и гарантирует, что ограничения не будут нарушены. В моей таблице User я определил ограничение UniqueEntity, которое проверено в поле имени пользователя внутри My\Bundle\Entity\User.php.

@UniqueEntity(fields="username", message="Username already taken")

В частности, именно это ограничение, которое было ссылки по умолчанию EntityManager, а не вызов handleRequest в. Удаление этого ограничения позволило обработать запрос и сохранить форму.

Как таковой, я отмечаю этот вопрос как ответ. Я сделаю более тщательное исследование, чтобы узнать, могу ли я указать, какой EntityManager используется при проверке ограничений и создать новый поток в случае, если я все еще застрял.

+0

У UniqueEntity есть свойство em, которое вы можете задать для имени вашего менеджера сущностей. Вы также можете создавать свои собственные ограничения в качестве сервисов и вводить свои репозитории. – Cerad

0

У меня такая же проблема. Кажется, что метод handleRequest использует первый доступный менеджер сущностей, который имеет сопоставления для сохраняемого объекта, что не обязательно является правильным. Я также хотел бы знать, как указать другого менеджера сущностей.

Есть ли новые решения или обновления?

+0

Dre, для меня это было связано с тем, как я указал ограничения в самой Entity. Использование стандартного «уникального» ограничения приводило к проверке handleRequest против EM по умолчанию. Я определил свою собственную службу, из которой я смог вытащить желаемого менеджера из сеанса. Когда я вернусь, я отправлю более подробную информацию. –

+0

Эй, спасибо за быстрый ответ. На данный момент я не использую валидатор «UniqueEntity». Однако, после полного дня отладки, я наконец понял, что моя проблема была в пользовательском слушателе, который я запрограммировал некоторое время назад и полностью забыл. Если кто-либо еще заинтересован, вы можете просто передать имя менеджера сущности в тип поля сущности, используя опцию «em». В моем случае у меня динамическая форма, поэтому я использовал прослушиватель PRE_SUBMIT и воссоздал одно и то же поле в слушателе. Мне просто пришлось добавить параметр «em» в воссозданное поле в слушателе, и все сработало – Dre