Необходимо настроить более чистые ссылки - в настоящее время ссылки слишком длинные - Zend framework
-
22-09-2019 - |
Вопрос
Я использую zend framework для своего проекта - я попытался настроить, используя чистые ссылки, - однако я заметил, что мои ссылки, похоже, становятся действительно очень длинными, и задаюсь вопросом, есть ли на данный момент способ включить структуру, в которой я мог бы использовать ссылки меньшего размера.
Вот пример, на моем веб-сайте есть контроллер каталога, у которого есть действие person, которое принимает параметр id - таким образом, ссылка для просмотра пользователя с идентификатором сертификата выглядит следующим образом:
www.mywebsite.com/directory/person/id/1809
Кажется, все в порядке, но сейчас я работаю над тем, чтобы сделать ссылки более читаемыми и удобными для поисковой системы - я хотел бы иметь что-то вроде - предполагая, что идентификатор пользователя 1809 называется John Smith:
www.mywebsite.com/directory/person/John-Smith-1809
Что-то действительно базовое, подобное следующему, было бы еще лучше:
www.mywebsite.com/John-Smith-1809
Хотя я не знаю, как я мог бы справиться с этим, не упоминая контроллер или действие...любые идеи, ребята, действительно помогли бы...
Решение
Взгляните на Руководство ZF по использованию маршрутов.
В принципе, вам нужно что-то подобное, чтобы это заработало:
$route = new Zend_Controller_Router_Route_Regex(
'(.+)-(\d+)',
array(
'controller' => 'directory',
'action' => 'person'
),
array(
1 => 'name',
2 => 'id'
),
'%s-%d'
);
$router->addRoute('directoryPerson', $route);
Примечание:не ожидайте, что это выйдет из коробки.Скорее всего, вам придется его изменить.Однако это должно направить вас в правильном направлении.
Другие советы
Как и в предыдущем ответе, вы могли бы использовать маршрут регулярных выражений, но для начала, вероятно, было бы проще использовать "обычный" маршрут, который выглядит как:
http://yoursite.com/1234/John-Smith/
В вашем bootstrap вы бы сделали:
$frontController = Zend_Controller_Front::getInstance();
$router = $frontController->getRouter();
$router->addRoute('user', new Zend_Controller_Router_Route(
':user-id/:user-name/',
array(
'module' => 'user',
'controller' => 'user',
'action' => 'read'
)
));
Это добавляет маршрут с именем "user" к маршрутизатору, который имеет вид /user-id/user-name, so /1234/John-Smith/.Он будет искать usercontroller в пользовательском модуле и перейдет к действию чтения.Конечно, вы можете изменить это на другой модуль / контроллер / действие, если пожелаете.
Тогда у вас был бы этот User_UserController в пользовательском модуле, у которого есть readAction();В этом действии вы могли бы получить идентификатор с помощью:
$userId = $this->_getParam('user-id');
Аналогично, если вам это понадобится, вы могли бы восстановить имя.
$userName = $this->_getParam('user-name');
В скрипте просмотра вы могли бы сгенерировать URL-адрес для этого маршрута с помощью:
<?php echo $this->url(array('user-id' => 1234, 'user-name' => 'John Smith'), 'user', true); ?>
Обратите внимание на параметр 'user', который указывает маршрутизатору использовать "пользовательский" маршрут, который мы определили ранее.
Вы можете использовать модуль apache mod_rewrite для перезаписи вашего URL-адреса
http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond ###blah blah blah###
RewriteRule ###blah blah blah###
</IfModule>