Симфония 2 - Внедрить услугу в SonataAdmin


Я хотел бы получить подключение к бд из класса SonataAdmin' configureFormFields()

Наверняка это не сработает

protected function configureFormFields(FormMapper $formMapper)
{
    $mycnx = $this->get('doctrine.dbal.mycnx_connection');
//...

Мне это нужно для моего расширения Sonata/UserBundle/Admin/Entity/UserAdmin

Как я могу вызвать службу из этого класса?


Контекст:

Мне нужно иметь поле выбора (компания), выбор которого исходит из другого соединения (из хранимой процедуры).

Author: Pierre de LESPINAY, 2012-08-21

2 answers

Что вам нужно сделать, это:

  • создайте службу, вводящую соединение, чтобы получить компании от
  • создайте пользовательское поле
  • зарегистрируйте его как службу и введите первую службу в конструктор
  • Укажите варианты в поле

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
    #...
    

Тогда вы сможете просто использовать его из configureFormFields() с помощью:

->add('company', 'company')
 1
Author: Pierre de LESPINAY, 2012-09-10 09:10:41

Как использовать второе подключение 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, если вы не хотите создавать репозиторий для своих компаний.


Всего несколько моих центов... счастливого кодирования!

 1
Author: nifr, 2013-07-10 00:20:59