CakePHP Router :: connect()别名?

时间:2010-03-01 02:15:37

标签: php cakephp

CakePHP中是否可以在routes.php中包含URL别名?或者通过其他方式可以实现同等的目标:

让我们假设我有一些分页视图。在可能的排序中,有一些我想要绑定到简单URL的特定排序。 E.g:

如何将参数添加到Router :: connect()?伪代码:

Router::connect('/'.__('headlines',true),
        array(
        'controller' => 'posts',
        'action' => 'listView'
        'params' => 'page:1/sort:Post.created/direction:desc',
        )
);

2 个答案:

答案 0 :(得分:3)

请注意,路由器会将URL“转换”为控制器,操作和参数,但它不会将URL“转发”到其他网址。因此,写这样:

Router::connect('/headlines',
    array(
        'controller' => 'posts',
        'action' => 'listView'
        'page' => 1,
        'sort' => 'Post.created',
        'direction' => 'desc'
    )
);

我认为'/'.__('headlines', true)不会起作用,因为此时应用程序设置不足以翻译任何内容,因此您只能使用默认语言获取该单词。此外,在此之后您无法再切换语言,首次使用__() 锁定语言。

您需要明确地连接所有网址。为了节省一些打字,你可以这样做:

$headlines = array('en' => 'headlines', 'de' => 'schlagzeilen', ...);
foreach ($headlines as $lang => $headline) {
    Router::connect("/$headline", array('controller' => ..., 'lang' => $lang));
}

这将创建一个$this->param['named']['lang']变量,您应该在URL中使用该变量。

答案 1 :(得分:3)

是的,有可能...... Bootstrap.php在路由之前加载,所以如果你在那里设置:

session_start();
if(isset($_SESSION['lng'])){
    Configure::write('Config.language', $_SESSION['lng']);
}

...并在beforeFilter的app控制器中:

$language = 'xy';
Configure::write('Config.language', $language);
$_SESSION['lng'] = $language;

因此,初始页面会提示您语言,重定向到xy.site.com或www.site.com/xy,无论您喜欢什么。现在,第二个渲染将更改$language和页面链接并设置$_SESSION['lang'] ...

所有路由器链接如:

Router::connect(__('/:gender/search/:looking_for/*'), array('controller' => 'users', 'action' => 'search'));

将成为:

Router::connect(__('/:gender/trazi/:looking_for/*'), array('controller' => 'users', 'action' => 'search'));

或:

Router::connect(__('/:gender/suche/:looking_for/*'), array('controller' => 'users', 'action' => 'search'));

100%测试,适用于CakePHP 2.2。如果你将subdomain / language url解析器放在bootstrap本身...

,也可以进一步改进