Zend Framework路由器动态路由

Bog*_*scu 1 php routing zend-framework zend-controller-router

我碰到了一个问题,我似乎找不到一个好的解决方案来使它工作.我必须在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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

所以App_Partner::routePartners()给我一个字符串(partner1|partner2|partner3),我用它来创建正确的路线.我的目标是为每个我在Bootstrap中设置的路由设置自定义路由.因此,如果我有一个路线add-product.html设置,我希望它适用于每个合作伙伴partner1/add-product.html,partner2/add-product.html并且partner3/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);
Run Code Online (Sandbox Code Playgroud)

问题

如果我在请求URI中使用伙伴,上面的路由工作正常,但如果我不这样做,我得到双斜线,就像public//proposals.html在上面的路由中设置的反向路由一样"%s/proposals.html".我似乎无法找到避免这种反向路由的方法,因为我使用url视图助手构建我的url,如果没有设置反向路由,我会得到一个异常,说明这一点.

我还需要路由没有一个合作伙伴集,这将是默认的方式(工作add-product.html,proposals.html等等).

wim*_*vds 6

根据您的描述,您似乎正在寻找一个zend路由器链,您的合作伙伴是可选链.

这是一个类似的问题,但使用主机名路由:Zend Framework:从路由获取子域参数.我调整它来解决您的问题,只需将以下内容放入您的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));
}
Run Code Online (Sandbox Code Playgroud)

根据需要改变.在您的控制器中,只有在实际指定且有效时才会获得partner参数的值(如果伙伴不存在,您将收到路由错误)...