DoctrineDataCollector::__construct()的第一个参数必须是Doctrine\Common\Persistence\ManagerRegistry的实例。

4

我正在开发一个Symfony项目,这个项目是别人开始的,我很高兴它能够运行。但不幸的是,今天运行composer update后,我拥有的Symfony页面出现了错误。

运行composer update后,显示了以下错误:

Composer更新错误

Executing script cache:clear [KO]
 [KO]
Script cache:clear returned with error code 255
!!  Symfony\Component\ErrorHandler\Error\ClassNotFoundError {#132
!!    #message: """
!!      Attempted to load class "MappingDriverChain" from namespace "Doctrine\Common\Persistence\Mapping\Driver".\n
!!      Did you forget a "use" statement for "Doctrine\Persistence\Mapping\Driver\MappingDriverChain"?
!!      """
!!    #code: 0
!!    #file: "./var/cache/dev/ContainerFcUQG2T/App_KernelDevDebugContainer.php"
!!    #line: 869
!!    trace: {
!!      ./var/cache/dev/ContainerFcUQG2T/App_KernelDevDebugContainer.php:869 {
!!        ContainerFcUQG2T\App_KernelDevDebugContainer->getDoctrine_Orm_DefaultEntityManagerService($lazyLoad = true)
!!        ›
!!        › $b = new \Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain();
!!        › $b->addDriver(new \Doctrine\ORM\Mapping\Driver\AnnotationDriver(($this->privates['annotations.cached_reader'] ?? $this->getAnnotations_CachedReaderService()), [0 => (\dirname(__DIR__, 4).'/src/Entity')]), 'App\\Entity');
!!      }
!!      ./var/cache/dev/ContainerFcUQG2T/App_KernelDevDebugContainer.php:5160 { …}
!!      ./var/cache/dev/ContainerFcUQG2T/App_KernelDevDebugContainer.php:5204 { …}
!!      ./var/cache/dev/ContainerFcUQG2T/App_KernelDevDebugContainer.php:569 { …}
!!      ./vendor/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php:87 { …}
!!      ./vendor/symfony/http-kernel/Kernel.php:553 { …}
!!      ./vendor/symfony/http-kernel/Kernel.php:126 { …}
!!      ./vendor/symfony/framework-bundle/Console/Application.php:168 { …}
!!      ./vendor/symfony/framework-bundle/Console/Application.php:74 { …}
!!      ./vendor/symfony/console/Application.php:140 { …}
!!      ./bin/console:42 { …}
!!    }
!!  }
!!  2020-07-31T08:18:05+00:00 [critical] Uncaught Error: Class 'Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain' not found
!!

访问Symfony页面后,出现了以下TypeError:

TypeError

调用Doctrine\Bundle\DoctrineBundle\DataCollector\DoctrineDataCollector::__construct()时传递的第1个参数必须是Doctrine\Common\Persistence\ManagerRegistry的实例,但却传递了Doctrine\Bundle\DoctrineBundle\Registry的实例。该错误发生在/var/www/html/mgo/var/cache/dev/ContainerFcUQG2T/App_KernelDevDebugContainer.php的1176行。

说实话,我不知道是什么导致了这个问题,但我认为它与我在项目的twig和Symfony php文件中所做的更改无关。

如果还有其他需要我查看的内容,请告诉我,我会添加一些文件。

/config/packages/doctrine.yaml

doctrine:
    dbal:
        url: '%env(resolve:DATABASE_URL)%'

        # IMPORTANT: You MUST configure your server version,
        # either here or in the DATABASE_URL env var (see .env file)
        #server_version: '5.7'
    orm:
        auto_generate_proxy_classes: true
        naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
        auto_mapping: true
        mappings:
            App:
                is_bundle: false
                type: annotation
                dir: '%kernel.project_dir%/src/Entity'
                prefix: 'App\Entity'
                alias: App

composer.json

{
  "name": "project",
  "description": "project description",
  "type": "path",
  "license": "MIT",
  "minimum-stability": "dev",
  "require": {
    "php": "^7.4",
    "ext-ctype": "*",
    "ext-iconv": "*",
    "mgo/mgo-client-php": "2.0.0",
    "sensio/framework-extra-bundle": "^5.1",
    "symfony/asset": "5.0.*",
    "symfony/console": "5.0.*",
    "symfony/dotenv": "5.0.*",
    "symfony/expression-language": "5.0.*",
    "symfony/flex": "^1.3.1",
    "symfony/form": "5.0.*",
    "symfony/framework-bundle": "5.0.*",
    "symfony/http-client": "5.0.*",
    "symfony/intl": "5.0.*",
    "symfony/mailer": "5.0.*",
    "symfony/monolog-bundle": "^3.1",
    "symfony/notifier": "5.0.*",
    "symfony/orm-pack": "*",
    "symfony/process": "5.0.*",
    "symfony/security-bundle": "5.0.*",
    "symfony/serializer-pack": "*",
    "symfony/string": "5.0.*",
    "symfony/translation": "5.0.*",
    "symfony/twig-pack": "*",
    "symfony/validator": "5.0.*",
    "symfony/web-link": "5.0.*",
    "symfony/yaml": "5.0.*",
    "ext-json": "*"
  },
  "repositories": [
      {
      "type": "path",
      "url": "/home/*user*/mgo-client-php",
      "symlink": false
  }
  ],
  "require-dev": {
      "symfony/debug-pack": "*",
      "symfony/maker-bundle": "^1.0",
      "symfony/profiler-pack": "*",
      "symfony/test-pack": "*",
      "mgo-client-php": "2.0.0",
      "monolog/monolog": "^1.23"
  },
  "config": {
      "preferred-install": {
          "*": "dist"
      },
      "sort-packages": true
  },
  "autoload": {
      "psr-4": {
          "App\\": "src/"
      }
  },
  "autoload-dev": {
      "psr-4": {
          "App\\Tests\\": "tests/"
      }
  },
  "replace": {
      "paragonie/random_compat": "2.*",
      "symfony/polyfill-ctype": "*",
      "symfony/polyfill-iconv": "*",
      "symfony/polyfill-php72": "*",
      "symfony/polyfill-php71": "*",
      "symfony/polyfill-php70": "*",
      "symfony/polyfill-php56": "*"
  },
  "scripts": {
      "auto-scripts": {
          "cache:clear": "symfony-cmd",
          "assets:install %PUBLIC_DIR%": "symfony-cmd"
      },
      "post-install-cmd": [
          "@auto-scripts"
      ],
      "post-update-cmd": [
          "@auto-scripts"
      ]
  },
  "conflict": {
      "symfony/symfony": "*"
  },
  "extra": {
      "symfony": {
          "allow-contrib": false,
          "require": "5.0.*"
      }
  }
}

编辑:

按照@Alexandre Tranchant的建议,我删除了/var/cache文件以获取原始错误。弹出的错误如下:

尝试从命名空间“Doctrine\Common\Persistence\Mapping\Driver”加载类“MappingDriverChain”。 您是否忘记了使用语句“Doctrine\Persistence\Mapping\Driver\MappingDriverChain”?

enter image description here


我猜测是composer升级了你的doctrine包版本,你可以手动清除缓存并更新错误信息。 - Alexandre Tranchant
那你建议删除 /var/cache 目录下的所有文件,对吧?然后再运行 composer install 或类似的命令? - Klyner
1
如果您不在生产环境中,建议删除/var/cache中的文件,然后启动应用程序(无需重新启动composer install)以查看原始错误消息。(但我遇到了这个错误,并发布了一个答案。希望能帮到您!) - Alexandre Tranchant
1
@Klyner 我也遇到了同样的问题。有什么解决方案吗?我在 https://dev59.com/ubzpa4cB1Zd3GeqPMoZq 发布了一个类似的问题。 - Nandakumar V
谢谢您的提醒。目前很遗憾我还没有解决这个问题。我已经恢复了一个旧版本(幸运的是我有备份),并对其进行了更新。由于这个问题,我尽量不再使用composer update。您是否已经使用以下其中一种解决方案来解决它了? - Klyner
@Klyner 我找到了一个解决方案,并且已经更新了我的SO https://dev59.com/ubzpa4cB1Zd3GeqPMoZq#63235538 - Nandakumar V
1个回答

2

关于Twig文件的更新,是没有关联的。

由于您的composer.json文件未固定doctrine版本,它升级了您的doctrine包版本。在最新版本的Doctrine中,存储库文件的模式已更改。

有两个解决方案:

解决方案1(未经测试,不推荐):通过将其添加到composer.json中来修复doctrine包。您可以查看应用程序的旧composer.lock。这不是最佳解决方案。(但这只是我的观点)

解决方案2:将文件升级为符合新版doctrine的要求。

我看到三个主要步骤:

  1. 通过更新recipes来更新配置文件
  2. 更新存储库的声明(见下文)
  3. 更新fixtures文件。(但我在您的composer文件中没有看到fixtures)

因此,我认为您需要升级存储库的声明。

这是一个存储库的新模式:

#src/Repository/Foo.php
use App\Entity\Foo;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\Persistence\ManagerRegistry;


/**
 * Some repository coded in the new way.
 *
 * @method Article|null find($id, $lockMode = null, $lockVersion = null)
 * @method Article|null findOneBy(array $criteria, array $orderBy = null)
 * @method Article[]    findAll()
 * @method Article[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */
class ArticleRepository extends ServiceEntityRepository
{
    /**
     * FooRepository constructor.
     *
     * @param ManagerRegistry $registry injected by dependency injection
     */
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Foo::class);
    }

如果您不使用仓库,您需要查找在代码中使用了Doctrine\Bundle\DoctrineBundle\Registry的位置,并找到一种替换它为新的ManagerRegistry的方法。


1
我已经尝试了这两种解决方案,但我得到了与上述提到的相同的错误。对于解决方案2,只有步骤1适用于我,因此我只更新了配方。 - Klyner
感谢您的反馈。如果您不使用存储库,您必须找到在代码中使用Doctrine\Bundle\DoctrineBundle\Registry的位置,并找到一种替换它为ManagerRegistry的方法。当您找到使用Registry的位置时,请随时编辑您的问题。 - Alexandre Tranchant
谢谢你的帮助!我正在尝试找到在我的代码中使用Registry的位置,但是在整个项目中搜索“Registry”并没有找到任何文件。即使我寻找Doctrine,也没有在任何php文件中找到它。这是否意味着我甚至可以删除导入?(从doctrine.yamldoctrine_migrations.yaml以及bundles.php)或者由于错误而不可能这样做? - Klyner
如果您的应用程序将一些数据存储在数据库中并使用EntityManager,则不应删除这些包,否则可以尝试。这些包未在您的composer.json中列出。因此,另一个包需要它们。您可以通过查看composer.lock文件找到需要这些包的包。 - Alexandre Tranchant
@AlexandreTranchant,这是否解决了“尝试从命名空间加载类“MappingDriverChain”的问题?我已经尝试更新所有软件包,但问题仍未解决。您有任何想法它发生在哪里吗? - Nandakumar V

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接