【问题标题】:How to Inject existing PDO object to doctrine entity manager如何将现有 PDO 对象注入到学说实体管理器
【发布时间】:2023-03-24 06:34:02
【问题描述】:

我想使用理论实体管理器创建一个 PHP 包。

这个包在我公司不同的项目中会用到,有些项目不是用学说,而是一个PDO连接。

我希望能够使用现有的独立 PDO 对象在我的包中实例化一个学说实体管理器,因为我不想(而且我不能)创建另一个数据库连接。我必须使用现有的。

这是一种方法吗?类似的东西:

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

谢谢

【问题讨论】:

    标签: php pdo doctrine-orm doctrine


    【解决方案1】:

    嗯,我自己找到了解决办法。

    我发布代码,它可能会在将来帮助某人。

    <?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
            );
        }
    }
    

    【讨论】:

      【解决方案2】:

      我尝试了您的方法,并且大部分时间都在工作。我遇到的问题是我的实体也有 JmsSerializer 注释。当我试图找到一个实体时,它抛出了一个无法识别 JmsSerializer 注释的异常。

      为了解决这个问题,我将AnnotationRegistry::registerFile 更改为 AnnotationRegistry::registerLoader('class_exists'); 并修复了我的错误

      【讨论】:

        猜你喜欢
        • 2016-01-02
        • 2013-05-03
        • 1970-01-01
        • 1970-01-01
        • 2011-06-11
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 2014-07-12
        相关资源
        最近更新 更多