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

<?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);

?>
时间: 2024-10-13 02:45:37

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

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

<?php class ReturnController extends AbstractActionController { public function returnAction() { // 返回方式一 :会被dipatch处理器Zend\Mvc\View\Http\CreateViewModelListener::createViewModelFromArray(...)的拦截处理 return array('key1' => 'key1value'); // == new View

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

<?php // 方式一: // 1.在模板内直接编写如下内容即可 $viewModel = new ViewModel(); $viewModel->setTemplate('album/album/subtemplate'); // 使用模板,可以不用设置,会自动识别 $viewModel->setVariables($this->vars()); $viewModel->setVariable('var12subtpl', 'var12subtpl_value'); e

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 ServiceMana

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

所谓的谓词Predicate // ------ 所谓的谓词 ------ // 条件 case.3 $where = new \Zend\Db\Sql\Where(); $expression = new \Zend\Db\Sql\Predicate\Expression("field1=? and field2=?",array('a','b')); $where->addPredicates($expression,\Zend\Db\Sql\Predicate\Predic

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

整个spring mvc的架构如下图所示: 现在来讲解DispatcherServletDispatcherServlet的最后一步:视图渲染.视图渲染的过程是在获取到ModelAndView后的过程. 视图渲染的过程: DispatcherServlet.java doService()--->doDispatch()--->processDispatchResult()--->render() processDispatchResult():主要处理异常.请求状态及触发请求完成事件,

谈谈我对MVC的View层实现的理解

MVC框架可以把应用清晰明了地分为三个部分:Model层–数据层,View层–视图层,Controller–逻辑层,Model层负责整合数据,View层负责页面渲染,Controller层负责实现业务逻辑. 我在这里简单说一下我对MVC框架中的View层的理解. View层一般包含两个部分:View类和模版文件,View类并不是必需的,采用View类可以整合代码,因为有时候View层也会有一些复杂的逻辑和数据读取的操作,这些操作最好放在类(或者对象)中实现,如果直接在模版文件中实现,会让模版文件

5-小程序的view层

MVC模式这里就不讲了,不懂MVC模式的就自己去查阅相关资料.小程序的的view层由WXML与WXSS编写,由组件来进行展示.view层将逻辑层的数据反应成界面显示,同时将界面发生的事件发送给逻辑层. WXML(WeiXin Markup language)用于描述页面的结构,可以想象成Html文件. WXSS(WeiXin Style Sheet)用于描述页面的样式,可以想象成Css文件. 组件(Component)是视图的基本组成单元,可以想象成Html中的组件. 下面我们用简单的例子来看看

iOS应用架构谈 view层的组织和调用方案

前言 <iOS应用架构谈 开篇>出来之后,很多人来催我赶紧出第二篇.这一篇文章出得相当艰难,因为公司里的破事儿特别多,我自己又有点私事儿,以至于能用来写博客的时间不够充分. 现在好啦,第二篇出来了. 当我们开始设计View层的架构时,往往是这个App还没有开始开发,或者这个App已经发过几个版本了,然后此时需要做非常彻底的重构. 一般也就是这两种时机会去做View层架构,基于这个时机的特殊性,我们在这时候必须清楚认识到:View层的架构一旦实现或定型,在App发版后可修改的余地就已经非常之小了

iOS应用架构谈-part2 view层的组织和调用方案

前言 <iOS应用架构谈 开篇>出来之后,很多人来催我赶紧出第二篇.这一篇文章出得相当艰难,因为公司里的破事儿特别多,我自己又有点私事儿,以至于能用来写博客的时间不够充分. 现在好啦,第二篇出来了. 当我们开始设计View层的架构时,往往是这个App还没有开始开发,或者这个App已经发过几个版本了,然后此时需要做非常彻底的重构. 一般也就是这两种时机会去做View层架构,基于这个时机的特殊性,我们在这时候必须清楚认识到:View层的架构一旦实现或定型,在App发版后可修改的余地就已经非常之小了