Zend Framework - 在bootstrap中获取请求对象

时间:2012-01-20 21:47:39

标签: zend-framework zend-controller-plugin zend-app-bootstrap

我正在设计一个具有以下网址格式的网站:
example.com/controller/action/locale
我在其中从uri参数locale获取语言环境。

在我想要初始化我的资源(如Zend_Locale,Zend_Translator或其他一些配置Zend_Validate_Date的资源,如组件)的引导程序中,它们都需要语言环境数据。 此外,我本可以根据收到的语言环境使用不同的数据库。 但由于bootstrap中通常没有uri参数,我需要在控制器插件中初始化以上所有内容,这对我来说似乎毫无意义。

总之,我认为请求对象和uri参数应该在bootstrap中可用。因此,Zend Framework的当前设计缺少这一点。

我是对的还是遗失了什么?

2 个答案:

答案 0 :(得分:2)

很抱歉,但你的建议是个坏主意。 Bootstrapping旨在通过初始化所需的设置,变量等使库进入工作状态。

bootstrappers应该做的一些事情:

  • 将自定义路径添加到“include_path”
  • 初始化字符集(UTF-8)和编码指令(mb_internal_encoding)
  • 初始化记录器(错误或应用程序记录)
  • 初始化自动加载器

您的应用程序应该在控制器层处理您的要求。例如,如果用户访问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;
    }
}?>