// 1.控制器管理器
class ServiceManager implements ServiceLocatorInterface
{
public function __construct(ConfigInterface $config = null)
{
if ($config) {
$config->configureServiceManager($this);
}
}
}
abstract class AbstractPluginManager extends ServiceManager implements ServiceLocatorAwareInterface
{
public function __construct(ConfigInterface $configuration = null)
{
parent::__construct($configuration);
$self = $this;
$this->addInitializer(function ($instance) use ($self) {//!!! 创建出来的对象的初始化器
if ($instance instanceof ServiceLocatorAwareInterface) {
$instance->setServiceLocator($self);
}
});
} public function getServiceLocator()
{
return $this->serviceLocator;
}
}
class ControllerManager extends AbstractPluginManager
{
public function __construct(ConfigInterface $configuration = null)
{
parent::__construct($configuration);
// Pushing to bottom of stack to ensure this is done last
$this->addInitializer(array($this, 'injectControllerDependencies'), false);
} public function injectControllerDependencies($controller, ServiceLocatorInterface $serviceLocator)
{
if (!$controller instanceof DispatchableInterface) {
return;
}
// $serviceLocator === ControllerManager
// $parentLocator === ServiceManager
$parentLocator = $serviceLocator->getServiceLocator(); // ServiceManager if ($controller instanceof ServiceLocatorAwareInterface) {//!!! 注入服务管理器
$controller->setServiceLocator($parentLocator->get('Zend\ServiceManager\ServiceLocatorInterface'));
} if ($controller instanceof EventManagerAwareInterface) {
// If we have an event manager composed already, make sure it gets
// injected with the shared event manager.
// The AbstractController lazy-instantiates an EM instance, which
// is why the shared EM injection needs to happen; the conditional
// will always pass.
$events = $controller->getEventManager();// 创建新的事件管理器
if (!$events instanceof EventManagerInterface) {
$controller->setEventManager($parentLocator->get('EventManager'));
} else {
// !!!注入共享事件管理器
// $parentLocator->get('SharedEventManager')->printIdentifiersKey();
$events->setSharedManager($parentLocator->get('SharedEventManager'));
}
} if ($controller instanceof AbstractConsoleController) {
$controller->setConsole($parentLocator->get('Console')); // 注入控制台对象
} if (method_exists($controller, 'setPluginManager')) { // 注入插件管理器
// Zend\Mvc\Service\ControllerPluginManagerFactory
// Zend\Mvc\Controller\PluginManager
$controller->setPluginManager($parentLocator->get('ControllerPluginManager'));
}
}
} // 2.控制器创建 + 感知注入1
$controllerLoader = $application->getServiceManager()->get('ControllerManager'); // Zend\Mvc\Controller\ControllerManager 在 loadModules.post 已然实例化
$controller = $controllerLoader->get($controllerName); // 创建控制器对象 // 3.感知注入2
if ($controller instanceof InjectApplicationEventInterface) {
$controller->setEvent($e);//!!!
} // 4. case.0控制器中获取感知对象
class Ctrl1Controller extends AbstractConsoleController
{
public function testAction()
{
$applicaitonServiceManager = $this->getServiceLocator();
$albumTable = $applicaitonServiceManager->get('Album\Model\AlbumTable');
$applicationConfig = $applicaitonServiceManager->get('application');
/*
$applicaitonServiceManager->get('Config') =  $configListener->getMergedConfig(false)
        === array_merge(
                根据$applicationConfig['module_listener_options']['ConfigGlobPaths']抓取的,
                根据$applicationConfig['module_listener_options']['ConfigStaticPaths']抓取的,
                根据$applicationConfig['module_listener_options']['ExtraConfig']配置的,
                $modulex->getConfig()配置的
        )
*/
$ctrlEventManager = $this->getEventManager();
$ctrlSharedManager = $applicationSharedManager = $ctrlEventManager->getSharedManager();
$applicationEvent = $this->getEvent();
$ctrlPluginManager = $this->getPluginManager(); }
}
// 4. case.1控制器中获取感知对象
class Ctrl1Controller extends AbstractActionController
{
public function testAction()
{
$applicaitonServiceManager = $this->getServiceLocator();
$albumTable = $applicaitonServiceManager->get('Album\Model\AlbumTable');
$applicationConfig = $applicaitonServiceManager->get('application'); /*
    $applicaitonServiceManager->get('Config') =  $configListener->getMergedConfig(false)
        === array_merge(
                根据$applicationConfig['module_listener_options']['ConfigGlobPaths']抓取的,
                根据$applicationConfig['module_listener_options']['ConfigStaticPaths']抓取的,
                根据$applicationConfig['module_listener_options']['ExtraConfig']配置的,
                $modulex->getConfig()配置的
        )
*/
$ctrlEventManager = $this->getEventManager();
$ctrlSharedManager = $applicationSharedManager = $ctrlEventManager->getSharedManager();
$applicationEvent = $this->getEvent();
$ctrlPluginManager = $this->getPluginManager();
}
}
// 5、控制器插件管理器
class PluginManager extends AbstractPluginManager
{
/**
* Default set of plugins factories
*
* @var array
*/
protected $factories = array(
'forward' => 'Zend\Mvc\Controller\Plugin\Service\ForwardFactory',
'identity' => 'Zend\Mvc\Controller\Plugin\Service\IdentityFactory',
); /**
* Default set of plugins
*
* @var array
*/
protected $invokableClasses = array(
'acceptableviewmodelselector' => 'Zend\Mvc\Controller\Plugin\AcceptableViewModelSelector',
'filepostredirectget' => 'Zend\Mvc\Controller\Plugin\FilePostRedirectGet',
'flashmessenger' => 'Zend\Mvc\Controller\Plugin\FlashMessenger',
'layout' => 'Zend\Mvc\Controller\Plugin\Layout',
'params' => 'Zend\Mvc\Controller\Plugin\Params',
'postredirectget' => 'Zend\Mvc\Controller\Plugin\PostRedirectGet',
'redirect' => 'Zend\Mvc\Controller\Plugin\Redirect',
'url' => 'Zend\Mvc\Controller\Plugin\Url',
'createhttpnotfoundmodel' => 'Zend\Mvc\Controller\Plugin\CreateHttpNotFoundModel',
'createconsolenotfoundmodel' => 'Zend\Mvc\Controller\Plugin\CreateConsoleNotFoundModel',
); /**
* Default set of plugin aliases
*
* @var array
*/
protected $aliases = array(
'prg' => 'postredirectget',
'fileprg' => 'filepostredirectget',
); public function get($name, $options = array(), $usePeeringServiceManagers = true)
{
$plugin = parent::get($name, $options, $usePeeringServiceManagers);
$this->injectController($plugin); //给控制器插件注入控制器对象 return $plugin;
} /**
* 给控制器插件注入控制器对象
* @param unknown $plugin
*/
public function injectController($plugin)
{
if (!is_object($plugin)) {
return;
}
if (!method_exists($plugin, 'setController')) {
return;
} $controller = $this->getController();
if (!$controller instanceof DispatchableInterface) {
return;
} $plugin->setController($controller);
} public function getController()
{
return $this->controller;
}
}
// 控制器插件的应用
class Ctrl1Controller extends AbstractActionController
{
public function testAction()
{
// redirect 控制器插件
// case.0
$plugin = $this->plugin('redirect');
return $plugin->toUrl('http://www.baidu.com/');
// case.1
return $this->redirect()->toUrl('http://www.baidu.com/'); // forward 控制器插件
// case.0
$plugin = $this->plugin('forward');
return $plugin->dispatch('Module1\Controller\Ctrl2',array('action'=>'method2','otherparams'=>'otherparams_value'));
// case.1
return $this->forward()->dispatch('Module1\Controller\Ctrl2',array('action'=>'method2','otherparams'=>'otherparams_value'));
}
}
class Ctrl2Controller extends AbstractActionController
{
public function method2Action()
{ }
}

ZendFramework-2.4 源代码 - 关于MVC - Controller层的更多相关文章

  1. 关于Spring MVC Controller 层的单元测试

    关于Spring MVC Controller 层的单元测试 测试准备工作: 1.搭建测试Web环境 2.注入Controller 类 3.编写测试数据 测试数据的文件名一定要与测试类的文件名相同,比 ...

  2. Spring+MVC Controller层接收App端请求的中文参数乱码问题。

    在正文之前,说明下Filter的作用: 过滤器顾名思义就是进行过滤的,可以实现代码的定向执行和预处理.通俗点说法filter相当于加油站,request是条路,response是条路,目的地是serv ...

  3. ZendFramework-2.4 源代码 - 关于MVC - View层 - 控制器返回值

    <?php class ReturnController extends AbstractActionController { public function returnAction() { ...

  4. ZendFramework-2.4 源代码 - 关于MVC - View层 - 视图渲染器、视图插件管理器

    <?php // 1. 视图渲染器 class PhpRenderer implements Renderer, TreeRendererInterface { /** * 插件管理器 */ p ...

  5. ZendFramework-2.4 源代码 - 关于MVC - Model层类图

  6. ZendFramework-2.4 源代码 - 关于MVC - View层 - 在模板内渲染子模板

    <?php // 方式一: // 1.在模板内直接编写如下内容即可 $viewModel = new ViewModel(); $viewModel->setTemplate('album ...

  7. ZendFramework-2.4 源代码 - 关于MVC - Model层

    所谓的谓词Predicate // ------ 所谓的谓词 ------ // 条件 case.3 $where = new \Zend\Db\Sql\Where(); $expression = ...

  8. Spring Mvc 在非controller层 实现获取request对象

    一般我们在Controller层,会编写类似这样的方法 @Controller @RequestMapping(value="/detail") public class GetU ...

  9. Spring MVC中,事务是否可以加在Controller层

    一般而言,事务都是加在Service层的,但是爱钻牛角尖的我时常想:事务加在Controller层可不可以.我一直试图证明事务不止可以加在Service层,还可以加在Controller层,但是没有找 ...

随机推荐

  1. eclipse导入maven项目有时出现web.xml is missing的问题

    今天导入一个从Git上pull下来的项目导入eclipse时,报错web.xml is missing,但是我检查了webapp下面的WEB-INF目录下是有web.xml的,然后就纠结了.纠结了半天 ...

  2. Murano 网址一览

    [Murano_Meeting] http://eavesdrop.openstack.org/#Murano_Meeting [Murano_Meeting_Agenda] https://wiki ...

  3. Windows 命令行基础(博主推荐)

    不多说,直接上干货! 见 https://blog.henix.info/blog/windows-cmdbasic/

  4. Spring自动注入有关的注解

    Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. 1,@Comp ...

  5. POJ 2253 ——Frogger——————【最短路、Dijkstra、最长边最小化】

    Frogger Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  6. 在Magento System Configuration页面添加配置项

    以 Jp_Coupon 模块为例: 目标: 在 System configuration 页面添加一个 JP tab, 在JP中添加 Coupon section, 然后给 Coupon sectio ...

  7. jsp连接sqlite、Sqlite相对路径绝对路径问题(转)

    转自  http://blog.csdn.net/sxy12138/article/details/52304884 假如在java中, # 数据库连接jdbc.jdbc-url=jdbc:sqlit ...

  8. 学习笔记:MDN的Web入门

    HTML: 要引用一个父目录的文件,加上两个点. HTML并不是真正的编程语言,它是一种用于定义内容结构的标记语言. 元素(Element):开标签.闭标签与内容相结合,便是一个完整的元素.元素可以用 ...

  9. oracle 查询之前的表数据

    SELECT * FROM Student  AS OF TIMESTAMP SYSDATE - 3/1440 对SQL的解释说明: SYSDATE :当前时间 1440 :24h*60m=1440m ...

  10. vue指令总结(二)

    一.vue指令 1.v-text v-text是用于操作纯文本,它会替代显示对应的数据对象上的值.当绑定的数据对象上的值发生改变,插值处的内容也会随之更新.注意:此处为单向绑定,数据对象上的值改变,插 ...