默认情况下,您在ZF中具有以下URL语法:/ module/controller/action。我想要的是建立一个菜单系统,我可以使用任何我想要的网址。Zend Framework中的全动态路由器
比方说我做一个菜单项称为“新闻”。当我打电话http://www.site.com/news我想有如下因素加载:
- 模块:新闻
- 控制器:头版
- 行动:显示
这些配置值必须在数据库 - 被配置记录菜单项。
我该如何在zend中做到这一点?我花了很多时间寻找它,但我仍然无法弄清楚如何去做。有人吗?
默认情况下,您在ZF中具有以下URL语法:/ module/controller/action。我想要的是建立一个菜单系统,我可以使用任何我想要的网址。Zend Framework中的全动态路由器
比方说我做一个菜单项称为“新闻”。当我打电话http://www.site.com/news我想有如下因素加载:
这些配置值必须在数据库 - 被配置记录菜单项。
我该如何在zend中做到这一点?我花了很多时间寻找它,但我仍然无法弄清楚如何去做。有人吗?
您可以创建一个插件和routeStartup定义拦截您的请求和路由/module/controller/action
到/action
的东西,但对于这一切的操作名称必须是唯一的:
class My_CustomRouterPlugin extends Zend_Controller_Plugin_Abstract
{
public function routeStartup(Zend_Controller_Request_Abstract $request)
{
$fc = Zend_Controller_Front::getInstance();
$action =$fc->getRequest()->getActionName();
$router = $fc->getRouter();
$model= new myModel();
$myPage = $model->getPageByAction($action);
$route = new Zend_Controller_Router_Route('/action', array(
'module' => $myPage->getModule();
'controller' => $myPage->getController();
'action' => $action;
));
$router->addRoute($action, $route);
return $router;
}
}
基于myModel定义一个方法可以让你一个包含模块,控制器名称(来自你的数据库)的对象(或数组)。
并注册这个插件在你的引导:
$front->registerPlugin(new My_CustomRouterPlugin());
我建议使用前端控制器插件扫描您的数据库中的所有条目,创建基于这些条目的路由规则,并将其添加到路由器(see this)。
当然缓存战略的建议,这样你就不会做了很多处理的每个请求。
我不能只是只装入用过的物品? – 2012-02-23 13:15:40
是的,你可以。但是,如果你想产生很好的链接到其他页面(使用'url'视图助手),你将需要所有(好,可能全部)定义的路线。 – bububaba 2012-02-23 13:24:17
这是一个很好的;-) – 2012-02-23 14:02:35