最近开始学习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的最新版本中删除然而,我不知道如何解决这个让我可以继续测试。 有人能帮助我吗?
如果已经更新或作曲家检查了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