Zend Framework - Получение объекта запроса в начальной загрузке
Я разрабатываю сайт со следующей формой URL:
example.com/controller/action/locale
В котором я получаю локаль из URI параметра locale.
При начальной загрузке, когда я хочу инициализировать свои ресурсы, такие как Zend_Locale, Zend_Translator или какой-либо другой ресурс, который настраивает компоненты, подобные Zend_Validate_Date, все они нуждаются в данных локали. Более того, я мог захотеть использовать разные базы данных в зависимости от полученной локали. Но поскольку в загрузчике обычно нет параметров uri, мне нужно инициализировать все вышеперечисленное в плагинах контроллера, что мне кажется бессмысленным.
В заключение я думаю, что объект запроса и параметры URI должны были быть доступны в начальной загрузке. Так что в текущем дизайне Zend Framework этот момент отсутствует.
Я прав или что-то упустил?
2 ответа
Извините, но то, что вы предлагаете, является плохой идеей. Начальная загрузка предназначена для перевода библиотеки в рабочее состояние путем инициализации необходимых настроек, переменных и т. Д.
Некоторые вещи, которые должен сделать загрузчик:
- Добавить пользовательские пути к "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'
));
}
}
}
Я думаю, вам нужно написать собственный плагин.
Я бы начал с просмотра этой ссылки, чтобы ознакомиться с плагинами: http://framework.zend.com/manual/en/zend.controller.plugins.html
Затем взгляните на это (кажется, это часть того, что вы хотите): http://framework.zend.com/manual/en/zend.application.available-resources.html действия
и, наконец, если вы создаете свой собственный плагин, ключ в использовании
$ 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;
}
}?>