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',
)
);
答案 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本身...
,也可以进一步改进