0

我想在我的 Zend Framework 应用程序中创建对 seo 友好的 url,但是正确的语法是怎样的:

$newsroute = new Zend_Controller_Router_Route(
   'news/:action/:id_:title',
    array( 'controller' => 'news' ));

:id_:title 显然不起作用,因为 Zend 不知道 _ 是分隔符?我需要为此使用正则表达式路由器还是它也可以与普通路由器一起使用?

4

2 回答 2

2

确实,正则表达式路线可以做到这一点。

如果出于某种原因您不想使用正则表达式路由,可以通过前端控制器插件提供一个简单的解决方法:

//replace the :id and :title params with a single one, mapping them both
$newsroute = new Zend_Controller_Router_Route(
        'news/:action/:article',
         array( 'controller' => 'news' )
   );

// in a front controller plugin, you extract the Id form the article param
function function dispatchLoopStartup( Zend_Controller_Request_Abstract $request ) {

    if( $request->getParam( 'article', false ) ){

        $slug = $request->getParam( 'article' );
        $parts = array();
        preg_match( '/^(\d+)/', $slug, $parts );

        // add the extracted id to the request as if there where an :id param
        $request->setParam( 'id', $parts[0] );
    } 
}

当然,如果需要,您也可以使用相同的方式提取标题。

当你想生成 url 时,不要忘记构建你的 'article' 参数:

 $this->url( array( 'article' => $id.'_'.$title ) );
于 2011-09-20T19:19:36.000 回答
2

为了避免处理包含特殊字符的链接,您可以使用 Zend Framework 的这个插件。

https://github.com/btlagutoli/CharConvert

$filter2 = new Zag_Filter_CharConvert(array(
               'onlyAlnum' => true,
               'replaceWhiteSpace' => '-'
           ));
echo $filter2->filter('éééé ááááá ? 90 :');//eeee-aaaaa-90

这可以帮助您处理其他语言的字符串

于 2011-10-24T20:36:52.873 回答