4

我正在开发一个需要使用数据库驱动的 MVC 方案的项目,其中控制器和视图的路由通过单个数据库表进行控制。但是,我找不到任何教程可以用当前版本的框架演示这一点(它们似乎都是在几个版本之前编写的),我想知道是否有人用更新的版本做了类似的事情框架,或者如果有人知道讨论如何以简单方式完成此任务的博客或教程。

基本思想是会有一个 sitePage 表,其中包含 pageName、控制器、模块和视图字段。当请求被处理时,我需要在数据库中查询给定的 pageName 并确定适当的控制器、模块和视图,然后将其传递给必要的 Zend 类以继续正常路由和处理请求。

提前致谢。

4

3 回答 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);
        }

     }

 }
于 2011-04-05T07:52:19.077 回答
2

也许最好的方法不是使用路由器,而是使用插件或通用控制器。如果没有更深入的分析,我建议您创建一个前端控制器插件,然后在该preDispatch()方法中您可以与数据库通信并重置请求,以便将其分派到正确的控制器。

您也可以通过使用通用控制器获得相同的效果,所有请求都路由到它,然后它可以在与数据库通信后转发到正确的控制器,尽管我更喜欢使用插件。

从手册:

preDispatch()在调度程序调度操作之前调用。此回调允许代理或过滤器行为。通过更改请求并重置其已分派标志(通过Zend_Controller_Request_Abstract::setDispatched(false)),可以跳过和/或替换当前操作。

http://framework.zend.com/manual/en/zend.controller.plugins.html

于 2008-12-19T21:43:17.007 回答
2

我意识到更优雅的方法确实是使用路由器,但为此您需要通过扩展 Zend_Controller_Router_Abstract 类并实现“路由”方法来创建自定义的方法。

你得到一个 Zend_Controller_Request_Abstract 对象作为“路由”方法的参数。在那里您可以与数据库对话,然后您可以使用:

Zend_Controller_Request_Abstract::setModuleName(),
Zend_Controller_Request_Abstract::setControllerName(),
Zend_Controller_Request_Abstract::setActionName()

定义你的路线。

我希望它有帮助!

于 2008-12-19T21:53:05.087 回答