繁体   English   中英

如何在Zend-Framework中创建自定义路由器?

[英]How to create a custom router in Zend-Framework?

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

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

但是,当您访问具有数据库中未列出的类别名称的页面时,例如:

  • mytutorialsite.com/category/foo

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

我该如何实现?

我认为您的意思是在路由中使用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 controller。 调度程序检查动作“ SOMETHING”是否存在。 完成后,它将执行操作。 否则,将引发Zend_Controller_Action_Exception(“动作不存在”)。

简而言之,两种方法都可以。 首先,您将获得更多控制权。 第二个更简单,但是当categoryController中存在editAction,addAction或removeAction时,它们也可以被触发(因此请谨慎使用该方法)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM