如果相当容易的话,在 Symfony 中使用基于 URL 的不同实体管理器/连接。使用以下路由配置
connection:
pattern: /a/{connection}
defaults: { _controller: AcmeTestBundle:User:index }
并来自以下食谱;
我的控制器看起来像这样;
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 表)。
编辑:更新的路由信息
编辑2:
不过,我还是 PHP/Symfony/Doctrine 的新手,所以如果我在这里完全错了,请原谅我。我试图在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 更改为 'testing'
$em = $this->get('doctrine')->getManager('testing');
$repository = $this->get('doctrine')->getRepository($class, 'testing')
为此,我将代码更改为以下代码以使用 EntityManager 而不是 ObjectManager。
//
//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');
我还能在这里错过什么?