ZendFramework-2.4 源代码 - 关于MVC - Controller层
// 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层的更多相关文章
- 关于Spring MVC Controller 层的单元测试
关于Spring MVC Controller 层的单元测试 测试准备工作: 1.搭建测试Web环境 2.注入Controller 类 3.编写测试数据 测试数据的文件名一定要与测试类的文件名相同,比 ...
- Spring+MVC Controller层接收App端请求的中文参数乱码问题。
在正文之前,说明下Filter的作用: 过滤器顾名思义就是进行过滤的,可以实现代码的定向执行和预处理.通俗点说法filter相当于加油站,request是条路,response是条路,目的地是serv ...
- ZendFramework-2.4 源代码 - 关于MVC - View层 - 控制器返回值
<?php class ReturnController extends AbstractActionController { public function returnAction() { ...
- ZendFramework-2.4 源代码 - 关于MVC - View层 - 视图渲染器、视图插件管理器
<?php // 1. 视图渲染器 class PhpRenderer implements Renderer, TreeRendererInterface { /** * 插件管理器 */ p ...
- ZendFramework-2.4 源代码 - 关于MVC - Model层类图
- ZendFramework-2.4 源代码 - 关于MVC - View层 - 在模板内渲染子模板
<?php // 方式一: // 1.在模板内直接编写如下内容即可 $viewModel = new ViewModel(); $viewModel->setTemplate('album ...
- ZendFramework-2.4 源代码 - 关于MVC - Model层
所谓的谓词Predicate // ------ 所谓的谓词 ------ // 条件 case.3 $where = new \Zend\Db\Sql\Where(); $expression = ...
- Spring Mvc 在非controller层 实现获取request对象
一般我们在Controller层,会编写类似这样的方法 @Controller @RequestMapping(value="/detail") public class GetU ...
- Spring MVC中,事务是否可以加在Controller层
一般而言,事务都是加在Service层的,但是爱钻牛角尖的我时常想:事务加在Controller层可不可以.我一直试图证明事务不止可以加在Service层,还可以加在Controller层,但是没有找 ...
随机推荐
- 两个线程分别打印 1- 100,A 打印偶数, B打印奇数
package com.demo.thread; public class PrintNumber { private static Object lock = new Object(); priva ...
- MapReduce实战:自定义输入格式实现成绩管理
1. 项目需求 我们取有一份学生五门课程的期末考试成绩数据,现在我们希望统计每个学生的总成绩和平均成绩. 样本数据如下所示,每行数据的数据格式为:学号.姓名.语文成绩.数学成绩.英语成绩.物理成绩.化 ...
- bash和zsh切换
zsh切换bash bash切换zsh 切换bash chsh -s /bin/bash 切换zsh chsh -s /bin/zsh
- 关于SQL Server数据库中的标识列
一.标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列. 该种列具有以下三种特点: 1.列的数据类型为不带小数的数值类型 2.在进行插入(Insert)操作时,该列的值 ...
- 将MySQL转化为mysqli
<?php/** * Created by PhpStorm. * User: 大神 * Date: 2017/7/24 * Time: 11:29 */ header('content-typ ...
- iis mvc html
iis mvc项目显示view文件夹下的html <system.webServer><handlers> <add name="JavaScriptHandl ...
- 开始使用JQuery 方法
使用jQuery需要3个基本步骤: 1. 下载jQuery.js并保存在网页可以存取的位置.下载链接:dowload 2. 在HTML的head里引用jQuery.js 3. 运用jQuery的方法 ...
- log4net 最快速体验
本文供实习司机快速上手log4net最基本功能,共4步,3分钟搞定. 一.添加log4net.dll引用,可使用nuget安装或直接引用文件 二.添加配置 在app.config或web.config ...
- cf1042F. Leaf Sets(贪心)
题意 题目链接 给出一棵树,删除一些边,使得任意联通块内的任意点距离不超过$k$ sol 考场上想的贪心是对的:考虑一棵子树,如果该子树内最深的两个节点的距离相加$>k$就删掉最深的那个点,向上 ...
- js对jsonArray的操作
上一篇写了关于java中Gson对jsonArray的排序处理,这里介绍js中对jsonArray处理, <!DOCTYPE html> <html> <head> ...