Symfony2/Doctrine2:在侦听器内管理多个实体管理器的问题

2023-12-24

我正在按照那个食谱做http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/cookbook/blending-orm-and-mongodb-odm.html#event-subscriber当我到达事件订阅者时,我无法注入正确的entity manager,那个名叫$this->dm在构造函数中初始化。

据我了解,正在加载的实体使用的实体管理器可以通过检索$em = $eventArgs->getEntityManager();然后我需要另一个我inject通过以下方式:



    services:
        postload.listener:
        class: myVendor\myFooBarBundle\Listener\myEntityListener
        tags:
            - { name: doctrine.event_listener, event: postLoad }
        arguments:
            - "@doctrine.orm.foobar_entity_manager"
  

这些是我的实体经理:



//orm.yml
        orm:
        entity_managers:
            default:
                connection: default
                mappings:
                    myVendormyFooBarBundle:
                        prefix: "myVendor\myFooBarBundle\Entity"
                        type: annotation
                        is_bundle: true
                        dir: "Entity"
            foobar:
                connection: foobar
                mappings:
                    myVendormyFooBarBundle:
                        prefix: "myVendor\myFooBarBundle\View"
                        type: annotation
                        is_bundle: true
                        dir: "View"
  

When injecting the foobar entity manager使用上述策略我得到以下错误:

Circular reference detected for service "postload.listener", path: "routing.loader -> routing.db.loader -> doctrine.orm.default_entity_manager -> doctrine.dbal.default_connection -> postload.listener -> doctrine.orm.fooba_entity_manager -> doctrine.dbal.foobar_connection".  

That's myVendor\myFooBarBundle\Listener\myEntityListener class:



    class myFooBarEntityListener
    {

        public function __construct( \Doctrine\ORM\EntityManager $em )
        {
            $this->em = $em;
        }

        public function postLoad( LifecycleEventArgs $eventArgs )
        {
            $myEntity = $eventArgs->getEntity();

            if( $myEntity instanceof \myVendor\myFooBarBundle\Entity\myEntity )
            {
                $em = $eventArgs->getEntityManager();
                $fooBarReflProp = $em->getClassMetadata( 'myVendor\myFooBarBundle\Entity\myEntity' )->reflClass->getProperty( 'FooBarEntity' );
                $fooBarReflProp->setAccessible( true );
                $fooBarEntity = $this->em->getRepository( 'myVendor\myFooBarBundle\View\myFooBarEntity' )->findOneBy( array( 'id' => $myEntity->getFooBarEntityId() ) );
                $fooBarReflProp->setValue( $myEntity, $fooBarEntity );
            }
        }
    }
  

也是为了避免circular reference error我试过了not注入foobar entity manager并完成它LifecycleEventArgs $eventArgs:



    class myFooBarEntityListener
    {

        public function postLoad( LifecycleEventArgs $eventArgs )
        {
            $myEntity = $eventArgs->getEntity();

            if( $myEntity instanceof \myVendor\myFooBarBundle\Entity\myEntity )
            {
                $em = $eventArgs->getEntityManager();
                $fooBarReflProp = $em->getClassMetadata( 'myVendor\myFooBarBundle\Entity\myEntity' )->reflClass->getProperty( 'FooBarEntity' );
                $fooBarReflProp->setAccessible( true );
                //NOTICE HOW HERE I SHOULD GET THE PROPER ENTITY MANAGER THROUGH $eventArgs
                $fooBarEntity = $eventArgs->getEntityManager('foobar')->getRepository( 'myVendor\myFooBarBundle\View\myFooBarEntity' )->findOneBy( array( 'id' => $myEntity->getFooBarEntityId() ) );
                $fooBarReflProp->setValue( $myEntity, $fooBarEntity );
            }
        }
    }

  

最后的实现给我带来了以下错误:

An exception has been thrown during the rendering of a template ("Class myVendor\myFooBarBundle\View\myFooBarEntity is not a valid entity or mapped super class.") in "SonataAdminBundle:CRUD:base_list.html.twig" at line 28.

上述错误的原因是$fooBarEntity = $eventArgs->getEntityManager('foobar')->getRepository( 'myVendor\myFooBarBundle\View\myFooBarEntity' )->findOneBy( array( 'id' => $myEntity->getFooBarEntityId() ) );因为当我放置 echo 'hello';die(); 时就在该行之前,不会引发错误,但是当放置在该行之后时,就会引发错误并且hello未显示。这个错误让我认为虽然我明确得到了foobar连接通过$eventArgs->getEntityManager('foobar')它仍然给我default connection/entity manager.

为了再次检查myVendor\myFooBarBundle\View\myFooBarEntity我去的语法octrine\ORM\Mapping\Driver\DriverChain并放置以下代码:



    if( strpos( $className, 'myFooBarEntity' ) )
    {
        echo 'Class: '.$className."\n\n";
        foreach ($this->_drivers as $namespace => $driver)
        {
            echo 'namespace: '.$namespace."\n";
            $bool = strpos($className, $namespace);
            var_dump($bool);
            echo "\n\n";
        }
    }
    die();
  

DriverChain 代码给了我以下内容,这就是为什么我认为“foobar”连接从未使用过或者 symfony 有某种错误解释orm.yml文件定义了实体管理器以及要使用的命名空间。

类: myVendor\myFooBarBundle\View\myFooBarEntity

命名空间:myVendor\myFooBarBundle\Entity 布尔(假)

如果我寻找entity里面的话myVendor\myFooBarBundle\View\myFooBarEntity我刚刚发现@ORM\Entity对于实体定义以及@ORM\OneToMany( targetEntity=.....)用于与另一个实体的关系。

我希望有人能提供帮助,因为这让我发疯。多谢!!


我找到了一个解决方案:

services:
    postload.listener:
    class: myVendor\myFooBarBundle\Listener\myEntityListener
    tags:
        - { name: doctrine.event_listener, event: postLoad }
    arguments:
        - @doctrine

我的听众:

namespace myVendor\myFooBarBundle\Listener\myEntityListener;

use Symfony\Bundle\DoctrineBundle\Registry;

class myFooBarEntityListener
{

    private $reg;

    public function __construct(Registry $reg)
    {
        //dont't put your entitymanager otherwise a loop appear during creation
        $this->reg = $reg;
    }

    public function postLoad( LifecycleEventArgs $eventArgs )
    {
        $myEntity = $eventArgs->getEntity();

        if( $myEntity instanceof \myVendor\myFooBarBundle\Entity\myEntity )
        {

            $em = $this->reg->getEntityManager('not_default');
            $userPointdbManager = $em->getRepository('FullerUserBundle:UserPointdb');

            ....
        }
    }
}

您现在可以使用多个实体管理器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Symfony2/Doctrine2:在侦听器内管理多个实体管理器的问题 的相关文章

  • 如何使用 PHP 对字符串进行 rot13 处理?

    我有一个很大的 php 代码 我想手动对其进行编码和解码 我的问题是 php 代码里面有很多单引号和双引号 因此我在使用时出现错误str rot13 功能如下 那么正确的语法是什么以及如何使用下面的函数进行编码 str rot13 That
  • 使用原则 2 的 UniqueEntity

    我正在使用 Zend Framework 2 并且创建了一个用户实体 现在我试图使用户名字段唯一 但是出现以下错误 Semantical Error The annotation UniqueEntity in class User Ent
  • 检查 $_POST 数据

    我正在对表单进行一些垃圾邮件检查 下面的代码在我的本地主机上正常工作 如果为 true 则重定向到 google com 但是 当它在生产服务器上时却不起作用 执行脚本的其余部分并且不重定向到 Google com if POST SERV
  • php curl 使用 GET 发送变量 奇怪的结果

    我正在尝试调用远程站点上页面中的网址 决定使用curl 在远程站点上 url 变量显示为 REQUEST Array var1 gt val1 amp var2 gt val2 amp var3 gt val3 被调用的url是 http
  • setcookie with expire=0 浏览器关闭后不会过期

    我使用setcookie来制作一个过期 0的cookie 从 PHP 文档来看 link http php net manual en function setcookie php cookie 过期的时间 这是一个 Unix 时间戳 所以
  • 在服务器上找不到本地主机或 phpMyAdmin:如何修复?

    我按照安装说明进行操作PHP MySQL and PHPMyAdmin 但是当我尝试访问时http localhost phpmyadmin 我收到此错误 未找到 在此找不到请求的 URL phpmyadmin 服务器 然后我尝试访问loc
  • PHP 通过 SSL 连接到 MS SQL

    我想要实现的目标非常简单 我想通过安全连接从 PHP 脚本连接到外部 MS SQL 数据库 然而 这已被证明是有问题的 到目前为止 经过三个小时的研究 我不知所措 客户端的平台是Ubuntu 这意味着我无法使用SQLSRV 安全连接已经在不
  • 按文件名对 $_FILES 进行排序 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 他俩 如您所知 在新的 HTML5 中 您可以非常轻松地上传多个文件 但我这里的问题是如何按列 名称 对 FILES 数组进行排序 这是
  • PHP MongoDb 驱动程序:如何设置执行代码的超时

    我有以下代码 它在 MongoDb 端执行一段代码 mongoCode new MongoCode Some JS code db gt execute mongoCode array socketTimeoutMS gt 1000000
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 PHP/linux 将文件合并为单个 PDF

    我正在研究如何将多个 PDF 合并为一个 PDF 我正在寻找一个图书馆可靠且坚固尽可能 最好有一个库可以保留书签 鬼脚本 http pages cs wisc edu ghost 可以在保存书签的位置进行连接 但我遇到了麻烦 在一种情况下它
  • 在哪里可以学习网络编程从入门到精通? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我尝试做教程 但它是无组织且无结构的 我在哪里可以学习 PHP 从初学者到大师 我正在寻找类似的网站w
  • 使用 XPATH(和 PHP)从样式属性中选择背景 url

    我只想从此背景图像样式属性中选择 url 这可以通过 XPATH 实现吗 a href http www test com style background image none test a 我有类似的东西 url xpath gt qu
  • Facebook PHP-SDK 页面刷新后似乎丢失了 userID

    我似乎登录工作正常 我可以登录 接受应用程序 第一次 然后显示用户信息 例如姓名 图片 等 然而 当我刷新页面时 userid 又回到 0 我必须再次登录 我不确定问题是什么 我必须在每次页面加载时重新启动它还是什么 我不知道 我会发布一些
  • 在 PHP 字符串中格式化 MySQL 代码

    是否有任何程序 IDE 可以在 PHP 字符串中格式化 MySQL 代码 例如 我使用 PHPStorm IDE 但它无法做到这一点 它对 PHP 和 MYSQL 执行此操作 但不适用于 php 字符串内的 MYSQL 我已准备好使用新的
  • 使用PHP从doc、xls文件中读取数据

    我想知道是否可以从 doc 和 xls 文件中读取数据并将 将内容读取到图像文件中 创建文档的页面样本 例如 我有一些文件希望我的客户购买 所以我需要自动创建小图像 例如我的文档样本 我们将不胜感激您的帮助 对于读取 xls 文件 我真的推
  • 字符串相似度的算法(比Levenshtein和similar_text更好)? php, Js

    在哪里可以找到比 levenshtein 和 phpimilar text 方法更准确地评估错误字符的拼写的算法 Example similar text jonas xxjon similar echo similar returns 6
  • Jquery一键提交多个同名表单

    我有动态创建的循环表单 我需要一键提交所有表单 我正在遵循下面的代码 你能建议我怎么做吗 谢谢
  • PHP session_regenerate_id 和黑莓浏览器

    问候 我正在开发一个登录系统 并陷入了黑莓浏览器身份验证的困境 他们似乎对 PHP 的 session regenerate id 有问题 有人可以建议替代方案吗 以下是身份验证和登录脚本 UPDATE看来会话一般都不起作用 拿出 sess
  • 使用 php/regex 验证美国电话号码

    EDIT 我混合并修改了下面给出的两个答案 以形成完整的功能 现在它可以完成我想要的功能 然后是一些 所以我想我会将其发布在这里 以防其他人来寻找同样的东西 Function to analyze string against many p

随机推荐

  • 如何让乘客配置重新启动应用程序正常工作?

    Ubuntu 14 04 上的 Rails 4 1 带有 rbenv 和 ruby 2 2 1 将 capistrano 与 capistrano passenger gem 一起使用 但最后重新启动失败 INFO 8213c63a Run
  • 在Python中向信号添加噪声

    我想向我在 Python 中模拟的 100 个 bin 信号添加一些随机噪声 使其更加真实 在基本层面上 我的第一个想法是逐个容器 生成某个范围内的随机数 然后从信号中添加或减去该数字 我希望 因为这是Python 可能有一种更智能的方法通
  • XInitThreads() 的缺点是什么?

    I know XInitThreads 将允许我从主线程以外的线程调用 X 服务器 如果我想使 Xlib 中的并发线程支持是必要的使用 Qt 从辅助线程调用 OpenGL http doc qt digia com qq qq06 glim
  • Restful 是仅适用于 Web 服务还是同时适用于 Web 服务和网页?

    我读了很多 PHP 的 Restful 教程 我不想深入探讨为什么我不使用RoR 这是因为团队对PHP更加熟悉 因为我们计划未来扩展 API 所以我了解到实现 Restful Web 服务非常重要 我看过诸如此类的教程 http www g
  • 在什么情况下,c++析构函数不会被调用? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • tools.jar 似乎不在 Windows 8 上的 Android Studio 类路径中

    我安装了 Android Studio 但它给了我错误 我需要安装 JDK 但 JDK 已经安装了 然后我意识到它要求安装64位版本的JDK 无论如何 我刚刚下载了最新的 JDK 64 位版本并在环境变量中设置了以下内容 但 Android
  • 如何让 docker-machine 在特定位置创建虚拟机

    我的开发机器是一台笔记本电脑 配有小型 SSD 和巨大的外部磁盘 理想情况下 我希望 docker machine 使用外部驱动器 而不是填满我的内部磁盘 我知道我可以用安装等方式破解它 但是有没有办法让 docker machine 命令
  • Drupal Android 应用程序登录持久性

    我已经成功设置了一个 Android 应用程序 可以登录到我的 drupal 网站 我的问题是登录的用户会话不会持续很长时间 该网站清楚地显示我的用户已登录该网站 但在一个小时左右的时间内 该用户不再在该网站上显示为活动状态 我猜测是因为我
  • 在fabricJS 中如何使用transformMatrix 变换点?

    我正在尝试放置点 通过fabric Circle 在一个角落fabric Polygon 用户可以移动 缩放或旋转多边形 但是 每次修改后我都希望获得多边形的新坐标来将我的圆放置在那里 在深入研究这个主题时我发现this http www
  • ASP .NET MVC 中 web.config 中的 TargetFramework 设置有何含义?

    我们的 ASP NET MVC 5 Web 应用程序之一具有以下 web config 设置
  • 如何阅读XMI?

    我需要读取序列化为 XMI 的 UML 图 是否有任何库可以让我方便地阅读 UML XMI 方便我的意思是有一些方法来迭代模型中的类 包 方法 属性测试等 我尝试了 EMF 但找不到任何教程来展示如何导入包含 UML 的 XMI 我也发现了
  • Android:如何将整个ImageView转换为Bitmap?

    我的应用程序显示不同比例的图像 并在 centerInside imageView 内调整大小 我需要的是从 ImageView 创建位图 包括背景 在本例中为黑色 例如 我的设备屏幕为 320x480 全屏 imageView 的图像大小
  • 使用字符串参数调用 Web api

    我有一个 Web api 其中有 2 种方法 一种没有参数 两种具有不同类型的参数 字符串和整数 调用字符串方法时它不起作用 我在这里缺少什么 public class MyControllerController ApiControlle
  • 来自对象库和 DLL 导出的 CMake 共享库

    背景 我使用 cmake 构建一个开源库 https github com simulton gpds 该项目设置为执行以下操作 构建一个cmakeOBJECT图书馆名为gpds objs Build a STATIC图书馆名为gpds s
  • 在 pygame 中渲染文本会导致延迟

    I have write我的函数模块中的函数如下所示 def write size writing color x y font pygame font SysFont corbel size text font render writin
  • MySql 偏移量查询不起作用

    我有 MySql Workbench 6 2CE 希望这有帮助 我正在尝试像这样的偏移查询 SELECT id FROM nameTable OFFSET 10 ROWS 但它给了我一个关于 10 的语法错误 在这个位置不是有效的输入 有谁
  • 停止页面加载并在内容脚本中重定向

    我正在 Chrome 中制作扩展程序 需要停止页面加载 不完全加载页面 并重定向到 url 如果与 ajax 查询匹配 我在用content scripts 并尝试使用 window location replace http facebo
  • Android Studio 3.1.3 中缺少 LogCat

    我最近在我的笔记本电脑上安装了 Android Studio 3 1 3 以便开始学习 android 移动开发 我对这一切仍然陌生 不过 LogCat 选项似乎丢失了 参见下图 为了解决这个问题我尝试做的事情 卸载并重新安装android
  • 如何将 Django 模型设置为只读?

    是否可以将 Django 模型设置为只读 无需创建 更新等 注意 这个问题不同于 将 Django 模型设置为只读 https stackoverflow com questions 4334049 make a django model
  • Symfony2/Doctrine2:在侦听器内管理多个实体管理器的问题

    我正在按照那个食谱做http docs doctrine project org projects doctrine mongodb odm en latest cookbook blending orm and mongodb odm h