CakePHP中页面别名的自动路由

时间:2014-09-03 10:06:26

标签: php cakephp routes

我正在使用CakePHP框架创建CMS。通过CMS创建的每个页面都将具有其唯一的URL别名,具体取决于虚拟文件夹结构,例如:

  • www.site.com/level-1/about-us
  • www.site.com/level-2/our-service

用户可以创建自己的页面,该页面最初将具有以下地址: www.site.com/pages/<page_id>然后为其创建网址别名www.site.com/<page_alias>

页面别名存储在数据库中。 如何配置路由以自动反映这些更改,例如,当CMS用户向网站添加新页面时?考虑到他也可以通过CMS更新这些别名。

路由文件包含以下内容

Router::connect(
    '/pages/**',
    array('controller' => 'pages', 'action' => 'show')
);

手动添加路径文件中的每个新别名非常不方便。想象一下,一个新闻网站将有数百篇文章及其独特的别名。 对此有优雅的解决方案吗?

2 个答案:

答案 0 :(得分:1)

您可以从数据库中获取别名并将其放入路径中。此实现使用缓存来防止在每个请求上加载路由。

$menus = ''; 
//Cache::delete('routemenus'); You can uncomment this to delete cache if you change menus 
if($menus = Cache::read('routemenus') === false){ 
    echo 'load from db'; 
    $menusModel = ClassRegistry::init('Menu'); 
    $menus = $menusModel->find('all', array('conditions' => array('parent_id' => '1'))); 
    Cache::write('routemenus', $menus); 
} 

foreach($menus as $menuitem){ 
    Router::connect('/' . $menuitem['Menu']['code'] . '/:action/*', array('controller' => $menuitem['MenuType']['code'], 'action' => 'index')); 
} 

Router::connect('/', array('controller' => 'homepage', 'action' => 'index'));

http://bakery.cakephp.org/articles/iworm/2010/01/10/how-to-implement-dynamic-route-in-cakephp

答案 1 :(得分:0)

我们需要检查page_alias是否不是我们想要的原始控制器。如果你有StatesController而不是/ states / index应该引用索引函数而不是状态page_alias。为此,您需要在保存时忽略具有控制器名称或已定义的路径库的slugs。

接下来,您必须确定是否存在page_alias slug 你可以为此扩展CakeRoute。

查看此http://mark-story.com/posts/view/using-custom-route-classes-in-cakephp 它可以更好地实现您想要做的事情。