Подтвердить что ты не робот

Doctrine2 Update Caused AnnotationRegistry registerLoader Ошибка в Zend Framework 3

Я работаю над CMS на основе Zend Framework 3.0 для управления DB я с помощью Doctrine. В чем моя проблема при управлении пакетами с композитором? Недавно я обновил все пакеты до новейших версий и отправил их на сервер, ничего не было изменено в других файлах. После обновления на моем сайте появилась следующая ошибка:

Неустранимая ошибка: Uncaught TypeError: возвращаемое значение Doctrine\Common\Annotations\AnnotationRegistry:: registerLoader() должно быть экземпляром Doctrine\Common\Annotations\void, ни один не возвращен в /home/platne/serwer 18346/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php:117 Трассировка стека: # 0/home/platne/serwer18346/vendor/doctrine/doctrine-module/src/DoctrineModule/Module.php(57): Doctrine\Common\Annotations\AnnotationRegistry:: registerLoader (Object (Closure)) # 1/home/platne/serwer18346/vendor/zendframework/zend-modulemanager/src/Listener/InitTrigger.php(33): DoctrineModule\Module- > init (объект ( Zend\ModuleManager\ModuleManager)) # 2/home/platne/serwer18346/vendor/zendframework/zend-eventmanager/src/EventManager.php(322): Zend\ModuleManager\Listener\InitTrigger → __ invoke (Object (Zend\ModuleManager\ModuleEvent)) # 3/home/platne/serwer18346/vendor/zendframework/zend-eventmanager/src/EventManager.php(171): Zend\EventManager\EventManager- > triggerListeners (Object (Zen) d\ModuleManager\ModuleEvent)) # 4/home/p в /home/platne/serwer 18346/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php в строке 117

При необходимости код приложения:
модули:

return [
    'Zend\Router',
    'Zend\Validator',
    'DoctrineModule',
    'DoctrineORMModule',
    'Core',
];

development.local(режим разработчика активен):

'doctrine' => [
        'connection' => [
            'orm_default' => [
                'driverClass' => Doctrine\DBAL\Driver\PDOMySql\Driver::class,
                'params' => [
                    'host' => '******',
                    'user' => '*******',
                    'password' => '******',
                    'dbname' => '*******',
                    'charset' => 'utf8'
                ]
            ]
        ]
    ]

module.config:

'doctrine' => [
        'driver' => [
            __NAMESPACE__ . '_driver' => [
                'class' => AnnotationDriver::class,
                'cache' => 'array',
                'paths' => [__DIR__.'/../src/Model']
            ],
            'orm_default' => [
                'drivers' => [
                    __NAMESPACE__ . '\Model' => __NAMESPACE__ . '_driver'
                ]
            ]
        ]
    ]

Контроллер Factory:

public function __invoke(ContainerInterface $container,$requestedName, array $options = null)
{
    $controllerInstance = null;
    switch($requestedName){
        case 'Core\Controller\IndexController': $controllerInstance = $this->_invokeIndex($container); break;
        case 'Core\Controller\PagesController': $controllerInstance = $this->_invokePages($container); break;
    }
    return $controllerInstance;
}

protected function _invokeIndex(ContainerInterface $container)
{
    return new Controller\IndexController(
        $container->get('doctrine.entitymanager.orm_default')
    );
}

protected function _invokePages(ContainerInterface $container)
{
    return new Controller\PagesController(
        $container->get('doctrine.entitymanager.orm_default')
    );
}

Контроллер Родитель:

 protected $_entityManager;

    /**
     * AppController constructor.
     * @param EntityManager $entityManager
     */
    public function __construct(EntityManager $entityManager)
    {
        $this->_entityManager = $entityManager;
    }

    /**
     * @return EntityManager
     */
    public function getEntityManager()
    {
        return $this->_entityManager;
    }

Как я уже говорил, этот код работал до обновления. После обновления он покажет мне эту ошибку, а после загрузки предыдущих версий ошибка остается. Я переписываю код, но с тем же эффектом.

Композитор (без данных проекта):

"require": {
    "zendframework/zend-mvc": "*",
    "zendframework/zend-developer-tools": "*",
    "zendframework/zend-session": "*",
    "zendframework/zend-authentication": "*",
    "zfcampus/zf-development-mode": "*",
    "doctrine/doctrine-orm-module": "*"
  },
  "autoload": {
    "psr-4": {
      "Core\\": "module/Core/src/"
    }
  }
4b9b3361

Ответ 1

Эта ошибка, вызванная последней версией Doctrine\Common\Annotations, использует PHP 7.1. Вот почему он использует void как return type. И он не поддерживается на PHP 7.0. *. Это новая функция в PHP 7.1

Я использую doctrine-orm-module 1.1 в моем проекте ZF3, используя PHP 7.0. И он работает хорошо. Итак, просто замените версию doctrine-orm-module на 1.1.

"doctrine/doctrine-orm-module": "^1.1"

Я предлагаю вам определить версию зависимостей, которые вы использовали в композиторе. Это делается для того, чтобы ваш проект не нарушался при выпуске новой версии зависимостей.

Ответ 2

Вы можете попробовать использовать следующую конфигурацию. Это работает для меня.

    "require": {
        "php": ">=5.5.9",
        "doctrine/doctrine-bundle": "^1.6",
        "doctrine/orm": "2.5.6",
        "doctrine/annotations": "1.4.*",
        "doctrine/dbal": "2.5.4",
        ...
     }

Также очень полезно, когда вы сообщаете о проблемах с композитором/пакетом, выдается вывод композитора. Мой выглядит так:

doctrine/annotations                 v1.4.0  Docblock Annotations Parser
doctrine/cache                       v1.7.0  Caching library offering an object-oriented API for many cache backends
doctrine/collections                 v1.5.0  Collections Abstraction library
doctrine/common                      v2.6.2  Common Library for Doctrine projects
doctrine/dbal                        v2.5.4  Database Abstraction Layer
doctrine/doctrine-bundle             1.6.8   Symfony DoctrineBundle
doctrine/doctrine-cache-bundle       1.3.0   Symfony Bundle for Doctrine Cache
doctrine/inflector                   v1.2.0  Common String Manipulations with regard to casing and singular/plural rules.
doctrine/instantiator                1.0.5   A small, lightweight utility to instantiate objects in PHP without invoking their constructors
doctrine/lexer                       v1.0.1  Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.
doctrine/orm                         v2.5.6  Object-Relational-Mapper for PHP

Если у вас есть такие проблемы в будущем, перейдите в https://packagist.org/packages/ и найдите пакет, который вызывает проблемы.

Например доктрина/аннотации: https://packagist.org/packages/doctrine/annotations#v1.5.0

Затем посмотрите там (требуется: php: ^ 7.1), и если этот пакет соответствует вашей версии PHP. (В вашем случае с использованием PHP 7.0 оно не соответствует)

Но https://packagist.org/packages/doctrine/annotations#v1.4.0 соответствует вашей версии PHP (требуется: php: ^ 5.6 || ^ 7.0), и вы можете попробовать ее использовать.

Ответ 3

Чтобы избежать подобных проблем, рекомендуется установить настройку композитора config.platform:

"config": {
    "platform": {
        "php": "7.0.23"
    }
 }

Это позволит композитору обновить пакеты, но только до версии, которая все еще поддерживает эту версию PHP. Как правило, этот номер версии будет версией вашего производственного сервера.

Ответ 4

Просто удалите компоновщик в проекте, то же самое для папки "vendor".

запустите это и наслаждайтесь →

php composer.phar selfupdate

php composer.phar install