Để sử dụng Trình quản lý thực thể/Kết nối khác nhau dựa trên URL trong Symfony nếu khá dễ dàng. Với cấu hình định tuyến sauNhiều người quản lý thực thể cho FOSUserBundle
connection:
pattern: /a/{connection}
defaults: { _controller: AcmeTestBundle:User:index }
và từ Sách nấu ăn sau;
How to work with Multiple Entity Managers and Connections
Bộ điều khiển của tôi sẽ trông giống như thế này;
class UserController extends Controller
{
public function indexAction($connection)
{
$products = $this->get('doctrine')
->getRepository('AcmeStoreBundle:Product', $connection)
->findAll()
;
..................
và tôi sẽ có thể tìm nạp thông tin sản phẩm từ cơ sở/kết nối/cơ sở dữ liệu khác nhau.
Bây giờ, nếu tôi thêm một cái gì đó như thế này vào định tuyến của mình;
login:
pattern: /a/{connection}/login
defaults: { _controller: FOSUserBundle:Security:login }
Làm thế nào tôi có thể dễ dàng làm cho đăng nhập sử dụng kết nối theo quy định tại kết nối biến?
Thiết lập này giả định mỗi cơ sở dữ liệu có thông tin đăng nhập người dùng riêng của họ (bảng fos_user).
Edit: Cập nhật thông tin định tuyến
Edit2:
Tôi vẫn còn mới với PHP/Symfony/Học thuyết mặc dù, vì vậy hãy tha thứ cho tôi nếu tôi hoàn toàn sai ở đây. Tôi đã cố gắng đặt kết nối theo cách thủ công tại FOS \ UserBundle \ Doctrine \ UserManager. Sau đây là các nhà xây dựng của lớp
//
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();
}
Trong một bộ điều khiển, chúng ta có thể sử dụng phương pháp sau đây để thay đổi em để 'thử nghiệm'
$em = $this->get('doctrine')->getManager('testing');
$repository = $this->get('doctrine')->getRepository($class, 'testing')
Cho rằng tôi đã thay đổi mã như sau để sử dụng EntityManager thay vì 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();
}
Ứng dụng của tôi hoạt động tốt mà không bị lỗi.
Từ cách nó hoạt động với bộ điều khiển, tôi đã thử thay đổi kết nối bằng cách thêm tham số vào dòng này, nhưng vẫn sử dụng kết nối mặc định.
$this->repository = $om->getRepository($class, 'testing');
Tôi còn thiếu gì nữa ở đây?
Tôi không nghĩ rằng FOSUserBundle được thiết kế để thực hiện điều đó. Bạn có thể mở rộng chức năng, hoặc bằng cách đóng góp cho bản thân dự án hoặc tạo một ngã ba. Hoặc bạn có thể viết UserBundle của riêng bạn với sự hỗ trợ cho các kết nối khác nhau. – Sgoettschkes
@Sgoettschkes: Tôi hoàn toàn đồng ý với bạn. Tôi chưa thể tìm ra giải pháp/giải pháp cho vấn đề của tôi, nhưng khi tôi làm, tôi chắc chắn sẽ chia sẻ nó ở đây, nếu không phải bằng một yêu cầu kéo tại github :) –
Bạn đã tiêm trình quản lý đối tượng thích hợp vào Trình tạo lớp UserManager (trình kiểm tra)? –