【问题标题】:Zend Framework Router dynamic routesZend Framework Router 动态路由
【发布时间】:2011-07-17 05:27:56
【问题描述】:

我遇到了一个问题,我似乎无法找到一个好的解决方案来让它发挥作用。我必须在 Zend Framework 项目中创建一些动态路由。我会很快解释我的问题是什么:

我需要动态自定义路由来“扩展”默认路由 (module/controller/action/params)。我正在工作的项目有几个合作伙伴,并且路线必须与这些合作伙伴一起工作。 为了存储合作伙伴,我制作了一个静态类,它看起来像这样。

<?php
    class App_Partner
    {
        static public $partners = array(
            array(
                'name' => 'partner1',
                'picture' => 'partner1.jpg'
            ),
            array(
                'name' => 'partner2',
                'picture' => 'partner2.jpg'
            ),
            array(
                'name' => 'partner3',
                'picture' => 'partner3.jpg'
            )
        );
        static public function routePartners() {
            $partners = array();

            foreach(self::$partners as $partner) {
                array_push($partners, strtolower($partner['name']));
            }
            $regex = '(' . implode('|', $partners) . ')';

            return $regex;
        }
    }

所以App_Partner::routePartners() 给我返回一个类似(partner1|partner2|partner3) 的字符串,我用它来创建正确的路线。我的目标是为我在 Bootstrap 中设置的每条路线为每个合作伙伴提供自定义路线。因此,如果我设置了一条路线 add-product.html,我希望它可以为每个合作伙伴工作,如 partner1/add-product.htmlpartner2/add-product.htmlpartner3/add-product.html。 此外,partner1/partner2/partner3 应该路由到 default/index/index

事实上,我使用如下路线使这个东西能够工作。

<?php
$routeProposal = new Zend_Controller_Router_Route_Regex(
    App_Partner::routePartners() . '?/?proposals.html',
    array(
        'module' => 'default',
        'controller' => 'proposal',
        'action' => 'index',
        'page' => 1
    ),
    array( 1 => 'partner'),
    "%s/proposals.html"
);
$router->addRoute('proposal', $routeProposal);

问题

如果我在请求 URI 中使用合作伙伴,上述路由可以正常工作,但如果我不这样做,我会得到像 public//proposals.html 这样的双斜杠,因为在上面的路由中设置的反向路由是 "%s/proposals.html"。我似乎找不到避免这种反向路由的方法,因为我使用 url view helper 构建我的 url,如果没有设置反向路由,我会收到一个异常说明。

我还需要在没有合作伙伴集的情况下工作的路线,这将是默认方式(add-product.htmlproposals.html 等)。

【问题讨论】:

  • 我读过,但它对我没有太大帮助。他的路线是独特而不同的。我的是“可覆盖的”——多条路由必须具有相同的名称,这样我才能使用基于路由名称的 URL 助手构建 url。
  • :-) 他的路线是我的路线 = 同一个用户。我有一个解决方案,如果其他人没有击败我,我会稍后写出来。
  • 啊,抱歉,没有查看谁发布了这个问题 :) 是的,所以我的路线需要相同,但如果我设置了合作伙伴,则会被覆盖请求 URI。

标签: php zend-framework routing zend-controller-router


【解决方案1】:

根据您的描述,您似乎正在寻找zend router chain,其中您的合作伙伴 是一个可选链。

这是一个类似的问题,但使用主机名路由:Zend Framework: get subdomain parameter from route。我对其进行了调整以解决您的问题,只需将以下内容放入您的 Bootstrap.php 即可初始化路由:

protected function _initRoute()
{
    $this->bootstrap('FrontController');
    $router = $this->getResource('FrontController')->getRouter();

    // Default route
    $router->removeDefaultRoutes();
    $defaultRoute = new Zend_Controller_Router_Route(
                    ':controller/:action/*',
                    array(
                        'module' => 'default',
                        'controller' => 'index',
                        'action' => 'index',
                    )
    );
    $router->addRoute('default', $defaultRoute);

    $partnerRoute = new Zend_Controller_Router_Route(
        ':partner',
        array('partner' => 'none'),
        array('partner' => '^(partner1|partner2|partner3)$')
    );
    $router->addRoute('partner', $partnerRoute->chain($defaultRoute));
}

随心所欲地改变。在您的控制器中,只有在实际指定且有效的情况下,您才会获得合作伙伴参数的值(如果合作伙伴不存在,您将收到路由错误)...

【讨论】:

    【解决方案2】:

    在我的路线中,我使用类似的过程来 detech lang(但使用 ini 文件)。

    您可以为您的合作伙伴参数使用默认值以使路由在没有合作伙伴的情况下工作,并将? 添加到您的正则表达式。

    但实际上,我不知道如何避免双重//...

    希望对您有所帮助。

    编辑:供您参考,这是我的路线的简化版本,带有语言:

    routes.lang.type = "Zend_Controller_Router_Route"
    routes.lang.route = "lang/:language/*"
    routes.lang.reqs.language = "^(en|fr|nl|de)?$"
    routes.lang.defaults.language = none
    routes.lang.defaults.module = default
    routes.lang.defaults.controller = index
    routes.lang.defaults.action = language
    

    【讨论】:

    • 问题是我不能在没有合作伙伴的情况下使用默认字符串。这种基于路由内强制字符串的方法适用于我发布的路由。问题似乎出在 URL 视图助手用来构建 url 的反向路由上。
    猜你喜欢
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多