web-dev-qa-db-fra.com

Doctrine2 Update Caused AnnotationRegistry registerLoader Error dans Zend Framework 3

Je travaille sur un CMS basé sur Zend Framework 3.0 pour gérer une DB I avec Doctrine. Quel est mon problème lors de la gestion des packages avec composer? Récemment, j'ai mis à jour tous les packages vers les versions les plus récentes et je les ai envoyés au serveur, rien n'a été changé dans les autres fichiers. Après la mise à jour, mon site a affiché l'erreur suivante:

Erreur fatale: TypeError non capturé: valeur de retour de Doctrine\Common\Annotations\AnnotationRegistry :: registerLoader () doit être une instance de Doctrine\Common\Annotations\void, aucune n'est renvoyée dans/home/platne/serwer18346/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php: 117 Trace de pile: # 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 (Object (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 (Zend\M oduleManager\ModuleEvent)) # 4/home/p dans /home/platne/serwer18346/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php sur la ligne 117

Un code d'application si nécessaire:
modules:

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

development.local (le mode développeur est actif):

'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'
                ]
            ]
        ]
    ]

Usine de contrôleur:

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')
    );
}

Parent du contrôleur:

 protected $_entityManager;

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

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

Comme je l'ai dit, ce code fonctionnait avant la mise à jour. Après la mise à jour, il me montre cette erreur, de plus, après le téléchargement des versions précédentes, l'erreur persiste. Je trie le code de réécriture mais avec le même effet.

Compositeur (sans données de projet):

"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/"
    }
  }
12
Manveru

Cette erreur est due à la dernière version de Doctrine\Common\Annotations utilisez PHP 7.1 . C'est pourquoi il utilise void comme return type. Et il n'est pas pris en charge sur PHP 7.0. *. Ceci est nouvelle fonctionnalité dans PHP 7.1

J'utilise doctrine-orm-module 1.1 dans mon projet ZF3 en utilisant PHP 7.0. Et cela fonctionne bien. Donc, remplacez simplement votre doctrine-orm-module version à 1.1.

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

Je vous suggère de définir la version des dépendances que vous avez utilisée dans composer. Cela a pour but de ne pas interrompre votre projet lors de la sortie d'une nouvelle version des dépendances.

27
Dolly Aswin

Pour éviter ce type de problèmes, une bonne pratique consiste à définir le composer config.platform réglage:

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

Cela indiquera composer pour mettre à jour les packages mais uniquement vers une version qui prend toujours en charge cette version PHP version. Donc, généralement, ce numéro de version sera la version de votre production) serveur.

16
Tokeeen.com

Vous pouvez essayer d'utiliser la configuration suivante. Ça marche pour moi.

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

La sortie de composer show est également très utile lorsque vous signalez des problèmes de compositeur/package. Le mien ressemble à ceci:

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

Si vous rencontrez de tels problèmes à l'avenir, accédez à https: //packagist.org/packages/ et recherchez le package qui pose problème.

Par exemple doctrine/annotations : https: //packagist.org/packages/doctrine/annotations#v1.5.0

Recherchez ensuite (requiert: php: ^ 7.1) et si ce package correspond à votre version PHP. (Dans votre cas, en utilisant PHP 7.0, cela ne correspond pas)

Mais https: //packagist.org/packages/doctrine/annotations#v1.4.0 correspond à votre version PHP (nécessite: php: ^ 5.6 || ^ 7.0) et vous pouvez essayer de l'utiliser.

10
Dado

Supprimez simplement composer.lock dans votre projet, de même pour le dossier "vendeur".

courez ça et profitez ->

php composer.phar selfupdate

php composer.phar install

1
Djo Parasiite