Форма Symfony 3 с несколькими базами данных всегда использует менеджер сущностей по умолчанию

Недавно я создал приложение администратора для управления всеми нашими пользователями, клиентами и т. Д.

Приложение сконфигурировано с двумя менеджерами сущностей для получения и установки данных в «промежуточную» базу данных и «производственную» базу данных.

Все в порядке, выборка данных из разных баз данных не является проблемой, но когда форма отправляется, для проверки и сохранения введенной информации всегда требуется менеджер сущностей по умолчанию.

Могу ли я где-то указать, какой менеджер сущностей должен использоваться формой при создании или при $form->handleRequest($request); ?

Config:

doctrine:
dbal:
default_connection: default
connections:
default:
driver:   pdo_mysql
host:     '%database_host%'
port:     '%database_port%'
dbname:   '%database_name2%'
user:     '%database_user2%'
password: '%database_password2%'
charset:  UTF8
prod:
driver:   pdo_mysql
host:     '%database_host%'
port:     '%database_port%'
dbname:   '%database_name%'
user:     '%database_user%'
password: '%database_password%'
charset:  UTF8
orm:
auto_generate_proxy_classes: '%kernel.debug%'
default_entity_manager: staging
entity_managers:
staging:
naming_strategy: doctrine.orm.naming_strategy.underscore
connection: default
mappings:
AppBundle: ~
prod:
naming_strategy: doctrine.orm.naming_strategy.underscore
connection: prod
mappings:
AppBundle: ~

CustomerController @ CreateAction:

public function createAction(Request $request, $id, RegistryInterface $registry, $_env)
{
$em = $registry->getManager($_env);
$customer = $em->getRepository('AppBundle:Customer')->find($id);

$customer->init($this->getUser());

$form = $this->createForm(CustomerForm::class, $customer, ['action' => $this->generateUrl('customers_edit', ['id' => $id, '_env' => $_env]), 'trait_choices' => [$em]]);

$form->handleRequest($request);

Я не могу найти слова на эту тему в документах Symfony …

РЕДАКТИРОВАТЬ

Код CustomerType:

<?php

namespace AppBundle\Form;

use AppBundle\Entity\Role;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;

class CustomerType extends AbstractType
{
public function init($em)
{
$this->em = $em;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
if (isset($options['trait_choices'])) {
call_user_func_array(array($this, 'init'), $options['trait_choices']);
}

$builder->add('companyName', TextType::class, [
'label' => 'label.name',
'required' => true
]);
$builder->add('street', TextType::class, [
'label' => 'label.street',
'required' => true
]);
$builder->add('streetNr', NumberType::class, [
'label' => 'label.street_nr',
'required' => true
]);
$builder->add('streetBox', TextType::class, [
'label' => 'label.street_box',
'required' => false
]);
$builder->add('postalCode', TextType::class, [
'label' => 'label.postal_code',
'required' => true
]);
$builder->add('city', TextType::class, [
'label' => 'label.city',
'required' => true
]);
$builder->add('country', EntityType::class, [
'class' => 'AppBundle\Entity\Country',
'choice_label' => 'name',
'label' => 'label.country',
'required' => true,
'choice_translation_domain' => 'messages',
'em' => $this->em
]);
$builder->add('vatNr', TextType::class, [
'label' => 'label.vat',
'required' => false
]);
$builder->add('phone', TextType::class, [
'label' => 'label.phone',
'required' => false
]);
$builder->add('email', TextType::class, [
'label' => 'label.email',
'required' => true
]);
$builder->add('roles', EntityType::class, [
'class' => Role::class,
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('r')
->where('r.type = ?1')
->setParameter(1, Role::TYPE_CUSTOMER);
},
'label' => 'Roles',
'multiple' => true,
'expanded' => true,
'choice_label' => 'displayName',
'attr' => [
'class' => 'roles'
],
'choice_translation_domain' => 'messages',
'em' => $this->em
]);
$builder->add('leadSources', EntityType::class, [
'label' => 'label.origin_lead',
'class' => 'AppBundle\Entity\LM\LeadSource',
'multiple' => true,
'expanded' => true,
'choice_label' => 'name',
'choice_translation_domain' => 'messages',
'em' => $this->em
]);

$builder->addEventListener(FormEvents::PRE_SUBMIT, array($this, 'onPreSubmitListener'));
}

public function onPreSubmitListener(FormEvent $event)
{
$customer = $event->getForm()->getData();
if ($customer->getIdentifier() == null) {
$customer->setIdentifier(uniqid('dummy'));
$event->getForm()->setData($customer);
} else {
$event->getForm()->setData($customer);
}
}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => 'AppBundle\Entity\Customer',
'trait_choices' => null,
'allow_extra_fields' => true,

]);
}
}

1

Решение

Как вводится значение $ _env? Попробуйте сбросить его, чтобы увидеть, что он на самом деле возвращает то, что вы ожидаете получить («prod» или «staging»)

Поведение, которое вы испытываете, подразумевает, что оно, вероятно, всегда равно нулю, поэтому менеджер сущностей по умолчанию создается во всех случаях.

Попробуйте что-то вроде
$ env = $ container-> getParameter («kernel.environment»)

PS
Ваше использование окружения немного странно. Вероятно, не очень хорошая идея рисковать доступом к вашей prod db из среды разработки или промежуточной среды.
Попробуйте использовать параметры и файлы .env так, как они должны использоваться.

ОБНОВИТЬ:

Вы можете передать менеджер сущностей вашему типу формы, используя массив параметров при вызове функции createForm

Что-то вроде

$form = $this->createForm(
YourFormType::class,
$yourEntity,
[
'entityManager' => $this->getDoctrine()->getManager($_env),
]
);

А затем в вашей функции buildForm вы можете извлечь ее из массива параметров.

ОБНОВЛЕНИЕ 2

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'entityManager' => null,
]);
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]