Мне было интересно, был ли простой и эффективный способ создания маршрутов в CakePHP (файл route.php), чтобы сопоставить идентификаторы пользователей с тщеславием?
У меня есть (ужасный способ сделать это) следующий тестовый код на моей странице маршрутов:
$users = array ( 1 => 'firstname-lastname', 2 => 'firstname2-lastname2' ); //profiles foreach($users as $k => $v) { // LESSONS (Profiles) Router::connect('/:user', array('controller' => 'teachers', 'action' => 'contentProfile', $k), array('user' => '(?i:'.$v.')')); }
Вышеупомянутый код направляет моего учителя с помощью conProfile как действие из:
mydomain.com/teachers/contentProfile/1 to mydomain.com/firstname-lastname
Могу ли я подключиться к db с страницы маршрутизации? Разве это не хорошая идея с точки зрения производительности? Дайте мне знать, что лучший способ сделать это.
Вы можете создать собственный класс маршрутов, который будет искать переданные URL-адреса в базе данных и перевести их на правильный идентификатор пользователя. Установка продолжительного времени кеша должна уменьшать влияние производительности на БД.
Однако книжная документация немного тонкая, но основная структура такова:
class TeachersRoute extends CakeRoute { /** * Modify incoming parameters so that controller receives the correct data */ function parse($url) { $params = parent::parse($url); // Add / modify parameter information // The teacher id should be sent as the first value in the $params['pass'] array return $params; // Or return false if lookup failed } /** * Modify parameters so calls like HtmlHelper::url() output the correct value */ function match($url) { // modify parameters // add $url['slug'] if only id provided return parent::match($url); }
И затем на ваших маршрутах:
Router::connect( '/:slug', array( 'controller' => 'teachers', 'action' => 'contentProfile' ), array( 'slug' => '[a-zA-Z0-9_-]+' 'routeClass' => 'TeachersRoute', ) );