2

SonataAdminクラス内からdb接続を取得したい」configureFormFields()

確かにこれは機能しません

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

私は私の拡張のためにそれが必要ですSonata/UserBundle/Admin/Entity/UserAdmin

このクラスからサービスを呼び出すにはどうすればよいですか?


コンテキスト:

他の接続(ストアドプロシージャから)から選択が行われる選択フィールド(会社)が必要です。

4

2 に答える 2

1

2 番目の dbal 接続を使用してフォーム フィールドの選択肢を提供する方法

実際には、これをもう少し簡単に、より少ないコードで行うことができます...


構成

すでに 2 番目の接続をセットアップしている場合、構成は次のようになります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

この接続を使用する2 番目のエンティティ/ドキュメント マネージャーをまだ構成していない場合:

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

... これは、この時点では非常に似ているように見えるかもしれませんが、実際にはそうではありません ... 2 番目の dbal 接続がある場合、上記のすべてがアプリケーションに既に存在しているはずです。

私はそれを他の人にとって本当に明白にしたかっただけです。

これで、2 つのエンティティ マネージャーを反映する 2 つのサービスを利用できるようになりました。

  • @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 インスタンスを返すだけでかまいません。


ほんの数セント...幸せなコーディング!

于 2013-07-10T00:20:59.320 に答える