【问题标题】:Automatic routing for page aliases in CakePHPCakePHP 中页面别名的自动路由
【发布时间】:2014-10-27 19:01:11
【问题描述】:

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

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

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

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

Routes 文件有以下内容

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

手动在路由文件中添加每个新别名非常不方便。想象一个新闻网站,其中包含数百篇具有独特别名的文章。 有没有一个优雅的解决方案?

【问题讨论】:

  • 它就像它必须在引导程序或其他东西中完成,或者可能在应用控制器的 beforeFilter() 中完成。但是每次获取数据和定义路由都会花费很多时间。

标签: php cakephp routes


【解决方案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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-12-15
      • 2011-05-08
      • 2011-10-24
      • 1970-01-01
      • 2020-04-06
      • 2011-06-29
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多