Согласитесь, ссылки вида http://site/id намного приятнее для пользователя, чем ссылки вида http://site/controller/action/id, особенно, если основное назначение сайта, например, выдавать картинки или заранее сформированные странички, которые уникальны.
В английской справке по CakePHP сказано, что теперь он поддерживает маршруты именно в такой форме, правда инструкция, даже переведенная на русский язык переводчиком не вполне очевидна.
Итак, простые и понятные вещи:
Router::connect(‘/’,
array(‘controller’ => ‘products’, ‘action’ => ‘display’, 5)
);
Тут все просто и понятно, что при обращении к главной странице будет вызван контроллер products, с методом display и в качестве параметра id ему будет передано 5.
Усложним задачу: сократим стандартную адресную строку /controller/action/id на один элемент, action, например. В этом случае надо прописать вот такой вот маршрут:
Router::connect(
‘/:controller/:id’,
array(‘action’ => ‘view’),
array(‘id’ => ‘[0-9]+’)
);
В результате, мы описали формат адресной строки, что у нас будет только /controller/id, а action будет все время view. Уже лучше.
Избавляемся еще и от контроллера. Я долго думал, но наконец, придумал, как оно должно на самом деле выглядеть. Как и полагается, оно все до невероятности просто.
Router::connect(
‘/*’,
array(‘controller’ => ‘pages’, ‘action’ => ‘display’)
);
Что получаем в результате? Верно, адрес самого простого вида: http://site/id, причем будет вызываться контроллер pages с методом display, а все, что стоит в в заголовке будет передано в качестве id методу.
К слову, если нужна большая уникальность, неподбираемость ключей, неупорядоченность, то, наверное, привязывать записи в базе кроме поля id нужно еще к какому-нибудь полю, например, guid, которое можно довольно несложно потом генерировать, если в контроллере на метод добавления написать что-то вроде
$this->data['image']['guid'] = uniqid(rand(), false);