15. Zend 路由

原创 2016年08月30日 15:40:44

1. zend1\public\index.php:26

这里写图片描述


2. zend1\library\Zend\Application.php:366

这里写图片描述


3. zend1\library\Zend\Application\Bootstrap\Bootstrap.php:97

这里写图片描述


4. zend1\library\Zend\Controller\Front.php:954
这里写图片描述


5. zend1\library\Zend\Controller\Dispatcher\Standard.php:289
这里写图片描述


6.Zend1\library\Zend\Controller\Action.php:513
这里写图片描述


7.Zend1\application\controllers\TestController.php
这里写图片描述


public function dispatch(Zend_Controller_Request_Abstract $request = null, Zend_Controller_Response_Abstract $response = null)
    {
        if (!$this->getParam('noErrorHandler') && !$this->_plugins->hasPlugin('Zend_Controller_Plugin_ErrorHandler')) {
            // Register with stack index of 100
            require_once 'Zend/Controller/Plugin/ErrorHandler.php';
            $this->_plugins->registerPlugin(new Zend_Controller_Plugin_ErrorHandler(), 100);
        }

        if (!$this->getParam('noViewRenderer') && !Zend_Controller_Action_HelperBroker::hasHelper('viewRenderer')) {
            require_once 'Zend/Controller/Action/Helper/ViewRenderer.php';
            Zend_Controller_Action_HelperBroker::getStack()->offsetSet(-80, new Zend_Controller_Action_Helper_ViewRenderer());
        }

        /**
         * Instantiate default request object (HTTP version) if none provided
         */
        if (null !== $request) {
            $this->setRequest($request);
        } elseif ((null === $request) && (null === ($request = $this->getRequest()))) {
            require_once 'Zend/Controller/Request/Http.php';
            $request = new Zend_Controller_Request_Http();
            $this->setRequest($request);
        }

        /**
         * Set base URL of request object, if available
         */
        if (is_callable(array($this->_request, 'setBaseUrl'))) {
            if (null !== $this->_baseUrl) {
                $this->_request->setBaseUrl($this->_baseUrl);
            }
        }

        /**
         * Instantiate default response object (HTTP version) if none provided
         */
        if (null !== $response) {
            $this->setResponse($response);
        } elseif ((null === $this->_response) && (null === ($this->_response = $this->getResponse()))) {
            require_once 'Zend/Controller/Response/Http.php';
            $response = new Zend_Controller_Response_Http();
            $this->setResponse($response);
        }

        /**
         * Register request and response objects with plugin broker
         */
        $this->_plugins
             ->setRequest($this->_request)
             ->setResponse($this->_response);

        /**
         * Initialize router
         */
        $router = $this->getRouter();
        $router->setParams($this->getParams());

        /**
         * Initialize dispatcher
         */
        $dispatcher = $this->getDispatcher();
        $dispatcher->setParams($this->getParams())
                   ->setResponse($this->_response);

        // Begin dispatch
        try {
            /**
             * Route request to controller/action, if a router is provided
             */

            /**
            * Notify plugins of router startup
            */
            $this->_plugins->routeStartup($this->_request);

            try {
            // 路由器主要负责解析一个请求并且决定什么module、controller、action被请求,并把解析的 URI 放入 $request 对象中
                $router->route($this->_request);
            }  catch (Exception $e) {
                if ($this->throwExceptions()) {
                    throw $e;
                }

                $this->_response->setException($e);
            }

            /**
            * Notify plugins of router completion
            */
            $this->_plugins->routeShutdown($this->_request);

            /**
             * Notify plugins of dispatch loop startup
             */
            $this->_plugins->dispatchLoopStartup($this->_request);

            /**
             *  Attempt to dispatch the controller/action. If the $this->_request
             *  indicates that it needs to be dispatched, move to the next
             *  action in the request.
             */
            do {
            // 派遣开始时,这是为 true,dispatcher 找到方法名时,也设置为 true,标志派遣结束
                $this->_request->setDispatched(true);

                /**
                 * Notify plugins of dispatch startup
                 */
                $this->_plugins->preDispatch($this->_request);

                /**
                 * Skip requested action if preDispatch() has reset it
                 */
                if (!$this->_request->isDispatched()) {
                    continue;
                }

                /**
                 * Dispatch request
                 */
                try {
                    $dispatcher->dispatch($this->_request, $this->_response);
                } catch (Exception $e) {
                    if ($this->throwExceptions()) {
                        throw $e;
                    }
                    $this->_response->setException($e);
                }

                /**
                 * Notify plugins of dispatch completion
                 */
                $this->_plugins->postDispatch($this->_request);
            } while (!$this->_request->isDispatched());//如果为 true 派遣结束
        } catch (Exception $e) {
            if ($this->throwExceptions()) {
                throw $e;
            }

            $this->_response->setException($e);
        }

        /**
         * Notify plugins of dispatch loop completion
         */
        try {
            $this->_plugins->dispatchLoopShutdown();
        } catch (Exception $e) {
            if ($this->throwExceptions()) {
                throw $e;
            }

            $this->_response->setException($e);
        }

        if ($this->returnResponse()) {
            return $this->_response;
        }

        $this->_response->sendResponse();
    }

这里写图片描述

这里写图片描述

该循环大体过程是:

       a.前端控制器开始派遣循环

    b.前端控制器调用派遣器

    c.派遣器获取Request object请求对象,并分析它

    d.派遣器从请求对象中找到对应的Action Controller动作控制器名、

    e.派遣器尝试加载该动作控制器类

    f.动作控制器类加载成功,派遣器实例化动作控制器类

    g.派遣器器从请求对象中找到对应的Action动作名

    h.派遣器将派遣标志设为true,标志着派遣完成

    i.派遣器开始派遣动作控制器类中的Action方法

    j.派遣动作完成,派遣器检测请求对象Request object派遣完成标识是否为false,如果是false则表示还有派遣没有完成,派遣器就再次进入派遣循环过程中;

对于zendframework2的路由配置的说明

经过一下午的摸索,从基本的zendframework2的基础骨骼下面路由经常出问题,于是搜查了一下资料,得到了一份比较详细的路由配置:...
  • cdnight
  • cdnight
  • 2015年11月01日 16:01
  • 1782

Zend Studio 12.0.2打开文件夹项目

1)【文件】=》【新建】=》【PHP Project from Existing Directory】 2)输入项目名称,选择文件位置。 3)完成。...
  • CleverCode
  • CleverCode
  • 2015年05月27日 15:23
  • 2729

为openwrt 15.05(Chaos Calmer) 新增优酷土豆路由宝配置

一 主要修改的文件有: 修改: target/linux/ramips/base-files/etc/board.d/01_leds修改: target/linux/ramips/base-file...
  • gdb3177
  • gdb3177
  • 2016年09月30日 17:14
  • 1711

Zend Framework 2 入门-路由-route

ZF2的路由功能十分强大,在这里简要的介绍下其使用方法。 我们首先来看看ZendSkeletonApplicatio中Application模块中默认的路由设置 (path:/module/App...
  • wang_quan_li
  • wang_quan_li
  • 2014年10月30日 17:46
  • 744

chp15VLAN间路由.pdf

  • 2010年09月26日 21:11
  • 186KB
  • 下载

15.REST 风格的路由规则

REST 风格的路由规则 Express 支持 REST 风格的请求方式,在介绍之前我们先说明一下什么是 REST。REST 的 意思是 表征状态转移(Representational State T...
  • silvercell
  • silvercell
  • 2016年07月09日 06:17
  • 332

15. Magento路由分发过程解析(四):请求重写

Magento请求重写的目的是在路由对象迭代之前,更改请求对象的请求信息。本质上来说,Magento请求重写允许你更改路由对象需求的路径信息,这就意味着,你可以使用重写系统将一个请求从原本的地址(40...
  • enlyhua
  • enlyhua
  • 2015年07月21日 13:48
  • 451

Zend Framework教程-Zend_Controller_Router路由功能

Zend Framework的路由提供了两个主要功能路由和创建路由。 Zend_Controller_Router的Route类和相应Route目录下的类定义常见的路由操作。 接口Zend_Con...
  • mengxiangbaidu
  • mengxiangbaidu
  • 2012年02月03日 16:26
  • 3993

PHP 7 Zend Certification Study Guide Ace the ZCE 2017-PHP Exam epub

  • 2017年11月29日 18:38
  • 487KB
  • 下载

zend studio13.6.1+破解

  • 2017年11月30日 15:48
  • 75B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:15. Zend 路由
举报原因:
原因补充:

(最多只允许输入30个字)