<?php
// 1. 视图渲染器
class PhpRenderer implements Renderer, TreeRendererInterface
{
/**
* 插件管理器
*/
public function getHelperPluginManager()
{
if (null === $this->__helpers) {// false
$this->setHelperPluginManager(new HelperPluginManager());
}
return $this->__helpers;
} /**
* 获取插件
*/
public function plugin($name, array $options = null)
{
// Zend\Mvc\Service\ViewHelperManagerFactory
// Zend\View\HelperPluginManager
return $this->getHelperPluginManager()->get($name, $options);
} /**
* 渲染
*/
public function render($nameOrModel, $values = null)
{
// ....
try {
ob_start();
$includeReturn = include $this->__file; // 执行模板
$this->__content = ob_get_clean();
} catch (\Exception $ex) {
ob_end_clean();
throw $ex;
}
// ....
}
} // 2. 插件管理器
// 插件管理器创建工厂
class ViewHelperManagerFactory extends AbstractPluginManagerFactory
{
const PLUGIN_MANAGER_CLASS = 'Zend\View\HelperPluginManager'; protected $defaultHelperMapClasses = array(
'Zend\Form\View\HelperConfig',
'Zend\I18n\View\HelperConfig',
'Zend\Navigation\View\HelperConfig'
); public function createService(ServiceLocatorInterface $serviceLocator)
{
$plugins = parent::createService($serviceLocator);
// 注入插件管理器的默认配置
foreach ($this->defaultHelperMapClasses as $configClass) {
if (is_string($configClass) && class_exists($configClass)) {
$config = new $configClass;
$config->configureServiceManager($plugins);
}
} // url插件的创建工厂 Configure URL view helper with router
$plugins->setFactory('url', function () use ($serviceLocator) {
$helper = new ViewHelper\Url; // Zend\View\Helper\Url
$router = Console::isConsole() ? 'HttpRouter' : 'Router';
$helper->setRouter($serviceLocator->get($router)); // 注入路由对象 $match = $serviceLocator->get('application')
->getMvcEvent()
->getRouteMatch()
; if ($match instanceof RouteMatch) {
$helper->setRouteMatch($match); // 注入匹配到的路由对象
} return $helper;
});
// basepath插件的创建工厂
$plugins->setFactory('basepath', function () use ($serviceLocator) {
//...
return $basePathHelper;
});
// doctype插件的创建工厂
$plugins->setFactory('doctype', function () use ($serviceLocator) {
//...
return $doctypeHelper;
});
}
}
// 插件管理器
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);
}
});
}
}
class HelperPluginManager extends AbstractPluginManager
{
protected $factories = array(
'flashmessenger' => 'Zend\View\Helper\Service\FlashMessengerFactory',
'identity' => 'Zend\View\Helper\Service\IdentityFactory',
);
protected $invokableClasses = array(
'basepath' => 'Zend\View\Helper\BasePath',
'cycle' => 'Zend\View\Helper\Cycle',
'declarevars' => 'Zend\View\Helper\DeclareVars',
'doctype' => 'Zend\View\Helper\Doctype', // overridden by a factory in ViewHelperManagerFactory
'escapehtml' => 'Zend\View\Helper\EscapeHtml',
'escapehtmlattr' => 'Zend\View\Helper\EscapeHtmlAttr',
'escapejs' => 'Zend\View\Helper\EscapeJs',
'escapecss' => 'Zend\View\Helper\EscapeCss',
'escapeurl' => 'Zend\View\Helper\EscapeUrl',
'gravatar' => 'Zend\View\Helper\Gravatar',
'htmltag' => 'Zend\View\Helper\HtmlTag',
'headlink' => 'Zend\View\Helper\HeadLink',
'headmeta' => 'Zend\View\Helper\HeadMeta',
'headscript' => 'Zend\View\Helper\HeadScript',
'headstyle' => 'Zend\View\Helper\HeadStyle',
'headtitle' => 'Zend\View\Helper\HeadTitle',
'htmlflash' => 'Zend\View\Helper\HtmlFlash',
'htmllist' => 'Zend\View\Helper\HtmlList',
'htmlobject' => 'Zend\View\Helper\HtmlObject',
'htmlpage' => 'Zend\View\Helper\HtmlPage',
'htmlquicktime' => 'Zend\View\Helper\HtmlQuicktime',
'inlinescript' => 'Zend\View\Helper\InlineScript',
'json' => 'Zend\View\Helper\Json',
'layout' => 'Zend\View\Helper\Layout',
'paginationcontrol' => 'Zend\View\Helper\PaginationControl',
'partialloop' => 'Zend\View\Helper\PartialLoop',
'partial' => 'Zend\View\Helper\Partial',
'placeholder' => 'Zend\View\Helper\Placeholder',
'renderchildmodel' => 'Zend\View\Helper\RenderChildModel',
'rendertoplaceholder' => 'Zend\View\Helper\RenderToPlaceholder',
'serverurl' => 'Zend\View\Helper\ServerUrl',
'url' => 'Zend\View\Helper\Url',
'viewmodel' => 'Zend\View\Helper\ViewModel',
); public function __construct(ConfigInterface $configuration = null)
{
parent::__construct($configuration); $this->addInitializer(array($this, 'injectRenderer')) // 给插件对象注入视图渲染器
->addInitializer(array($this, 'injectTranslator')); // 给插件对象注入语言翻译器
} // 视图渲染器
public function getRenderer()
{
return $this->renderer;
}
}
?>
//3.插件管理器的使用
// 在模板中 moduel1/ctrl1/action1.phtml中使用
<div>hello,this is view plugin demo:</div>
<?php
// view_model 视图插件
$helper = $this->plugin('view_model');
$helper->setCurrent($model); // url 视图插件
// case.0
$helper = $this->plugin('url');
echo $helper('album', array('action'=>'add'));
// case.1
echo $this->url('album', array('action'=>'add')); // basepath 视图插件
$helper = $this->plugin('basepath');
$helper->setCurrent($model); ?>

ZendFramework-2.4 源代码 - 关于MVC - View层 - 视图渲染器、视图插件管理器的更多相关文章

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

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

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

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

  3. ZendFramework-2.4 源代码 - 关于MVC - Controller层

    // 1.控制器管理器 class ServiceManager implements ServiceLocatorInterface { public function __construct(Co ...

  4. 订单业务楼层化 view管理器和model管理器进行了model和view的全面封装处理 三端不得不在每个业务入口上线时约定好降级开关,于是代码中充满了各种各样的降级开关字段

    京东APP订单业务楼层化技术实践解密 原创 杜丹 留成 博侃 京东零售技术 2020-09-29 https://mp.weixin.qq.com/s/2oExMjh70Kyveiwh8wOBVA 用 ...

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

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

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

  7. spring mvc DispatcherServlet详解之四---视图渲染过程

    整个spring mvc的架构如下图所示: 现在来讲解DispatcherServletDispatcherServlet的最后一步:视图渲染.视图渲染的过程是在获取到ModelAndView后的过程 ...

  8. MVC+EF 随笔小计——NuGet程序包管理

    安装EF 打开 工具-库程序包管理器-程序包管理器控制台 输入 install-package entityframework 去MSDN上查看下EF的架构图:http://msdn.microsof ...

  9. 《ASP.NET MVC 5 破境之道》:第一境 ASP.Net MVC5项目初探 — 第三节:View层简单改造

    第一境 ASP.Net MVC5项目初探 — 第三节:View层简单改造 MVC默认模板的视觉设计从MVC1到MVC3都没有改变,比较陈旧了:在MVC4中做了升级,好看些,在不同的分辨率下,也能工作得 ...

随机推荐

  1. Options Menu的android3.0以上和以下版本显示刷新原理,刷新适配

    一 显示区别: 2.3.x及以下版本,需要按菜单键显示菜单,当菜单打开时,第一个可见的部分是图标菜单,最多可容纳6个菜单项.如果你的菜单包括Android的地方超过6项,第六项,其余将被归到”More ...

  2. new 和 delete 用法

    1. 这两个其实是 C++ 语言标准库的库函数,原型分别如下: void *operator new(size_t); //allocate an object void *operator dele ...

  3. Java面向对象_多态性、instanceof关键字

    一.多态 分类:方法的重载与重写:对象的多态性 对象的多态性:向上转型:将子类实例转为父类实例   格式:父类 父类对象=子类实例;是自动转换 向下转型:将父类实例转为子类实例   格式:子类 子类对 ...

  4. 一般的linux系统默认安装的vim是精简版

    一般的linux系统默认安装的vim是精简版(vim-tiny),所以不能配置语法检查等属性或获取在线帮助.需要安装vim-x:x.x.x,vim-common,vim-runtime. :synta ...

  5. FFmpeg编译i386 OSX 脚本

    话不多说, 直接上脚本 #!/bin/sh # directories PLATFORM="OSX" # FFmpeg脚本目录 SOURCE="ffmpeg-2.8.7& ...

  6. MvcPager.dll使用实现无刷新分页以及MvcPager的Nuget程序包实现刷新分页

    无刷新分页: 1.引入JQuery的NuGet程序包 2.引入程序包 3.引入MvcPager.dll  ,MvcPager.dll文件下载链接http://pan.baidu.com/s/1hsvB ...

  7. Educational Codeforces Round 51 (Rated for Div. 2)

    做了四个题.. A. Vasya And Password 直接特判即可,,为啥泥萌都说难写,,,, 这个子串实际上是忽悠人的,因为每次改一个字符就可以 我靠我居然被hack了???? %……& ...

  8. notepad++ 等用正则表达式自动添加sql引号(宏)

    一般sql语句会经常用到给括号里的内容添加引号,sql如下 Select * From Test ', ', ', ', ', '); 一开始参考了http://blog.sina.com.cn/s/ ...

  9. Hadoop之—— WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...

    [hadoop@hadoop000 hadoop]$ ldd --version ldd (GNU libc) 2.12 Copyright (C) Free Software Foundation, ...

  10. IOS 图片剪切(封装数据)

    封装 :生成头像(UIImage (NJ).h / .m @interface UIImage (NJ) /** * 生成头像 * * @param icon 头像图片名称 * @param bord ...