Php Zend2-如何转发其他模块控制器?
控制器转发-这是一个很好的功能,我用它来构思小部件。但默认情况下,它不能调度非自模块的控制器。为了解决这个问题(也为了避免控制器配置),我为控制器构造添加了Abstract_工厂:Php Zend2-如何转发其他模块控制器?,php,zend-framework2,zfcuser,Php,Zend Framework2,Zfcuser,控制器转发-这是一个很好的功能,我用它来构思小部件。但默认情况下,它不能调度非自模块的控制器。为了解决这个问题(也为了避免控制器配置),我为控制器构造添加了Abstract_工厂: namespace Engine\Mvc\Controller; use Zend\ServiceManager\AbstractFactoryInterface; use Zend\ServiceManager\ServiceLocatorInterface; class Autoloader implemen
namespace Engine\Mvc\Controller;
use Zend\ServiceManager\AbstractFactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class Autoloader implements AbstractFactoryInterface
{
public function canCreateServiceWithName(ServiceLocatorInterface $locator, $name, $requestedName)
{
return true;
}
public function createServiceWithName(ServiceLocatorInterface $locator, $name, $requestedName)
{
$class = ucfirst(str_replace('/', '\\', $requestedName)).'Controller';
if (!class_exists($class)){
return false;
}
return new $class;
}
}
/*In Module class*/
public function getControllerConfig()
{
return array(
'abstract_factories' => array(
'Engine\Mvc\Controller\Autoloader'
),
);
}
它很好用。但仅适用于可调用控制器-无构造函数参数。当我尝试从模块中嵌入控制器时,我无法更改(例如,ZfcUser,与composer一起安装)-它可能会失败,因为这些控制器可能具有不可调用的init:
/*in zfc-user/module.config.php */
'controllers' => array(
'factories' => array(
'zfcuser' => 'ZfcUser\Factory\Controller\UserControllerFactory',
),
),
/*factory for controller*/
class UserControllerFactory implements FactoryInterface
{
/**
* Create controller
*
* @param ControllerManager $serviceLocator
* @return UserController
*/
public function createService(ServiceLocatorInterface $controllerManager)
{
/* @var ServiceLocatorInterface $serviceLocator */
$serviceLocator = $controllerManager->getServiceLocator();
$userService = $serviceLocator->get('zfcuser_user_service');
$registerForm = $serviceLocator->get('zfcuser_register_form');
$loginForm = $serviceLocator->get('zfcuser_login_form');
$options = $serviceLocator->get('zfcuser_module_options');
$controller = new UserController($userService, $options, $registerForm, $loginForm);
return $controller;
}
}
向前在模块1中看不到ZfcUser模块的UserControllerFactory
,它试图用我的抽象工厂构造控制器,并给出了一个错误,因为UserController需要所有参数
它可以通过交换Zend\Mvc\Controller\Plugin\Service\ForwardFactory
来解决-只需要使用“global”ControllerManager
构建Forward。但我不确定Zend2中是否存在“global”ControllerManager
问题:
问题不存在了,我很愚蠢。Forward可以访问所有控制器,也可以访问非自控制器。但是通过控制器伪(控制器管理器中的名称)-而不是通过类名,例如,我们有控制器定义:
/*in zfc-user/module.config.php - here we have 'zfcuser' as controller pseudo */
'controllers' => array(
'factories' => array(
'zfcuser' => 'ZfcUser\Factory\Controller\UserControllerFactory',
),
),
我们可以从以下代码中的任何模块转发此控制器:
$widgetLogin = $this->forward()->dispatch('zfcuser', ['action' => 'login']);
谢谢
UPD:
如果您只想使用类的名称,从forward访问控制器(使用相同名称Engine\Mvc\Controller\Autoloader from question resolves)-您可以将别名添加到模块中的非自控制器,例如:
/*in module.config.php of your module*/
'controllers' => [
'abstract_factories' => [
'Engine\Mvc\Controller\Autoloader'
],
'aliases' => [
'ZfcUser/Controller/User' => 'zfcuser'
]
]
问题不存在了,我很愚蠢。Forward可以访问所有控制器,也可以访问非自控制器。但是通过控制器伪(控制器管理器中的名称)-而不是通过类名,例如,我们有控制器定义:
/*in zfc-user/module.config.php - here we have 'zfcuser' as controller pseudo */
'controllers' => array(
'factories' => array(
'zfcuser' => 'ZfcUser\Factory\Controller\UserControllerFactory',
),
),
我们可以从以下代码中的任何模块转发此控制器:
$widgetLogin = $this->forward()->dispatch('zfcuser', ['action' => 'login']);
谢谢
UPD:
如果您只想使用类的名称,从forward访问控制器(使用相同名称Engine\Mvc\Controller\Autoloader from question resolves)-您可以将别名添加到模块中的非自控制器,例如:
/*in module.config.php of your module*/
'controllers' => [
'abstract_factories' => [
'Engine\Mvc\Controller\Autoloader'
],
'aliases' => [
'ZfcUser/Controller/User' => 'zfcuser'
]
]
请参考[链接]()请参考[链接]()