2017-07-26 25 views
10

我正在开发基于Zend Framework 3.0的CMS来管理数据库I和Doctrine。使用Composer管理包时,我的问题是什么?最近,我将所有软件包更新到最新版本并将其发送到服务器,其他文件中没有任何更改。如果需要的话Zend Framework 3中造成AnnotationRegistry registerLoader错误的原因2更新

Fatal error: Uncaught TypeError: Return value of Doctrine\Common\Annotations\AnnotationRegistry::registerLoader() must be an instance of Doctrine\Common\Annotations\void, none returned in /home/platne/serwer18346/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php:117 Stack trace: #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\ModuleManager\ModuleEvent)) #4 /home/p in /home/platne/serwer18346/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php on line 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' 
       ] 
      ] 
     ] 
    ] 

器厂:

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/" 
    } 
    } 
+0

哪个PHP版本和您使用的这些学说的版本?你可以发布你的composer.json吗? – Dado

+0

我使用PHP v7.0和最新的doctrine 2 orm模块,所以我认为将会是1.1.3 – Manveru

回答

22

这个错误造成的Doctrine\Common\Annotations使用PHP 7.1最新版本。这就是为什么它使用void作为return type。它在PHP 7.0上不受支持。*。这是new feature in PHP 7.1

我在使用PHP 7.0的ZF3项目中使用doctrine-orm-module 1.1。它运作良好。因此,只需将您的doctrine-orm-module版本替换为1.1即可。

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

我建议你定义你在作曲家中使用的依赖的版本。这是为了在新版本的依赖关系发布时使您的项目不会中断。

7

您可以尝试使用以下配置。这个对我有用。

"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),你可以尝试使用它。

+0

这对我有效 –

7

为了避免这种问题,一个好的做法是将作曲家config.platform设置:

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

这将告诉作曲家更新软件包,但只对仍然支持此PHP版本的版本。所以通常情况下,此版本号将是您的生产服务器的版本。

0

只需删除项目中的composer.lock,与“vendor”文件夹相同即可。

运行的是享受 - >

PHP composer.phar自更新

PHP composer.phar安装