传递给DoctrineDataCollector :: __ construct()的参数1必须是Doctrine\Common\Persistence\ManagerRegistry的实例 [英] Argument 1 passed to DoctrineDataCollector::__construct() must be an instance of Doctrine\Common\Persistence\ManagerRegistry
问题描述
我正在开发一个Symfony项目,该项目是其他人开始的,我很高兴自己能够启动并运行它。不幸的是,今天运行 composer update
后,我的Symfony页面引发了错误。
运行composer更新后,显示了以下错误:
作曲家更新错误
执行脚本缓存:clear [KO]
[KO]
脚本缓存:clear返回,错误代码为255
! Symfony\组件\ErrorHandler\Error\ClassNotFoundError {#132
!! #message:
!!尝试加载类 MappingDriverChain来自名称空间 Doctrine\Common\Persistence\Mapping\Driver 。\n
!您忘记了使用功能吗? Doctrine\Persistence\Mapping\Driver\MappingDriverChain的声明?
!!
!! #code:0
!! #file: ./var/cache/dev/ContainerFcUQG2T/App_KernelDevDebugContainer.php
!! #line:869
!!跟踪:{
!! ./var/cache/dev/ContainerFcUQG2T/App_KernelDevDebugContainer.php:869 {
!!容器FCUQG2T\App_KernelDevDebugContainer-> getDoctrine_Orm_DefaultEntityManagerService($ lazyLoad = true)
!! ›
!! › $ b =新的\Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain();
!! › $ b-> addDriver(new \Doctrine\ORM\Mapping\Driver\AnnotationDriver(($ this-> privates ['annotations.cached_reader'] ?? ,[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 [紧急]未捕获的错误:未找到类'Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain'
!
访问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中调用
老实说,我不知道是什么引起了这个问题,但我认为这与我在<$ c $中所做的更改无关c> twig 和Symfony php
文件。
我会添加一些文件,如果
/config/packages/doctrine.yaml
原则:
dbal:
网址:'%env(resolve:DATABASE_URL)%'
#重要:您必须配置服务器版本
#在此处或在DATABASE_URL env var中(请参阅.env文件)
#server_version:'5.7'
orm:
auto_generate_proxy_classes:true
naming_strategy:doctrine.orm.naming_strategy.underscore_number_aware
auto_mapping:true
映射:
App:
is_bundle:false
类型:注释
dir:'%kernel.project_dir%/ src / Entity'
前缀:'App\Entity'
别名:App
composer.json
{
名称: 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 /控制台: 5.0。*,
symfony / dotenv: 5.0。*,
symfony / expression-language: 5.0。*,
symfony / flex: ^ 1.3.1,
symfony / form: 5.0。*,
symfony /框架捆绑: 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: *
},
存储库:[
{
type: path,
url: / home / *用户* / mgo-client-php,
符号链接: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:真
},
autoload:{
psr-4:{
App\\: src /
}
},
autoload-dev:{
psr-4:{
App\\Tests\\ \: tests /
}
},
替换:{
paragonie / random_compat: 2. *,
symfony / polyfill- ctype: *,
symfony / polyfill-iconv: *,
symfony / polyfill-php72: *,
symfony / polyfill-php71: *,
symfony / polyfill-php70: *,
symfony / polyfill-php56: *"
},
脚本:{
自动脚本:{
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
文件以获取原始错误。弹出的错误如下:
试图加载类 MappingDriverChain。来自名称空间 Doctrine\Common\Persistence\Mapping\Driver。
您忘记了使用吗?语句 Doctrine\Persistence\Mapping\Driver\MappingDriverChain?
。
因此,我想您必须升级存储库声明。
这是存储库的新模式
#src / Repository / Foo.php
使用App\实体\
使用Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
使用Doctrine\ORM\NonUniqueResultException;
使用Doctrine\Persistence\ManagerRegistry;
/ **
*一些以新方式编码的存储库。
*
* @方法文章|为空find($ id,$ lockMode = null,$ lockVersion = null)
* @方法文章|为空findOneBy(数组$ criteria,数组$ orderBy = null)
* @method Article [] findAll()
* @method Article [] findBy(array $ criteria,array $ orderBy = null,$ limit = null,$ offset = null)
* /
类ArticleRepository扩展了ServiceEntityRepository
{
/ **
* FooRepository构造函数。
*
* @param ManagerRegistry $ registry通过依赖注入注入
* /
公共功能__construct(ManagerRegistry $ registry)
{
parent :: __ construct ($ registry,Foo :: class);
}
如果不使用存储库,则必须在代码中查找使用 Doctrine\Bundle\DoctrineBundle\Registry
,并找到一种用新的 ManagerRegistry
替换它的方法。
I am developing a Symfony project which somebody else started on and I was happy that I had it up and running. Unfortunatelly after running composer update
today, the Symfony page that I have throws an error.
After running composer update the following error was displayed:
Composer update error
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
!!
After accessing the Symfony page, this TypeError was printed:
TypeError
Argument 1 passed to Doctrine\Bundle\DoctrineBundle\DataCollector\DoctrineDataCollector::__construct() must be an instance of Doctrine\Common\Persistence\ManagerRegistry, instance of Doctrine\Bundle\DoctrineBundle\Registry given, called in /var/www/html/mgo/var/cache/dev/ContainerFcUQG2T/App_KernelDevDebugContainer.php on line 1176
To be honest I have no idea what caused this issue, but I think it has nothing to do with the changes I made in the twig
and Symfony php
files of the project.
I'll add some files, if there is anything else that I should be looking into, let me know.
/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.*"
}
}
}
EDIT:
As @Alexandre Tranchant suggested I removed my /var/cache
file to get the original error. The error that pops up is the following:
Attempted to load class "MappingDriverChain" from namespace "Doctrine\Common\Persistence\Mapping\Driver". Did you forget a "use" statement for "Doctrine\Persistence\Mapping\Driver\MappingDriverChain"?
It's correct there is no link with your update on twig files.
As your composer.json file doesn't fix the doctrine version, it upgraded your doctrine package version. In the newest version of Doctrine, the pattern of repository files have change. There is 2 solutions:
Solution1 (Not tested and not recommended): you fix the doctrine package by adding it in the composer.json. You can have a look on the old composer.lock of your application. This isn't the best solution. (But it's only my opinion)
Solution2: Upgrade your files to be compliant with the new version of doctrine.
I see three major steps:
- Update the configuration file by updating recipes.
- Update the declaration of repositories (see below)
- Update fixtures files. (but I don't see fixtures in your composer files)
So, I guess that you have to upgrade your repositories declaration.
Here is the new pattern of a repository
#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);
}
If you don't use repositories, you have to find where in your code you was using Doctrine\Bundle\DoctrineBundle\Registry
and find a way to replace it by the new ManagerRegistry
.
这篇关于传递给DoctrineDataCollector :: __ construct()的参数1必须是Doctrine\Common\Persistence\ManagerRegistry的实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!