由名为“getServiceLocator”一个插件的插件管理器的Zend \\ \\的mvc控制器

2019-09-27 10:45发布

最近开始学习AngularJS和Zend框架2通过一门课程。 鉴于课程,如果我记得是2013年,有些东西已经在两个框架改变。 不久,我遇到了一个问题,使用下面的代码来测试到数据库的连接,并列出使用Doctrine 2中的记录:

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class IndexController extends AbstractActionController {
    public function indexAction() {
        $em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
        $repo = $em->getRepository('Entity\Categoria');

        $categorias = $repo->findAll();

        return new ViewModel(['categories'=>$categorias]);
    }
}

当我运行,它返回以下错误::

由名为“getServiceLocator”一个插件的插件管理器的Zend \的mvc \控制器\插件管理未找到

此外,附加信息:

Zend的\的ServiceManager \异常\ ServiceNotFoundException的

文件:

C:\xampp\htdocs\Curso de ZF2\vendor\zendframework\zend-servicemanager\src\AbstractPluginManager.php:133

据我所知,这个问题来源于这样的事实是, getServiceLocator()已经从Zend框架2的最新版本中删除然而,我不知道如何解决这个让我可以继续测试。 有人能帮助我吗?

Answer 1:

如果已经更新或作曲家检查了Zend框架3,如果它只是使你的课程材料的工作,你可以降级到较早(2.X)版本,其中getServiceLocator()是可用的,但不推荐使用 。 它是从3.0开始删除。

更好的办法是了解如何解决它,因为你将不得不做它的未来,无论如何。 基本上,你不应该依赖注入在运行时的中间,但你实际上控制器注册一个工厂,然后通过构造函数传递依赖英寸 可能的修复程序在以下问题接受的答案很好地解释:

PHP不推荐使用:您是从类ZFTool \控制器\ ModuleController内检索服务定位器

另外,在上述中,例如$db = $this->getServiceLocator()->get('Db\ApplicationAdapter'); 作为一个构造函数参数传递,所以它会立即提供给控制器。 因此,以类似的方式,你应该创建一个工厂为您IndexController ,这应该归还Doctrine\ORM\EntityManager通过构造函数已经注射(记得你的真实模块名称来代替“yourModule”):

namespace yourModule\Controller\Factory;

use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use yourModule\Controller\IndexController;

class IndexControllerFactory implements FactoryInterface {
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null) {
        return new IndexController($container->get('Doctrine\ORM\EntityManager'));
    }
}

因为一切都被相应地配置你可以在任何地方放置你的工厂类,只要。 在这个例子中,我把它放在/Module/yourModule/src/yourModule/Controller/Factory/IndexControllerFactory.php

通过上面的类被称为,你的$em变量将被填充,可以从任何位置控制被称为(注意新的属性$em及其用法: $this->em ):

class IndexController extends AbstractActionController {

    protected $em;

    public function __construct(EntityManager $em) {
        $this->em = $em;
    }

    public function indexAction() {
        $repo = $this->em->getRepository('Entity\Categoria');
        $categorias = $repo->findAll();
        return new ViewModel(['categories'=>$categorias]);
    }

    ...

}

现在,注册你的新工厂在yourModule的module.config.php ,我们就大功告成了:

<?php
return [
    // ... other stuff
    // ...
    'controllers' => [
        'factories' => [  
            'yourModule\Controller\Index' => 'yourModule\Controller\Factory\IndexControllerFactory',
            ],
    ],
    // etc...
]; 
// end of file

非常重要:您的文件将可能有类似的内容,但使用“所调用”作为阵列的关键。 请注意,您将使用工厂为重点的名字(因为您声明控制器工厂),而不是“所调用”,这是类,而不会依赖或定期控制器。

我还建议研究这个的Zend框架3迁移指南 ,它有很多的,可以帮助的重要信息。

至于那你当然以下,再次,我建议你降级PHP到兼容的版本(很容易,如果你使用的作曲),或试图在网上找到另一个跟上时代的课程或教程。 ZF2显著改变版本和机会之间的是这是不是你会发现唯一的错误,你会得到非常困惑,而不是学习。 让我知道这对你的作品。



文章来源: A plugin by the name “getServiceLocator” was not found in the plugin manager Zend\\Mvc\\Controller\\PluginManager