Zend框架 - 路由器 - 创建别名

时间:2012-03-27 15:33:16

标签: zend-framework

我正在构建一个Zend Framework 1.11.11应用程序,并且想要驱动路由和内容数据库。

我编写了一个FrontController插件,用于从数据库中检索“路径”,并在路由器中为每个路径创建一个条目,以及相关的控制器和操作。

但是,我希望能够使用'别名' - 一个行为类似于普通网址但是别名的网址。

例如,如果我创建以下内容:

// Create the Zend Route
$entry = new Zend_Controller_Router_Route_Static(
    $route->getUrl(), // The string/url to match
    array('controller'  => $route->getControllers()->getName(),
            'action'    => $route->getActions()->getName())
);                    
// Add the route to the router
$router->addRoute($route->getUrl(), $entry); 

然后/about/的路由可以转到staticController,indexAction。

然而,对我来说,创建这条路线别名的最佳方法是什么?所以,如果我去/abt/它会呈现相同的控制器和动作吗?

对我而言,重新创建相同的路线是没有意义的,因为我将使用路线作为页面'标识符',然后从页面的数据库加载内容...

1 个答案:

答案 0 :(得分:1)

你可以扩展静态路由器:

class My_Route_ArrayStatic extends Zend_Controller_Router_Route_Static
{
    protected $_routes = array();

    /**
     * Prepares the array of routes for mapping
     * first route in array will become primary, all others
     * aliases
     * 
     * @param array $routes array of routes
     * @param array $defaults 
     */
    public function __construct(array $routes, $defaults = array())
    {
        $this->_routes = $routes;
        $route = reset($routes);
        parent::__construct($route, $defaults);
    }

    /**
     * Matches a user submitted path with a previously specified array of routes
     * 
     * @param string $path
     * @param boolean $partial
     * @return array|false 
     */
    public function match($path, $partial = false)
    {
        $return = false;

        foreach ($this->_routes as $route) {
            $this->setRoute($route);
            $success = parent::match($path, $partial);
            if (false !== $success) {
                $return = $success;
                break;
            }
        }

        $this->setRoute(reset($this->_routes));
        return $return;
    }

    public function setRoute($route)
    {
        $this->_route = trim($route, '/');
    }
}

以这种方式添加新路由器:

$r = My_Route_ArrayStatic(array('about', 'abt'), $defaults);