我使用自定义路由器来启用以下页面:
mytutorialsite.com/category/:categoryname
# added to application.ini
resources.router.routes.categorynameOnCategory.route = /category/:categoryname
resources.router.routes.categorynameOnCategory.defaults.module = default
resources.router.routes.categorynameOnCategory.defaults.controller = category
resources.router.routes.categorynameOnCategory.defaults.action = categoryname
我还有数据库表'categories',其中存储了所有类别。例如,假设以下类别当前存储在我的数据库中:
- html
- css
- js
- php
这意味着,存在以下页面:
但是当您访问具有未在数据库中列出的类别名称的页面时,例如:
您应该收到 404页面不存在消息。
我如何实现这一目标?
答案 0 :(得分:1)
我认为您的意思是将categoryname作为路线中的操作:categoryname应该用作动作吗?您可以使用两种方法。首先,您只将路由添加到存在类别的路由器。当请求category / foo时,路由器将无法识别路由并抛出404错误。
第二个选项是您捕获所有类别/ *路线,并在您的操作中检查该类别是否存在。
对于第一个选项,添加一个带有routeStartup函数的frontController插件。在这个钩子你可以做:
public function routeStartup(Zend_Controller_Request_Abstract $request)
{
// Get the router
$router = Zend_Controller_Front::getInstance()->getRouter();
// Fetch all your categories
$category = new Application_Model_Category;
$categories = $category->fetchAll();
// Loop and add all individual categories as routes
foreach ($categories as $category) {
$route = 'category/:' . $category->name;
$params = array(
'module' => 'default',
'controller' => 'category',
'action' => $category->name
);
$route = new Zend_Controller_Router_Route($route, $params);
$router->addRoute($category->name, $route);
}
}
另一种方法对于路线来说更简单。在你的application.ini中:
resources.router.routes.category.route = "category/:action"
resources.router.routes.category.module = "default"
resources.router.routes.category.controller = "category"
现在,来自类别/ SOMETHING的所有请求都将转到默认模块类别控制器。调度程序检查操作SOMETHING是否存在。如果是,它会执行操作。如果没有,抛出Zend_Controller_Action_Exception(“动作不存在”)。
简而言之,这两种方法都有效。随着第一个你得到更多的控制。第二个更简单但是例如存在categoryController中的editAction,addAction或removeAction,它们也可以被触发(所以要小心那个方法)。
PS。当然,routeStartup函数应该有一个缓存机制来阻止对每个请求进行数据库查询。