0

我正在使用自定义路由器来启用以下页面:

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

我还有存储所有类别的数据库表“类别”。例如,假设以下类别当前存储在我的数据库中:

- html
- css
- js
- php

这意味着,存在以下页面:

  • mytutorialsite.com/category/html
  • mytutorialsite.com/category/css
  • mytutorialsite.com/category/js
  • mytutorialsite.com/category/php

但是当你访问一个没有在数据库中列出的 categoryname 的页面时,比如:

  • mytutorialsite.com/category/foo

您应该收到404 页面不存在消息。

我该如何做到这一点?

4

1 回答 1

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"

现在来自 category/SOMETHING 的所有请求都将转到默认模块 category 控制器。调度程序检查操作 SOMETHING 是否存在。当它执行时,它执行操作。如果不存在,则抛出 Zend_Controller_Action_Exception(“动作不存在”)。

简而言之,这两种方法都有效。有了第一个,您将获得更多控制权。第二种更简单,但是当 categoryController 中存在例如 editAction、addAction 或 removeAction 时,它们也可以被触发(所以要小心那个方法)。

PS。当然,routeStartup 函数应该有一个缓存机制来防止对每个请求进行数据库查询。

于 2010-10-24T10:05:21.710 回答