php 如何将现有PDO对象注入到原则实体管理器

k4emjkb1  于 2023-05-05  发布在  PHP
关注(0)|答案(2)|浏览(152)

我想用doctrine entity manager创建一个PHP包。
这个包将在我公司的不同项目中使用,有些项目并不使用教义,而是一个PDO连接。
我希望能够用一个现有的独立PDO对象在我的包中示例化一个教义实体管理器,因为我不想(也不能)创建另一个DB连接。我必须使用现有的。
是这样吗?类似于:

$em = EntityManager::createWithPDOInstance($pdoObject);
7nbnzgx9

7nbnzgx91#

我自己找到了解决办法。
我把代码贴出来,将来可能会对别人有帮助。

<?php

namespace MyProject\Factory;

use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Annotations\AnnotationRegistry;
use Doctrine\DBAL\DriverManager;
use Doctrine\ORM\Configuration;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;

class EntityManagerFactory
{
    /**
     * @param \PDO $pdo
     * @return EntityManager
     */
    public function create(\PDO $pdo)
    {
        $config = new Configuration();
        $config->setProxyDir(__DIR__ . '/EntityProxy');
        $config->setProxyNamespace('EntityProxy');
        $config->setAutoGenerateProxyClasses(true);

        AnnotationRegistry::registerFile(__DIR__ . '/../../vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/Driver/DoctrineAnnotations.php');

        $config->setMetadataDriverImpl(new AnnotationDriver(
            new AnnotationReader(),
            array(__DIR__ . '/')
        ));

        return EntityManager::create(
            DriverManager::getConnection(
                [
                    'driver' => 'pdo_' . $pdo->getAttribute(\PDO::ATTR_DRIVER_NAME),
                    'pdo' => $pdo,
                ],
                $config),
            $config
        );
    }
}
fcg9iug3

fcg9iug32#

我试过你的方法,大部分都有效。我遇到的问题是我的实体也有JmsSerializer注解。当我试图查找一个实体时,它抛出了一个异常,即JmsSerializer注解无法识别。
为了解决这个问题,我将AnnotationRegistry::registerFile更改为AnnotationRegistry::registerLoader('class_exists');,这样就解决了我的错误

相关问题