1

使用 Zend 框架,我正在尝试构建一个对 SEO 友好的 URL

http://ww.website.com/public/index/categories/category/2
应该由http://ww.website.com/public/index/categories/category.html

http://ww.website.com/public/index/products/category/2/subcategory/2
应该由http://ww.website.com/public/index/products/product.html

在我的引导文件中,我尝试过这个

protected function _initRoutes()
{ 
    $frontController = Zend_Controller_Front::getInstance ();
    $router = $frontController->getRouter ();
    $route = new Zend_Controller_Router_Route_Regex(
        'index/categories/category/(\d*)/',
        array('module' => 'default','controller' => 'index','action' => 'categories'), 
        array(1 => 'category'),
        'index/categories/%d-%s.html');

    $router->addRoute('category', $route);
}

现在我的问题是如何重写这个 URL?我还使用以下方法根据 URL 中的 ID 检索产品或类别:

$id = $this->_getParam('category', 0 ); 

任何人都可以帮助我吗?

4

2 回答 2

1

我认为您不需要 Regex 路由来满足您的需要。例如,如果你想要这个 url: http://mysite.com/category/cars.htmlto go tohttp://mysite.com/categories/category/id/2就足以使用 Zend_Controller_Router_Route

现在只有一个问题 Zend Router 不会知道要映射的类别的 id,为此您需要将自定义路由存储到数据库或文件中;每个自定义路由都将包含映射的 url 和所需参数(控制器名称、操作名称、类别 ID)。

在我们有了它之后,我们可以构建一个函数来注册一个自定义路由到引导文件,或者在一些像这样的插件中:

public function setRoute($params){
    $router = Zend_Controller_Front::getInstance()->getRouter();
    $params = array(
        'controller' => $params['controller'],
        'action'     => $params['action'],
        'id'         => $params['id']
        );
    $route = new Zend_Controller_Router_Route($params['url'], $params);
    $router->addRoute($params['url'], $route);
}

现在让我们假设它$params['url']具有值:http://mysite.com/category/cars.html当从浏览器请求该 url ZF 将匹配我们的自定义路由并将请求转发到指定的控制器$params['controller'],并调用指定的操作$params['action']并将设置为名为 id 的参数值,$params['id']可以从控制器检索$id = $this->_getParam('id',0);

于 2012-09-23T16:43:27.027 回答
1

我认为您选择了错误的路径,因为如果您的产品名称在基本 URL 之后开始,例如“ http://www.promotepassion.com/classical/rock ”表示基本路径然后是类别名称,那么SEO 友好对 .html 或 .php 没有意义产品名称,如果我们使用那么所有搜索引擎快速调用页面。

于 2013-12-27T10:03:04.423 回答