Zend Framework - Получение объекта запроса в начальной загрузке - PullRequest
2 голосов
/ 21 января 2012

Я разрабатываю сайт со следующей формой URL:
example.com/controller/action/locale
В котором я получаю локаль из параметра uri locale.

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

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

Я прав или что-то упустил?

Ответы [ 2 ]

2 голосов
/ 21 января 2012

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

Некоторые вещи, которые должен делать загрузчик:

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

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

- Правка -

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

// 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'
                ));
        }
    }
}
1 голос
/ 21 января 2012

Мне нужно написать собственный плагин.

Я бы начал с просмотра этой ссылки, чтобы ознакомиться с плагинами: 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

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

<?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;
    }
}?>
...