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/"
}
}
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.
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.
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.
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