覆盖Symfony2中的实体管理器

覆盖Symfony2中的实体管理器,symfony,Symfony,更新以反映讨论情况 我想实现一些自定义逻辑来选择正确的实体管理器。我认为这就像重写doctor.class参数、扩展doctor\Bundle\DoctrineBundle\Registry和重写getManager()方法一样简单。但是,当我这样做时,我会得到以下错误: ErrorException: Warning: strtolower() expects parameter 1 to be string, object given in /Applications/MAMP/htdocs

更新以反映讨论情况

我想实现一些自定义逻辑来选择正确的实体管理器。我认为这就像重写doctor.class参数、扩展doctor\Bundle\DoctrineBundle\Registry和重写getManager()方法一样简单。但是,当我这样做时,我会得到以下错误:

ErrorException: Warning: strtolower() expects parameter 1 to be string, object given in /Applications/MAMP/htdocs/nmevent/app/bootstrap.php.cache line 119
代码如下:

<?php

namespace NM\Bundle\MultiTenantBundle\Doctrine;

use Doctrine\Bundle\DoctrineBundle\Registry;

class TenantRegistry extends Registry
{
    /**
     * {@inheritdoc}
     *
     * @throws \InvalidArgumentException
     */

    public function getManager($name = null)
    {
        if (null === $name) {
            $name = $this->defaultManager;
        }

        $managers = $this->getManagers();

        if (!isset($managers[$name])) {
            throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->getName(), $name));
        }

        return $this->getService($managers[$name]);
    }
}

您试图获取
租户注册
类在第21行上不存在的属性
名称

                                                           here
throw new \InvalidArgumentException(sprintf(                 ↓
    'Doctrine %s Manager named "%s" does not exist.', $this->name, $name));
UPD

                                                           here
throw new \InvalidArgumentException(sprintf(                 ↓
    'Doctrine %s Manager named "%s" does not exist.', $this->name, $name));

属性
name
AbstractManagerRegistry
类中定义,并且具有私有访问权限。因此,您无法直接获取此属性。请改用
getName()
方法。

您试图在21行上获取
TenantRegistry
类的不存在属性
name

                                                           here
throw new \InvalidArgumentException(sprintf(                 ↓
    'Doctrine %s Manager named "%s" does not exist.', $this->name, $name));
UPD

                                                           here
throw new \InvalidArgumentException(sprintf(                 ↓
    'Doctrine %s Manager named "%s" does not exist.', $this->name, $name));

属性
name
AbstractManagerRegistry
类中定义,并且具有私有访问权限。因此,您无法直接获取此属性。改用
getName()
方法。

抛出异常时,
$this->name
中有什么内容?正如错误所说,它是未定义的,意味着它不存在。当我尝试转储$this->managers时,它也是如此。使它看起来好像有些东西没有正确初始化,但我一辈子都不知道为什么。当你抛出异常时,
$this->name
中有什么内容?正如错误所说,它是未定义的,意味着它不存在。当我尝试转储$this->managers时,它也是如此。使它看起来好像有些东西没有正确初始化,但我一辈子都不知道为什么。我明白了。我不明白为什么它不存在,因为我覆盖的方法与原始方法完全相同。使用getName()可以引发异常。然而,这意味着$this->managers也不存在。当我使用getManagers()临时存储管理器并将temp变量传递给getService时,我会在哪个类/方法中引发异常“ErrorException:Warning:strtolower()期望参数1为字符串,对象在/Applications/MAMP/htdocs/nEvent/app/bootstrap.php.cache line 119中给出”?另外,用编辑过的数据更新你的问题。没关系-我现在看到getManagers()方法没有返回我想要的。当用getManagerNames()替换它时,它似乎可以工作。我明白了。我不明白为什么它不存在,因为我覆盖的方法与原始方法完全相同。使用getName()可以引发异常。然而,这意味着$this->managers也不存在。当我使用getManagers()临时存储管理器并将temp变量传递给getService时,我会在哪个类/方法中引发异常“ErrorException:Warning:strtolower()期望参数1为字符串,对象在/Applications/MAMP/htdocs/nEvent/app/bootstrap.php.cache line 119中给出”?另外,用编辑过的数据更新你的问题。没关系-我现在看到getManagers()方法没有返回我想要的。当用getManagerNames()替换它时,它似乎可以工作。