Симфония 2 - Внедрить услугу в SonataAdmin
Я хотел бы получить подключение к бд из класса SonataAdmin' configureFormFields()
Наверняка это не сработает
protected function configureFormFields(FormMapper $formMapper)
{
$mycnx = $this->get('doctrine.dbal.mycnx_connection');
//...
Мне это нужно для моего расширения Sonata/UserBundle/Admin/Entity/UserAdmin
Как я могу вызвать службу из этого класса?
Контекст:
Мне нужно иметь поле выбора (компания), выбор которого исходит из другого соединения (из хранимой процедуры).
2 answers
Что вам нужно сделать, это:
- создайте службу, вводящую соединение, чтобы получить компании от
- создайте пользовательское поле
- зарегистрируйте его как службу и введите первую службу в конструктор
-
Укажите варианты в поле
public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( #...
Тогда вы сможете просто использовать его из configureFormFields()
с помощью:
->add('company', 'company')
Как использовать второе подключение dbal для предоставления вариантов для поля формы
На самом деле вы можете сделать это немного проще и с меньшим количеством кода...
Конфигурация
Ваша конфигурация выглядит примерно так, если у вас уже настроено второе подключение doctrine.dbal.mycnx_connection
.
приложение/конфигурация/config.yml
doctrine:
dbal:
connections:
default:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
mycnx_connection: # credentials for 2nd connection
driver: "pdo_mysql"
host: "%database_host_2%"
port: "%database_port_2%"
dbname: "%database_name_2%"
user: "%database_user_2%"
password: "%database_password_2%"
charset: UTF8
default_connection: default
Теперь, если вы еще не... настройте второй менеджер сущностей/документов, который использует это соединение:
приложение/конфигурация/config.yml
doctrine:
# dbal, ...
orm:
entity_managers:
default:
connection: default
mappings:
AcmeDemoBundle: ~
AcmeStoreBundle: ~
company: # <- setup a second em using the customer connection
connection: customer
mappings:
AcmeCompanyBundle: ~
default_entity_manager: default
... на данный момент это может показаться большим, но на самом деле это не так... как все описанное выше уже должно присутствовать в вашем приложении, если у вас есть второе подключение dbal.
Я просто хотел сделать это действительно очевидным для других.
Теперь у вас есть две доступные службы, которые отражают двух ваших менеджеров сущностей:
-
@doctrine.orm.entity_manager.default
(...который имеет псевдоним@doctrine.orm.entity_manager
) @doctrine.orm.entity_manager.company
Тип поля Сущности
Теперь все, что вам осталось сделать, это использовать тип поля сущности и настроить его для использования диспетчера сущностей с использованием соединения company
.
Acme/YourBundle/Form/Type/YourType.php
use Doctrine\ORM\EntityRepository;
// ...
$builder->add('users', 'entity', array(
'class' => 'AcmeCompanyBundle:Company',
'em' => 'doctrine.orm.entity_manager.company', // <- non-default em here
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('company')
->orderBy('company.name', 'ASC');
},
));
Вот и все... в то время как вы, возможно, все еще захотите сделать свою форму услугой... вам не нужно ничего вводить.
Вам не нужно использовать часть EntityRepository $er
в 'query_builder'
... вы можно просто вернуть экземпляр QueryBuilder, если вы не хотите создавать репозиторий для своих компаний.