语言和路由

时间:2014-02-27 12:57:55

标签: cakephp routing cakephp-2.3

我正在阅读有关路由的CakePHP文档,但我还是无法掌握它。

我想要实现的目标是:

  • 它应该在控制器参数前面使用和不使用语言参数。
  • 当没有给出动作时,它应该转到前端动作(此函数也有输入变量)。

修改

最后,我创建了我的应用程序逻辑,如果只定义了1种语言,则没有语言前缀,如果有更多语言,则会生成带有语言前缀的链接(通过覆盖html帮助程序)和路由将是不同的。否则,当我尝试定义单语言版本路由(没有前缀)时总会出现问题。这是我现在可以使用的代码:

(应用程序/配置/ routes.php文件)

/*
 * ===================== Input start ===================== *
 */  

/**
 * Default language
 */
    Configure :: write('Config.language', 'mkd');

/**
 * Application languages
 */
    Configure :: write('Config.languages', array(
        'mkd' => 'Македонски', 
        'eng' => 'English',
    ));

/**
 * ====================== Input end ====================== *
 */ 



/**
 * Counting languages...
 */

Configure :: write('Config.languageCount', count(Configure :: read('Config.languages')));

/**
 * If application is multilingual
 */
    if(Configure :: read('Config.languageCount') > 1) {
        Router::connect('/:language/:controller/:action/*', 
            array(),
            array('language' => implode('|', array_keys( Configure :: read('Config.languages') )))
        );
        Router::connect('/:language/:controller/*', 
            array('action' => 'frontend'),
            array('language' => implode('|', array_keys( Configure :: read('Config.languages') )))
        );
    }
/**
 * If application has one language
 */
    else {
        Router::connect('/:controller/*', array('action' => 'frontend'));
    }

感谢Dave和kicaj的帮助,您的帮助简化了我的方法。

1 个答案:

答案 0 :(得分:2)

您可能希望使用正则表达式 - 类似这样:

Router::connect(
    '/:language/:controller/:action/*',
    array(),
    array('language'=>'[a-z]{3}'
));

注意第三个参数,它为:language提供了名称和正则表达式规则。

然后,您的控制器中可以使用它(您可能会在AppController的beforeFilter()中使用):

$this->request->params['language']
相关问题