Я создаю CMS, используя CakePHP framework. Каждая страница, созданная через CMS, будет иметь свой уникальный псевдоним URL, в зависимости от структуры виртуальных папок, например:
Пользователь может создать свою собственную страницу, которая изначально будет иметь следующий адрес: www.site.com/pages/<page_id>
а затем создать URL-адрес для него www.site.com/<page_alias>
Псевдонимы страниц хранятся в базе данных. Как настроить маршруты, чтобы автоматически отражать эти изменения, например, когда пользователь CMS добавляет новую страницу на сайт? Имея в виду, он также может обновить эти псевдонимы в будущем через CMS.
Файл маршрутов имеет следующее
Router::connect( '/pages/**', array('controller' => 'pages', 'action' => 'show') );
Добавление каждого нового псевдонима в файл маршрутов вручную крайне неудобно. Представьте себе новостной сайт, на котором будут сотни статей с их уникальными псевдонимами. Есть ли для этого элегантное решение?
Нам нужно проверить, не является ли page_alias исходным контроллером, на который мы намеревались, например, если у вас есть StateController, чем / states / index, следует ссылаться на функцию индекса, а не на page page_alias. Для этого вам нужно будет игнорировать пули с именем контроллера или уже определенными базами маршрутов при сохранении.
Затем вам нужно будет определить, что если существует page_alias slug, вы можете расширить CakeRoute для этого.
Проверьте это http://mark-story.com/posts/view/using-custom-route-classes-in-cakephp. Он имеет очень лучшую реализацию того, что вы хотите сделать.
Вы можете получить псевдонимы из базы данных и поместить их в маршруты. В этой реализации используется кэширование, чтобы предотвратить загрузку маршрутов по каждому запросу.
$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