Php 插件在控制器中不工作
我正在使用骨架教程构建我的第一个Zend Framework 2应用程序。但每当我尝试从任何控制器调用任何插件时,都会收到错误消息: 在插件管理器中找不到名为“plugin\u name”的插件 Zend\Mvc\Controller\PluginManager 不幸的是,我不知道代码的哪一部分可以帮助您帮助我。我发布了一些我认为可能很重要的文件 config/modules.configPhp 插件在控制器中不工作,php,zend-framework2,Php,Zend Framework2,我正在使用骨架教程构建我的第一个Zend Framework 2应用程序。但每当我尝试从任何控制器调用任何插件时,都会收到错误消息: 在插件管理器中找不到名为“plugin\u name”的插件 Zend\Mvc\Controller\PluginManager 不幸的是,我不知道代码的哪一部分可以帮助您帮助我。我发布了一些我认为可能很重要的文件 config/modules.config return [ 'Zend\Router', 'Zend\Validator',
return [
'Zend\Router',
'Zend\Validator',
'Zend\Form',
'Album',
'Application',
'User',
];
module/User/src/module.php
<?php
namespace User;
use User\Model\User;
use User\Model\UserTable;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
class Module
{
const VERSION = '1.0.0dev';
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
public function getConfig()
{
return include __DIR__ . '/../config/module.config.php';
}
public function getServiceConfig()
{
return array(
'factories' => array(
'User\Model\UserTable' => function($sm) {
$tableGateway = $sm->get('UserTableGateway');
$table = new UserTable($tableGateway);
return $table;
},
'UserTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new User());
return new TableGateway('user', $dbAdapter, null, $resultSetPrototype);
},
),
);
}
}
<?php
namespace User;
use Zend\ServiceManager\Factory\InvokableFactory;
use Zend\Router\Http\Segment;
return [
'controllers' => [
'factories' => [
Controller\UserController::class => InvokableFactory::class,
],
'invokables' => [
'User\Controller\User' => 'User\Controller\UserController',
],
],
'router' => [
'routes' => [
'user' => [
'type' => Segment::class,
'options' => [
'route' => '/user[/:action[/:id]]',
'constraints' => [
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
],
'defaults' => [
'controller' => Controller\UserController::class,
'action' => 'index',
],
],
],
],
],
'view_manager' => [
'template_path_stack' => [
'user' => __DIR__ . '/../view',
],
],
];
因为我真的需要服务定位器,所以我找到了一个变通方法,我认为这不是很好,但对我来说很有效:
$sm = $this->getEvent()->getApplication()->getServiceManager();
但我想这里有点不对劲
编辑:
为了更好地再现我所做的(我再次安装了Zend Framework,但它仍然会给我相同的错误):
public function getAlbumTable()
{
if (!$this->albumTable) {
$sm = $this->getServiceLocator();
$this->albumTable = $sm->get('Album\Model\AlbumTable');
}
return $this->albumTable;
}
在中,您可以看到控制器必须实现以下方法:setPluginManager
、getPluginManager
和plugin
。你也可以阅读:
为了更方便起见,AbstractActionController
和AbstractActionController
都有\u call()
实现,允许您通过方法调用检索插件:
$plugin=$this->url()代码>
您的控制器是否扩展了AbstractActionController
或AbstractActionController
如果是,它应该按照文档中提到的那样工作(因此您在问题中提到的那些方法应该可以工作)。
由于您没有共享任何控制器代码,因此很难说这是否是问题所在
更新
您得到的错误与ControllerPluginManager
的配置无关,但您得到此错误是因为您正在执行以下操作:
$sm = $this->getServiceLocator();
由于方法getServiceLocator
不存在,因此会执行magic\u call()
方法,从而导致错误
这是因为在最新版本的ZF2中,控制器类不再具有“服务定位器感知”功能,这意味着您无法通过调用$This->getServiceLocator()
来检索ServiceManager
相反,您必须将Album\Model\AlbumTable
服务注入工厂内的控制器类:
1)向控制器类添加构造函数方法:
public function __construct(AlbumTable $albumTable){
$this->albumTable = $albumTable;
}
2)为控制器创建工厂:
<?php
namespace Album\Controller\Factory;
use Album\Controller\AlbumController;
class AlbumControllerFactory implements FactoryInterface
{
/**
* @param ServiceLocatorInterface $serviceLocator
* @return AlbumController
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
$controllerPluginManager = $serviceLocator;
$serviceManager = $controllerPluginManager->get('ServiceManager');
$albumTable = $serviceManager->get('Album\Model\AlbumTable');
return new AlbumController($albumTable);
}
}
在中,您可以看到控制器必须实现以下方法:setPluginManager
、getPluginManager
和plugin
。你也可以阅读:
为了更方便起见,AbstractActionController
和AbstractActionController
都有\u call()
实现,允许您通过方法调用检索插件:
$plugin=$this->url()代码>
您的控制器是否扩展了AbstractActionController
或AbstractActionController
如果是,它应该按照文档中提到的那样工作(因此您在问题中提到的那些方法应该可以工作)。
由于您没有共享任何控制器代码,因此很难说这是否是问题所在
更新
您得到的错误与ControllerPluginManager
的配置无关,但您得到此错误是因为您正在执行以下操作:
$sm = $this->getServiceLocator();
由于方法getServiceLocator
不存在,因此会执行magic\u call()
方法,从而导致错误
这是因为在最新版本的ZF2中,控制器类不再具有“服务定位器感知”功能,这意味着您无法通过调用$This->getServiceLocator()
来检索ServiceManager
相反,您必须将Album\Model\AlbumTable
服务注入工厂内的控制器类:
1)向控制器类添加构造函数方法:
public function __construct(AlbumTable $albumTable){
$this->albumTable = $albumTable;
}
2)为控制器创建工厂:
<?php
namespace Album\Controller\Factory;
use Album\Controller\AlbumController;
class AlbumControllerFactory implements FactoryInterface
{
/**
* @param ServiceLocatorInterface $serviceLocator
* @return AlbumController
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
$controllerPluginManager = $serviceLocator;
$serviceManager = $controllerPluginManager->get('ServiceManager');
$albumTable = $serviceManager->get('Album\Model\AlbumTable');
return new AlbumController($albumTable);
}
}
函数getAlbumTable()
在ZF2教程中使用,但在ZF3中被成员table
替换
将AlbumController.php
中的deleteAction()
函数更改为:
公共函数deleteAction()
{
$id=(int)$this->params()->fromRoute('id',0);
如果(!$id){
返回$this->redirect()->toRoute('album');
}
$request=$this->getRequest();
如果($request->isPost()){
$del=$request->getPost('del','No');
如果($del=='Yes'){
$id=(int)$request->getPost('id');
$this->table->deleteAlbum($id);
}
//重定向到相册列表
返回