Работа с мультиязычными роутерами в Zend - PullRequest
3 голосов
/ 11 июня 2011

Я разрабатываю мультиязычное приложение Zend с двумя модулями (admin и public), я хочу передать код языка в URL, чтобы в моем загрузчике у меня было:

защищенная функция _initAutoload () {

    $this->bootstrap('frontController');
    $this->_front = $this->getResource('frontController');

    $autoLoader = new Zend_Loader_Autoloader_Resource(array(
                'basePath' => APPLICATION_PATH,
                'namespace' => '',
                'resourceTypes' => array(
                    'form' => array(
                        'path' => 'admin/forms/',
                        'namespace' => 'Admin_Form_',
                    ),
                    'model' => array(
                        'path' => 'models/',
                        'namespace' => 'Model_'
                    )
                )
            ));

    $autoLoader_ = new Zend_Application_Module_Autoloader(array(
                'basePath' => APPLICATION_PATH . '/public/',
                'namespace' => 'Public_',
                'resourceTypes' => array(
                    'forms' => array(
                        'path' => 'forms/',
                        'namespace' => 'Public_Form_'
                    )
                )
            ));

    return $autoLoader;
}

protected function _initConfig() {
    $config = new Zend_Config_Xml(BASE_PATH . '/config.xml', APPLICATION_ENV);
    $registry = Zend_Registry::getInstance();
    $registry->set('config', $config);
    return $config;
}

protected function _initDb() {
    $this->bootstrap('config');
    $config = $this->getResource('config');
    $db = Zend_Db::factory($config->database->adapter, $config->database);
    $db->setFetchMode(Zend_Db::FETCH_OBJ);
    $db->query("SET NAMES 'utf8';");
    $db->query("SET CHARACTER SET 'utf8';");
    Zend_Db_Table::setDefaultAdapter($db);
    return $db;
}

protected function _initRoutes() {
    $router = $this->_front->getRouter();
    $router->removeDefaultRoutes();

    $language = new Zend_Controller_Router_Route(':language', array('language' => 'es'));

    $module = new Zend_Controller_Router_Route_Module(
                    array(
                        'module' => 'public',
                        'controller' => 'index',
                        'action' => 'index'
                    ),
                    $this->_front->getDispatcher(),
                    $this->_front->getRequest()
    );

    $module->isAbstract(true);

    $default = new Zend_Controller_Router_Route_Chain();
    $default->chain($language);
    $default->chain($module);

    $router->addRoute('default', $default);

}

Дело в том, что я хочу, чтобы это работало, даже если я не указал язык.как мне это сделать?как извлечь код языка (en) для его использования в _initLocale?

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 23 декабря 2012

Вот мой начальный загрузчик init для маршрутизации.Он содержит все решения для работы с мультиязычными маршрутами и наличием модулей и работы с url halper:

public function _initRoutes() {
    $this->bootstrap('FrontController');
    $this->_frontController = $this->getResource('FrontController');
    $router = $this->_frontController->getRouter();

    if (isset($_GET['lang'])) {
        $lang = $_GET['lang'];
    } else {
        // auto recognition of language
        $locale = new Zend_Locale();
        $lang = $locale->getLanguage();
    }

    $langRoute = new Zend_Controller_Router_Route(
                    ':lang/',
                    array(
                        'lang' => $lang
                    )
    );

    $defaultRoute = new Zend_Controller_Router_Route(
                    ':controller/:action/*',
                    array(
                        'module' => 'default',
                        'controller' => 'index',
                        'action' => 'index'
                    )
    );

    $defaultRoute = $langRoute->chain($defaultRoute);

    $adminRoute = new Zend_Controller_Router_Route(
                    'admin/:controller/:action/*',
                    array(
                        'module' => 'admin',
                        'controller' => 'index',
                        'action' => 'index'
                    )
    );

    $router->addRoute('langRoute', $langRoute);
    $router->addRoute('defaultRoute', $defaultRoute);
    $router->addRoute('adminRoute', $adminRoute);
}
0 голосов
/ 10 мая 2013

Это универсальный плагин, который позволяет нам создавать свои собственные маршруты, не помня о языке.Это также настройка Zend_Translator.Это базовый класс, для повышения скорости я предлагаю использовать Zend_Cache, потому что приведенный ниже код влияет на эффективность кода (я бы сказал, что это необходимо, если у вас +100 маршрутов).

<?php

class PsScripts_Controller_Plugin_Lang extends Zend_Controller_Plugin_Abstract {

    private function initTranslator($locale){
        $translate = new Zend_Translate(array('adapter' => 'tmx',
                    'content' => APPLICATION_PATH . '/configs/translations.tmx',
                    'locale' => $locale));
        Zend_Registry::set('Zend_Translate', $translate);
    }

    public function routeStartup(\Zend_Controller_Request_Abstract $request) {
        $locale = new Zend_Locale('pl_PL'); //default locale
        if (preg_match('/\/([a-z]{2})([\/].*)/', $request->getRequestUri(),$matches)){ //if locale is found in request
            $lang = $matches[1]; //obtain locale
            /* @var $locale Zend_Locale */
            switch ($lang){
                case 'en':
                    $locale->setLocale('en_GB');
                    break;
            }
            Zend_Registry::set('Zend_Locale',$locale);
            $this->initTranslator($locale);
            $router = Zend_Controller_Front::getInstance()->getRouter();
            /* @var $router Zend_Controller_Router_Rewrite */
            $langRoute = new Zend_Controller_Router_Route(
                ':lang', 
                array(
                    'lang' => $lang
                ),
                array(
                    'lang' => '[a-z]{0,2}'
                )
            );
            $routes = $router->getRoutes();
            foreach ($routes as $name=>$route){
                if ($name != 'default'){
                    /* @var $route Zend_Controller_Router_Route */
                    $router->removeRoute($name);
                    /* @var $lang Zend_Controller_Router_Route */
                    $chain = new Zend_Controller_Router_Route_Chain();
                    $chain->chain($langRoute)->chain($route);
                    $router->addRoute($name,$chain);
                }
            }
            $router->route($request);
        } else {
            $this->initTranslator($locale);
        }
        parent::routeStartup($request);
    }

}
0 голосов
/ 12 июня 2011

Вам нужно связать все маршруты от языкового маршрута. Смотрите здесь:

http://robertbasic.com/blog/chaining-routes-in-zend-framework/

Два модуля:

$defaultRoute = new Zend_Controller_Router_Route(  
        ':module/:controller/:action', 
...