Php Zend2-如何转发其他模块控制器?

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

控制器转发-这是一个很好的功能,我用它来构思小部件。但默认情况下,它不能调度非自模块的控制器。为了解决这个问题(也为了避免控制器配置),我为控制器构造添加了Abstract_工厂:

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

问题

  • 是否存在全局控制器管理器,如何从ServiceManager获取它
  • 使用控制器插件向前调度非自模块控制器(通过非自模块控制器配置构造控制器)的任何其他方式

  • 问题不存在了,我很愚蠢。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'
        ]
    ]
    
    请参考[链接]()请参考[链接]()