2013-06-17 5 views
1

Последние два дня я сражался с 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, и я должен сохранить поддержку нескольких языков. И я не могу найти способ, как управлять всем этим ...
  • Вторичный вопрос о выполнении цепи маршрутизатора, он делает работу сайта очень-очень медленно ...
+0

Адресация ваших точек: 1. если вы настроите свой vhost на маршрут до проекта, zend сможет управлять маршрутизацией в модуле http://framework.zend.com/manual/1.12/en/zend.controller. router.html # zend.controller.router.routes.hostname, 2. Вы можете кэшировать маршрутизатор для производительности, memcache будет самым быстрым –

ответ

0

Путь я решил проблема с многоязычной страницей в этой теме: Working with multilanguage routers in Zend (последнее сообщение).

Конечно, моему разрешению нужно некоторое кэширование, но я думаю, что оно решит вашу проблему.

Cheers.

+0

Спасибо за ваш совет, у меня уже есть почти такая же система для переводов. Проблема в том, что когда я добавляю ** Route Hostname ** в загрузочный файл приложения, он не работает, и я не уверен, почему это происходит, он просто игнорирует этот маршрут ... Можете ли вы попробовать применить Hostname router в области ваш проект и проверить, работает ли он? – garbalinskiy

 Смежные вопросы

  • Нет связанных вопросов^_^