2

Я проектирование сайта с следующей форме URL:
example.com/controller/action/locale
В котором я локаль от Uri параметров языка.Zend Framework - Получение объекта запроса в загрузчике

В начальной загрузке, когда я хочу инициализировать мои ресурсы, такие как Zend_Locale, Zend_Translator или какой-либо другой ресурс, который настраивает Zend_Validate_Date как компоненты, все они нуждаются в данных локали. И, кроме того, я мог бы использовать разные базы данных в соответствии с полученным языковым стандартом. Но, поскольку параметры uri обычно доступны в bootstrap, мне нужно инициализировать все выше в плагинах контроллера, что кажется мне бессмысленным.

В заключение я думаю, что объект запроса и так параметры uri должны быть доступны в бутстрапе. Таким образом, в текущем дизайне Zend Framework отсутствует этот момент.

Я прав или чего-то не хватает?

ответ

2

Извините, но то, что вы предлагаете, это плохая идея. Бутстрапирование предназначен, чтобы получить библиотеку в рабочее состояние путем инициализации необходимые параметры, переменные и т.д.

Некоторые вещи bootstrappers должны сделать:

  • Добавление пользовательских путей к «include_path»
  • Инициализировать наборы символов (UTF-8) и кодирование директива (mb_internal_encoding)
  • инициализировать регистратор (ошибка или приложение каротаж)
  • инициализировать автопогрузчики

Ваше приложение должно отвечать вашим требованиям на уровне контроллера. Например, если пользователь посещает example.com/controller/action/en-US, ваш контроллер может соответствующим образом установить язык, обратившись к объекту запроса (и указанному параметру) и установить сеанс пользователя var для отображения текущей и последующих страниц на английском языке ,

- Edit -

Пример реализации для инициализации параметров i18n/локали с помощью посредника класса против проходных значений для начальной загрузки:

// Controller 

$i18n = new i18n(); 

$i18n->setLocale($this->getRequest()->getParameter('locale')); 

// Now I can make locale specific calls to validate localized data 
$i18n->validateDate($this->getRequest()->getParameter('date')); 

// Can also make queries for locale specific data 
$results = $i18n->getDob()->query('select * from my_table'); 

// i18n class 
class i18n 
{ 
    protected $locale; 

    public function setLocale($locale) 
    { 
     $this->locale = $locale; 
    } 

    public function getLocale() 
    { 
     return $this->locale; 
    } 

    // Factory method for creating a database object based on locale 
    public function getDbo() 
    { 
     switch ($this->getLocale()) { 

      case 'en-US': 
       return new Zend_Db::factory('Pdo_Mysql', array(
        'host' => 'hostname', 
        'username' => 'username', 
        'password' => 'password', 
        'dbname' => 'en_us_locale' 
       )); 

      case 'en-GB': 
       return new Zend_Db::factory('Pdo_Mysql', array(
        'host' => 'hostname', 
        'username' => 'username', 
        'password' => 'password', 
        'dbname' => 'en_gb_locale' 
       )); 
     } 
    } 
} 
+0

ОК, но что, если некоторые конфигурации моих ресурсов, например, включают в себя пути, базу данных и т. Д.изменяется в соответствии с параметром locale. Чем я не могу инициализировать их в бутстрапе. Должен ли я инициализировать их все в плагине контроллера? Я не думаю, что это хорошая идея? –

+0

Вы можете создать класс bootstrap более высокого уровня. Передайте ему объект запроса, затем инициализируйте ваши include_paths и соединения с базой данных на основе текущего значения. Конечная игра здесь заключается в том, чтобы не передавать данные уровня запроса в базовый бутстрап, поскольку он должен быть как можно глубже и только инициализировать библиотеку для использования. –

+0

Да, возможно, это может быть хорошим решением. Создание плагина контроллера в качестве начальной загрузки и изменение или инициализация некоторых исходных ресурсов. –

1

Что вам нужно сделать, это написать собственный плагин, который я думать.

Я хотел бы начать с глядя на эту ссылку, чтобы ознакомиться с плагинами: http://framework.zend.com/manual/en/zend.controller.plugins.html

Тогда загляните на это (это, кажется, часть того, что вы хотите): http://framework.zend.com/manual/en/zend.application.available-resources.html#zend.application.available-resources.locale

и, наконец, если вы создаете свой собственный плагин, ключ использует переменную

$request->getParam();
в (возможно, за то, что вы делаете) функция preDispatch

Ниже представлен маленький парень, который переключает мой файл макета на основе модуля запроса est - надеюсь, это дает вам некоторое представление.

<?php 
    /* 
* Theme Switcher 
* Set the current module name as $this->skin in the layout 
* 
* 
*/ 
class My_Controller_Plugin_Themer extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     $module_name = $request->getModuleName(); 
     $view  = Zend_Layout::getMvcInstance()->getView(); 
     $view->skin  = $module_name; 
    } 
}?> 
+0

В настоящее время я использую какой-то плагин, подобный этому, для локали, который делает параметры конфигурации набора ресурсов локали в бутстрапе, но фактически инициализируется в плагине контроллера. Но тогда мне нужно перепроектировать каждый ресурс, используя данные локали, до ленивой нагрузки, пока им не понадобятся данные локали. Поэтому я расширил Zend_Locale, Zend_Translator до фактической инициализации ленивой загрузки, что, по моему мнению, является причиной плохого дизайна Zend Framework –

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