У меня есть несколько EntityManager для моего приложения Symfony2. Я установил значение по умолчанию, а затем перечислил несколько других. Эта конфигурация работает и работает в моем коде, за исключением форм.
При попытке обработать запрос handleRequest(mixed $request = null)
представляет ошибку, так как тип сущности, по которому я пытаюсь проверить форму, существует не в менеджере по умолчанию, а внутри другого.
Есть ли способ указать, какой 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
Это правда, что таблица User не существует в сущности по умолчанию, поэтому эта ошибка не является неожиданной. Я хочу иметь возможность указать, что функция handleRequest проверяет dev
EntityManager, где таблица 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())
);
}
Моя конфигурация Doctrine с несколькими объектами работает во всех других аспектах приложения. Я могу использовать менеджер по умолчанию для загрузки настроек всего приложения и использовать субдомен, чтобы выбрать EntityManager, для которого нужно проверять вход, выбор, настройки конкретного учреждения и т. Д.
orm:
default_entity_manager: default
auto_generate_proxy_classes: "%kernel.debug%"entity_managers:
default:
connection: default
mappings:
MyBundle: ~
dev:
connection: dev
mappings:
MyBundle: ~
Оказывается, что handleRequest
это функция, которая просматривает и анализирует ваши аннотации сущностей и гарантирует, что ограничения не нарушаются. В своей таблице «Пользователь» я определил ограничение UniqueEntity, которое проверялось в поле имени пользователя внутри My\Bundle\Entity\User.php
,
@UniqueEntity(fields="username", message="Username already taken")
В частности, именно это ограничение ссылалось на EntityManager по умолчанию, а не на вызов handleRequest
, Снятие этого ограничения позволило обработать запрос и сохранить форму.
Таким образом, я отмечаю этот вопрос как ответ. Я проведу более тщательное исследование, чтобы выяснить, могу ли я указать, какой EntityManager используется при проверке ограничений, и создать новый поток в случае, если я все еще застрял.
У меня точно такая же проблема. Похоже, что метод handleRequest использует первый доступный диспетчер сущностей, который имеет сопоставления для сохраняемой сущности, которая не обязательно является правильной. Я также хотел бы знать, как указать другого менеджера сущностей.
Есть ли новые решения или обновления?