Zend框架中基于数据库的路由教程?

4
我正在处理一个项目,需要使用基于数据库的MVC架构,其中控制器和视图的路由通过单个数据库表进行控制。然而,我没有找到任何教程来演示如何在当前版本的框架中实现这一点(它们似乎都是几个版本之前写的),我想知道是否有人已经在更近期的框架版本中完成了这样的事情,或者是否有人知道博客或教程介绍如何以简单的方式实现这一点。
基本思路是,将会有一个sitePage表,其中包含pageName、controller、module和view字段。当请求被处理时,我需要查询给定的pageName并确定适当的控制器、模块和视图,然后将其传递到必要的Zend类中,以继续正常的路由和请求处理过程。
提前感谢。
3个回答

5
您还可以在插件中使用routeStartup()方法。例如:
 class My_Plugin_PageRoute extends Zend_Controller_Plugin_Abstract {

     public function routeStartup ()  {
         $front = Zend_Controller_Front::getInstance();
                    $pages = new Model_Pages();
                    $page_data = $pages ->getPageInfo();

        $router = $front->getRouter();

        foreach($page_data as $page) {
            $r = new Zend_Controller_Router_Route(
                '' . $page -> page_name,
                array('controller' => 'pages',
                      'action' => 'index',
                      'page_id' => $page -> page_id)
            );
            $router->addRoute('pages_' . $page -> page_id, $r);
        }

     }

 }

2
也许最好的方法不是使用路由器,而是使用插件或一个公共控制器。在没有进行更深入的分析之前,我建议您创建一个Front Controller Plugin,然后在preDispatch()方法中,您可以与数据库交互并重置请求,以使其转发到正确的控制器。
您也可以通过使用一个公共控制器来达到同样的效果,所有请求都被路由到它,然后在与数据库交互后将其转发到正确的控制器,尽管我更喜欢使用插件。
根据手册:
在分派程序员调用动作之前调用preDispatch()。这个回调函数允许代理或过滤器行为。通过改变请求并重置其分派标志(通过Zend_Controller_Request_Abstract::setDispatched(false)),当前动作可能会被跳过和/或替换。
参考链接:http://framework.zend.com/manual/en/zend.controller.plugins.html

2
我意识到更优雅的方法是使用路由器,但这需要通过扩展Zend_Controller_Router_Abstract类并实现“route”方法来创建自定义路由器。
您将获得一个Zend_Controller_Request_Abstract对象作为“route”方法的参数。在那里,您可以访问数据库,然后可以使用以下内容:
Zend_Controller_Request_Abstract::setModuleName(),
Zend_Controller_Request_Abstract::setControllerName(),
Zend_Controller_Request_Abstract::setActionName()

定义您的路由。

希望对您有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接