2011-01-07 177 views
1

这个问题的标题很难提出,它可能不是最好的,无论如何。Zend Framework:如何映射完全动态路由

我有一个区域,类别和供应商的网站,很明显的解决方案是使用的

"/:module/:controller/:action" 

所以默认路由我的网址会是这个样子

"/region/midlands/category/fashion" 
"/region/midlands/supplier/ted-baker" 

我想要实现的是这样的一种URL格式,但是这需要涉及一个数据库查询来检查是否存在midlands,fashionted-baker

"/midlands/fashion" 
"/midlands/ted-baker" 

我原来的解决方案是使用这样的

"/region/midlands/fashion" 

定义为

routes.category.route = "/region/:region/:category" 
routes.category.defaults.controller = category 
routes.category.defaults.action = index 
routes.category.defaults.module = default 
routes.category.defaults.category = false 
routes.category.defaults.region = false 

routes.supplier.route = "/supplier/:supplier" 
routes.supplier.defaults.controller = supplier 
routes.supplier.defaults.action = index 
routes.supplier.defaults.module = default 
routes.supplier.defaults.supplier = false 

的路线但是,这意味着与regionsupplier前缀的一切。我几乎需要用插件彻底劫持请求?

达到此目的的最佳方法是什么?

感谢您的任何帮助。

编辑。

@ St.Woland,问题是,我想这条路

/:region/:supplier 

要使用此URL

/midlands/ted-baker 

但是这条路线有效地覆盖了默认路由器

回答

0

我已经使用了ErrorController来做到最后。我在有控制器或无路由的情况下捕获异常,然后采取相应措施。

对于某些特定路线的数据库表,有些呼叫是无法找到的,而不是像St.Woland的解决方案那样获取所有路线。结果会被缓存使用标签来帮助很大,这将删除所有的数据库查询查找路线

public function errorAction() 
{ 
    $errors = $this->_getParam('error_handler'); 

    switch ($errors->type) 
    { 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE: 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: 
      //Code for locating routes in Db goes here 
    } 
} 
2

工作最好的方法是像这样在Bootstrap类中添加一个方法:

<?php 
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initMyRoutes() 
    { 
     // First, initialize Database resource 
     $this->bootstrap('db'); 
     // Second, initialize Router resource 
     $this->bootstrap('router'); 

     // Finally, instantiate your database table with routes 
     $m_routes = new Model_Routes() ; 

     // Now get the Router 
     $router = $this->getResource('router'); 

     // ... and add all routes from the database 
     foreach($m_routes->fetchAll() as $route) { 
      $router->addRoute($route->name, new Zend_Controller_Router_Route($route->path, $route->toArray())) ; 
     } 
    } 
} 

然后在您application.ini

[production] 
bootstrap.path = APPLICATION_PATH/Bootstrap.php 
bootstrap.class = Bootstrap 

这将初始化从数据库路由路由器。

您应该记住,在每个请求上对数据库进行排队并不高效,因此请确保使用缓存。

+0

St.Woland嗨,这个问题是不是与添加的路由。它与我如何最好地处理拥有多条动态路线的能力有关。查看问题编辑。 – 2011-01-07 14:08:22