欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Zend_Controller_Router_Route_Hostname和端口 ZendPHPF# 

程序员文章站 2022-07-14 17:36:16
...

最近在配置zend的路由,需要根据不同的二级域名进行权限控制。其中使用到了Zend_Controller_Router_Route_Hostname这个路由。并使用了路由链,配置代码如下:

routes.hostname.type  = "Zend_Controller_Router_Route_Hostname"
routes.hostname.route = ":instance"

routes.hostname.chains.static.route = ":action"
routes.hostname.chains.static.defaults.controller = index

routes.hostname.chains.objects.type = "Zend_Controller_Router_Route_Regex"
routes.hostname.chains.objects.route = "([a-z]+(?:-[a-z]+)?)s(?:/([a-z]+)?)?"
routes.hostname.chains.objects.defaults.action = list
routes.hostname.chains.objects.map.1 = "controller"
routes.hostname.chains.objects.map.2 = "action"
routes.hostname.chains.objects.reverse = "%ss/%s"

routes.hostname.chains.object.type = "Zend_Controller_Router_Route_Regex"
routes.hostname.chains.object.route = "([a-z]+(?:-[a-z]+)?)s/([0-9a-f]{32})(?:/([a-z]+))?"
routes.hostname.chains.object.defaults.action = view
routes.hostname.chains.object.map.1 = "controller"
routes.hostname.chains.object.map.2 = "id"
routes.hostname.chains.object.map.3 = "action"
routes.hostname.chains.object.reverse = "%ss/%s/%s"

routes.hostname.chains.children.type = "Zend_Controller_Router_Route_Regex"
routes.hostname.chains.children.route = "((?:[a-z]+s/[1-9]\d*/)*)([a-z]+(?:-[a-z]+)?)s/([0-9a-f]{32})/([a-z]+(?:-[a-z]+)?)s(?:/([a-z]+))?"
routes.hostname.chains.children.defaults.action = list
routes.hostname.chains.children.map.1 = "ancestors"
routes.hostname.chains.children.map.2 = "parent_cls"
routes.hostname.chains.children.map.3 = "parent_id"
routes.hostname.chains.children.map.4 = "controller"
routes.hostname.chains.children.map.5 = "action"
routes.hostname.chains.children.reverse = "%s%ss/%s/%ss/%s"

 发现程序中生成的url的端口号全部丢失。仔细看代码源码发现Zend_Controller_Router_Route_Chain中的assemble方法

   public function assemble($data = array(), $reset = false, $encode = false)
    {
        $value = '';

        foreach ($this->_routes as $key => $route) {
            if ($key > 0) {
                $value .= $this->_separators[$key];
            }
            
            $value .= $route->assemble($data, $reset, $encode);
            
            if (method_exists($route, 'getVariables')) {
                $variables = $route->getVariables();
                
                foreach ($variables as $variable) {
                    $data[$variable] = null;
                }
            }
        }

        return $value;
    }

 循环调用路由,但是在Zend_Controller_Router_Route_Hostname中的match方法中

 // Get the host and remove unnecessary port information
        $host = $request->getHttpHost();
        if (preg_match('#:\d+$#', $host, $result) === 1) {
            $host = substr($host, 0, -strlen($result[0]));
        }

 这段去掉了端口号,而Zend_Controller_Router_Route_Chain中有将这里返回的url与后面的url拼接,这样产生的url端口自然就丢失了。不知道当时作者为什么要这样写,是不是因为有其他的原因?返回带端口的url有何不可?希望对PHP熟悉的人给予解释。

相关标签: Zend PHP F#