SymfonyのURLに基づいて異なるエンティティマネージャ/コネクションを使用するのはかなり簡単です。次のルーティング設定を使用すると、FOSUserBundle用の複数のエンティティマネージャ
connection:
pattern: /a/{connection}
defaults: { _controller: AcmeTestBundle:User:index }
および次のCookbookから入手できます。
How to work with Multiple Entity Managers and Connections
私のコントローラは、このようになります。
class UserController extends Controller
{
public function indexAction($connection)
{
$products = $this->get('doctrine')
->getRepository('AcmeStoreBundle:Product', $connection)
->findAll()
;
..................
他のem/connection/databaseから製品情報を取得できます。
ここで、このようなものをルーティングに追加すると、
login:
pattern: /a/{connection}/login
defaults: { _controller: FOSUserBundle:Security:login }
どのように私は簡単に接続変数で定義された接続を使用するようにログインを作ることができますか?
この設定では、各データベースに独自のユーザーログイン情報(fos_userテーブル)があると想定しています。
編集:更新されたルーティング情報
EDIT2:
私はここに完全に間違っている場合ので、私を許してください、しかし、まだPHP/symfonyの/教義を持つ新たなんです。私は手動で接続をFOS \ UserBundle \ Doctrine \ UserManagerに設定しようとしました。次は、コントローラでクラス
//
use Doctrine\Common\Persistence\ObjectManager;
//
public function __construct(EncoderFactoryInterface $encoderFactory, CanonicalizerInterface $usernameCanonicalizer, CanonicalizerInterface $emailCanonicalizer, ObjectManager $om, $class)
{
parent::__construct($encoderFactory, $usernameCanonicalizer, $emailCanonicalizer);
$this->objectManager = $om;
$this->repository = $om->getRepository($class);
$metadata = $om->getClassMetadata($class);
$this->class = $metadata->getName();
}
のコンストラクタで、私たちはそのために
$em = $this->get('doctrine')->getManager('testing');
$repository = $this->get('doctrine')->getRepository($class, 'testing')
を「テスト」にEMを変更するには、次の方法を使用することができ、私は次のようににコードを変更ObjectManagerではなくEntityManagerを使用します。
//
//use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\ORM\EntityManager;
//
public function __construct(EncoderFactoryInterface $encoderFactory, CanonicalizerInterface $usernameCanonicalizer, CanonicalizerInterface $emailCanonicalizer, EntityManager $om, $class)
{
parent::__construct($encoderFactory, $usernameCanonicalizer, $emailCanonicalizer);
$this->objectManager = $om;
$this->repository = $om->getRepository($class);
$metadata = $om->getClassMetadata($class);
$this->class = $metadata->getName();
}
私のアプリは問題なく正常に動作します。
コントローラとのやり方から、この行にパラメータを追加して接続を変更しようとしましたが、それでもデフォルトの接続が使用されています。
$this->repository = $om->getRepository($class, 'testing');
他に何が欠けていますか?
私はFOSUserBundleがそうするように設計されているとは思わない。プロジェクト自体に貢献するか、フォークを作成するかによって、機能を拡張できます。あるいは、異なる接続をサポートする独自のUserBundleを作成することもできます。 – Sgoettschkes
@Sgoettschkes:私はあなたに完全に同意します。私はまだ自分の問題に対する解決策や回避策を見つけることができませんが、私がそうするときは、githubのプルリクエストではなく、ここでそれを共有します:) –
あなたは適切なオブジェクトマネージャをUserManagerクラスのコンストラクタ(テスト用のもの)? –