【问题标题】:Symfony2 - Inject a service into SonataAdminSymfony2 - 将服务注入 SonataAdmin
【发布时间】:2012-08-21 14:28:19
【问题描述】:

我想从 SonataAdmin 类中获得一个数据库连接'configureFormFields()

这肯定行不通

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

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

如何从这个类调用服务?


上下文:

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

【问题讨论】:

  • 您始终可以在AdminController 类中获得数据库连接。根据您的计划,这可能是一件简单的事情。

标签: php symfony symfony-sonata dbal


【解决方案1】:

你要做的是:

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

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

然后您就可以简单地从configureFormFields() 使用它:

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

【讨论】:

    【解决方案2】:

    如何使用第二个 dbal 连接为表单域提供选择

    您实际上可以更轻松地完成此操作,并且涉及的代码更少......


    配置

    如果您已经设置了第二个连接doctrine.dbal.mycnx_connection,您的配置看起来有点像这样。

    app/config/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

    app/config/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/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');
        },
    ));
    

    就是这样......虽然您可能仍希望将表单作为服务......但您不必注入任何东西。

    您不需要在'query_builder' 中使用EntityRepository $er 部分...如果您不想为您的公司创建存储库,您可以只返回一个QueryBuilder 实例。


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

    【讨论】:

    • doh ... 2012 年的问题 ... 9 小时前编辑 ... 在寻找要回答的问题时意外从 newest 切换到 active 选项卡...哈哈:D跨度>
    • 谢谢,这很有趣。但是你认为我可以在我的案例中使用实体字段类型吗(从过程调用中获取的公司,相关表上没有人)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    相关资源
    最近更新 更多