Есть ли способ маршрутизации URL-адресов в торт без идентификатора в URL-адресе?
Поэтому вместо www.mydomain.com/id/article-name я просто хочу www.mydomain.com/article-name
Я слежу за этим. http://book.cakephp.org/view/543/Passing-parameters-to-action
Конечно. Единственное требование для этого состоит в том, что в URL-адресе достаточно уникальной информации для привязки нужной статьи. Если /article-name
уникально в вашей базе данных, вы можете использовать его, чтобы найти нужную запись.
В config / routes.php:
// ... configure all normal routes first ... Router::connect('/*', array('controller' => 'articles', 'action' => 'view'));
В контроллерах / articles_controller.php:
function view ($article_name) { $article = $this->Article->find('first', array( 'conditions' => array('Article.name' => $article_name) )); ... }
Будьте осторожны, чтобы не называть ваши продукты, как все, что могло бы законно отображаться в URL-адресе, поэтому вы не сталкиваетесь с конфликтами. Указывает ли URL http://example.com/pages
на страницы продукта или на array('controller' => 'pages', 'action' => 'index')
? Для этого вам также необходимо будет определить маршруты в routes.php
таким образом, чтобы все ваши контроллеры были доступны в первую очередь, и только неопределенный отдых попадает в ваш ArticlesController
. Посмотрите на третий параметр Routes::connect
, который позволяет вам указать фильтр RegEx, который вы можете использовать для этой цели.
Вы можете сделать это:
// In routes.php $rewrites = array(); $rewrites = am($rewrites, ClassRegistry::init('Article')->rewrites()); $rewrites = am($rewrites, ClassRegistry::init('AnotherModel')->rewrites()); $rewrites = am($rewrites, ClassRegistry::init('YetAnother')->rewrites()); foreach ($rewrites as $rewrite) { Router::connect($rewrite[0], $rewrite[1], $rewrite[2]); }
С помощью метода deceze вы можете только один поймать всех. В этом методе вы можете определить целый стек, если хотите.
Этот метод является хаккой, хотя, поскольку вы запрашиваете модель из файла конфигурации.