我正在设计一个具有以下网址形式的网站:
example.com/controller/action/locale
其中我从 uri 参数区域设置获取区域设置。
在 Bootstrap 中,当我想要初始化我的资源(例如 Zend_Locale、Zend_Translator 或配置 Zend_Validate_Date 之类的组件的其他资源)时,它们都需要区域设置数据。 此外,我可能想根据收到的区域设置使用不同的数据库。 但由于 Bootstrap 中通常没有可用的 uri 参数,因此我需要在 Controller 插件中初始化上述所有内容,这对我来说似乎毫无意义。
总之,我认为请求对象和 uri 参数应该在 bootstrap 中可用。所以Zend Framework目前的设计缺少了这一点。
我是对的还是遗漏了什么?
最佳答案
抱歉,但您的建议是个坏主意。引导的目的是通过初始化所需的设置、变量等使库进入工作状态。
Bootstrap 应该做的一些事情:
- 将自定义路径添加到“include_path”
- 初始化字符集 (UTF-8) 和编码指令 (mb_internal_encoding)
- 初始化记录器(错误或应用日志记录)
- 初始化自动加载器
您的应用程序应该在 Controller 层处理您的需求。例如,如果用户访问 example.com/controller/action/en-US,您的 Controller 可以通过访问请求对象(和指定参数)来设置相应的语言,并设置用户 session 变量以英语显示当前和后续页面.
-- 编辑--
使用中间类初始化 i18n/区域设置与将值传递给 Bootstrap 的示例实现:
// 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'
));
}
}
}
关于zend-framework - Zend Framework - 在 Bootstrap 中获取请求对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8948274/