如果相当容易,在Symfony中使用基于URL的不同实体管理器/连接.使用以下路由配置
connection:
pattern: /a/{connection}
defaults: { _controller: AcmeTestBundle:User:index }
Run Code Online (Sandbox Code Playgroud)
并从以下食谱;
我的控制器看起来像这样;
class UserController extends Controller
{
public function indexAction($connection)
{
$products = $this->get('doctrine')
->getRepository('AcmeStoreBundle:Product', $connection)
->findAll()
;
..................
Run Code Online (Sandbox Code Playgroud)
我将能够从不同的em/connection /数据库中获取产品信息.
现在,如果我在路由中添加这样的内容;
login:
pattern: /a/{connection}/login
defaults: { _controller: FOSUserBundle:Security:login }
Run Code Online (Sandbox Code Playgroud)
如何轻松地使登录使用连接变量中定义的连接?
此设置假设每个数据库都有自己的用户登录信息(fos_user表).
编辑:更新的路由信息
EDIT2:
我仍然是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 = …Run Code Online (Sandbox Code Playgroud) 我之前询问过为FOSUserBundle使用多个实体管理器,事实证明FOSUserBundle已经(部分)支持了它.所有我需要做的是指定连接/经理,我想在使用model_manager_name参数,如解释在这里
fos_user:
# ........
model_manager_name: account1
Run Code Online (Sandbox Code Playgroud)
示例app/config/config.yml
使用此FOSUserBundle将使用account1连接,并在该连接的数据库中使用用户信息.
doctrine:
dbal:
default_connection: default
connections:
account2:
dbname: account2
user: account2
password: password2
driver: pdo_mysql
host: localhost
port: ~
charset: UTF8
account1:
dbname: account1
user: account1
password: password1
driver: pdo_mysql
host: localhost
port: ~
charset: UTF8
default:
dbname: account
user: account
password: password
driver: pdo_mysql
host: localhost
port: ~
charset: UTF8
Run Code Online (Sandbox Code Playgroud)
我的应用程序要求当用户访问(例如)http://myapp.com/a/account1时,应用程序将使用account1连接,并且转到http://myapp.com/a/account2将使用account2的连接.对于我的应用程序的逻辑,这可以通过我的控制器轻松完成,因为我可以使用类似下面的内容;
$em = $this->get('doctrine')->getManager('account2');
$repository = $this->get('doctrine')->getRepository($class, …Run Code Online (Sandbox Code Playgroud)