Symfony2 - 将服务注入SonataAdmin

时间:2012-08-21 14:28:19

标签: php symfony symfony-sonata dbal

我想从SonataAdmin类“configureFormFields()

中获取数据库连接

肯定这不起作用

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

我需要它来扩展Sonata/UserBundle/Admin/Entity/UserAdmin

如何从此课程中拨打电话?


背景信息:

我需要一个选择字段(公司),其选择来自另一个连接(来自存储过程)。

2 个答案:

答案 0 :(得分:1)

你要做的是:

  • 创建服务以获取注入的连接以从
  • 获取公司
  • 创建自定义字段
  • 将其注册为服务并在构造函数中注入第一个服务
  • 为字段提供选择

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

然后您就可以在configureFormFields()中使用它:

->add('company', 'company')

答案 1 :(得分:1)

如何使用第二个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

现在,如果您还没有...配置使用此连接的second entity/document manager

应用程序/配置/ 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

实体字段类型

现在剩下要做的就是使用entity field-type并将其配置为使用company连接使用实体管理器。

的Acme / YourBundle /窗体/类型/ 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实例。


只是我的几分钱......快乐的编码!