Последние два дня я сражался с Zend Framework Router и до сих пор не нашел решения.Zend Framework Router Hostname и поддержка нескольких языков
Существующий проект имеет 2 разных модуля, которые работают с одним и тем же доменом, например. www.domain1.com:
- по умолчанию - Содержит публичную информацию, можно получить доступ через www.domain1.com
- админ - интерфейс администратора, можно получить доступ через WWW. domain1.com/admin
Проект является многоязычным и содержит код языка, который передается в качестве первого параметра каждого URL-адреса, например. www.domain1.com/en/www.domain1.com/en/admin
Часть кода, который берет на себя рядом плагин:
class Foo_Plugin_Language extends Zend_Controller_Plugin_Abstract
{
const LANGUAGE_KEY = 'lang';
public function routeStartup(Zend_Controller_Request_Abstract $request)
{
$languagesRegexp = implode('|', array_map('preg_quote', $this->_bootstrap->getLanguages()));
$routeLang = new Zend_Controller_Router_Route(
':' . self::LANGUAGE_KEY,
array(self::LANGUAGE_KEY => $this->_bootstrap->getLanguage()->toString()),
array(self::LANGUAGE_KEY => $languagesRegexp)
);
$router = $this->getFrontController()->getRouter();
$router->addDefaultRoutes();
$chainSeparator = '/';
foreach ($router->getRoutes() as $name => $route) {
$chain = new Zend_Controller_Router_Route_Chain();
$chain
->chain($routeLang, $chainSeparator)
->chain($route, $chainSeparator);
$new_name = $this->_formatLanguageRoute($name);
$router->addRoute($new_name, $chain);
}
protected function _formatLanguageRoute($name)
{
$suffix = '_' . self::LANGUAGE_KEY;
if (substr($name, -strlen($suffix)) == $suffix) return $name;
return $name . '_' . self::LANGUAGE_KEY;
}
public function routeShutdown(Zend_Controller_Request_Abstract $request)
{
$lang = $request->getParam(self::LANGUAGE_KEY, null);
$this->_bootstrap->setLanguage($lang);
$actual_lang = $this->_bootstrap->getLanguage()->toString();
$router = $this->getFrontController()->getRouter();
$router->setGlobalParam(self::LANGUAGE_KEY, $lang);
// Do not redirect image resize requests OR get js, css files
if (preg_match('/.*\.(jpg|jpeg|gif|png|bmp|js|css)$/i', $request->getPathInfo())) {
return true;
}
// redirect to appropriate language
if ($lang != $actual_lang) {
$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
$params = array(self::LANGUAGE_KEY => $actual_lang);
$route = $this->_formatLanguageRoute($router->getCurrentRouteName());
return $redirector->gotoRouteAndExit($params, $route, false);
}
}
}
Одним из первых вопрос, что делать вы думаете о таком способе предоставления поддержки multi-lang. Я заметил, что все эти цепочки значительно уменьшают скорость работы сервера, время отклика с сервера составляет около 4 секунд ...
Главный вопрос: В настоящее время я должен реализовать такую функцию: у меня есть домен www.domain2.com, который должен работать только с одним модулем, например «foobar» ... и он должен быть доступен через второй URL ... или, конечно же, он должен работать как www.domain1.com/en/foobar по умолчанию ...
Чтобы обеспечить эту функциональность в классе Bootstrap I'be реализована такая часть кода
// Instantiate default module route
$routeDefault = new Zend_Controller_Router_Route_Module(
array(),
$front->getDispatcher(),
$front->getRequest()
);
$foobarHostname = new Zend_Controller_Router_Route_Hostname(
'www.domain2.com',
array(
'module' => 'foobar'
)
);
$router->addRoute("foobarHostname", $foobarHostname->chain($routeDefault));
И это не работает, и как я нашел routeDefault всегда перепишем найти правильное название модели «Foobar» со значением " по умолчанию»
Затем я реализовал маршрутизатор по умолчанию, как это:
new Zend_Controller_Router_Route(
':controller/:action/*',
array(
'controller' => 'index',
'action' => 'index'
);
);
Но что до сих пор не работает, и начал работать без языка только WHe п я комментирую метод «routeStartup» в Foo_Plugin_Language НО мне нужна поддержка языка, я много играл со всеми возможными комбинациями кода и в конце концов сделал это, чтобы обеспечить поддержку языка по умолчанию:
class Project_Controller_Router_Route extends Zend_Controller_Router_Route_Module
{ /** * @param строка $ путь * @param BOOL $ парциальный * @return массив */ публичной функции матч ($ путь, $ частичный = ложь) { $ результата = массив();
$languageRegexp = '%^\/([a-z]{2})(/.*)%i';
if (preg_match($languageRegexp, $path, $matches)) {
$result['lang'] = $matches[1];
$path = $matches[2];
}
$parentMatch = parent::match($path);
if (is_array($parentMatch)) {
$result = array_merge($result, $parentMatch);
}
return $result;
}
}
Так язык параметр был тщательно извлекается из пути и регулярной переработанного левой части, как обычно ...
Но когда я сделал следующий код, который я не был в состоянии получить доступ к Foobar модуль через www.domain2.com URL, из имени модуля в запросе всегда был «по умолчанию»
$front = Zend_Controller_Front::getInstance();
/** @var Zend_Controller_Router_Rewrite $router */
$router = $front->getRouter();
$dispatcher = $front->getDispatcher();
$request = $front->getRequest();
$routerDefault = new Project_Controller_Router_Route(array(), $dispatcher, $request);
$router->removeDefaultRoutes();
$router->addRoute('default', $routerDefault);
$foobarHostname = new Zend_Controller_Router_Route_Hostname(
'www.domain2.com',
array(
'module' => 'foobar'
)
);
$router->addRoute("foobar", $foobarHostname->chain($routerDefault));
Вместо резюме:
- Проблема в том, что я должен реализовать функцию, обеспечивающую доступ для вторичного домена к определенному модулю ZendFramework, и я должен сохранить поддержку нескольких языков. И я не могу найти способ, как управлять всем этим ...
- Вторичный вопрос о выполнении цепи маршрутизатора, он делает работу сайта очень-очень медленно ...
Адресация ваших точек: 1. если вы настроите свой vhost на маршрут до проекта, zend сможет управлять маршрутизацией в модуле http://framework.zend.com/manual/1.12/en/zend.controller. router.html # zend.controller.router.routes.hostname, 2. Вы можете кэшировать маршрутизатор для производительности, memcache будет самым быстрым –