我正在设计一个具有以下网址格式的网站:
example.com/controller/action/locale
我在其中从uri参数locale获取语言环境。
在我想要初始化我的资源(如Zend_Locale,Zend_Translator或其他一些配置Zend_Validate_Date的资源,如组件)的引导程序中,它们都需要语言环境数据。 此外,我本可以根据收到的语言环境使用不同的数据库。 但由于bootstrap中通常没有uri参数,我需要在控制器插件中初始化以上所有内容,这对我来说似乎毫无意义。
总之,我认为请求对象和uri参数应该在bootstrap中可用。因此,Zend Framework的当前设计缺少这一点。
我是对的还是遗失了什么?
答案 0 :(得分:2)
很抱歉,但你的建议是个坏主意。 Bootstrapping旨在通过初始化所需的设置,变量等使库进入工作状态。
bootstrappers应该做的一些事情:
您的应用程序应该在控制器层处理您的要求。例如,如果用户访问example.com/controller/action/en-US,您的控制器可以通过访问请求对象(和指定的参数)来相应地设置语言,并设置用户会话var以显示当前页面和后续页面的英语
- 编辑 -
使用中间类初始化i18n / locale设置与将值传递给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'
));
}
}
}
答案 1 :(得分: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函数
以下是根据请求模块切换我的布局文件的小家伙 - 希望它能为您提供一些见解。
<?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;
}
}?>