Я пытаюсь реализовать перевод на основе URL-адресов в Zend Framework, чтобы мой сайт был оптимизирован для SEO. Это означает, что мне нужны URL-адреса, подобные приведенным ниже, в дополнение к маршрутам по умолчанию.
zend.local/en/module
zend.local/en/controller
zend.local/en/module/controller
zend.local/en/controller/action
Вышеупомянутые - это те, с которыми у меня сейчас проблемы; остальное должно быть в порядке. Я добавил плагин контроллера, который выбирает параметр lang
, чтобы я мог установить языковой стандарт и объект перевода в методе preDispatch
. Вот некоторые из моих маршрутов (хранятся в файле .ini):
; Language + module
; Language + controller
resources.router.routes.lang1.type = "Zend_Controller_Router_Route_Regex"
resources.router.routes.lang1.route = "(^[a-zA-Z]{2})/(\w+$)"
resources.router.routes.lang1.defaults.controller = index
resources.router.routes.lang1.defaults.action = index
resources.router.routes.lang1.map.1 = "lang"
resources.router.routes.lang1.map.2 = "module"
; Language + module + controller
; Language + controller + action
resources.router.routes.lang2.type = "Zend_Controller_Router_Route_Regex"
resources.router.routes.lang2.route = "(^[a-zA-Z]{2})/(\w+)/(\w+$)"
resources.router.routes.lang2.defaults.module = default
resources.router.routes.lang2.defaults.action = index
resources.router.routes.lang2.map.1 = "lang"
resources.router.routes.lang2.map.2 = "controller"
resources.router.routes.lang2.map.3 = "action"
Как указано в комментариях, несколько структур URL-адресов будут соответствовать одному и тому же маршруту, что заставляет мое приложение неправильно интерпретировать формат. Например, следующие два URL-адреса будут сопоставлены маршрутом lang1
:
zend.local/en/mymodule
zend.local/en/mycontroller
В первом URL-адресе "mymodule" используется как имя модуля, что является правильным. Однако во втором URL-адресе «mycontroller» используется как имя модуля, чего я не хочу. Здесь я хочу, чтобы он использовал модуль «по умолчанию» и «mycontroller» в качестве контроллера. То же самое относится к предыдущему маршруту lang2
. Поэтому я не знаю, как отличить URL-адрес от структуры /en/module
или /en/controller
.
Чтобы исправить это, я поэкспериментировал с приведенным ниже кодом в моем плагине контроллера.
// Get module names as array
$dirs = Zend_Controller_Front::getInstance()->getControllerDirectory();
$modules = array_keys($dirs);
// Module variable contains a module that does not exist
if (!in_array($request->getModuleName(), $modules)) {
// Try to use it as controller name instead
$request->setControllerName($request->getModuleName());
$request->setModuleName('default');
}
Это отлично работает в сценариях, которые я тестировал, но тогда мне пришлось бы сделать что-то подобное, чтобы заставить работать lang2
маршрут (который, возможно, включает сканирование каталогов для получения списка контроллеров). Это просто кажется плохим решением, поэтому, если это возможно, я хотел бы выполнить все это только с помощью маршрутов (или простого кода, который не является таким «хакерским»). Я мог бы также составлять маршруты каждый раз, когда хочу /en/controller
, например, но это компромисс, на который я бы не пошел. Итак, если кто-то знает, как решить эту проблему, или знает другой подход к достижению того же результата, я все слышу!
localhost/module/controller
= deafult-lang = en - person Keyne Viana   schedule 04.09.2012lang2
маршрута. В своем ответе я только что добавил часть lang в один маршрут и позволил маршрутам модуля по умолчанию выполнять свою работу. Сообщите мне, правильно ли я понял. - person Keyne Viana   schedule 04.09.2012