2

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

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

总之,我认为请求对象和 uri 参数应该在引导程序中可用。所以目前 Zend Framework 的设计缺少了这一点。

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

4

2 回答 2

2

对不起,但你的建议是个坏主意。引导旨在通过初始化所需的设置、变量等使库进入工作状态。

引导程序应该做的一些事情:

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

您的应用程序应该在控制器层处理您的需求。例如,如果用户访问 example.com/controller/action/en-US,您的控制器可以通过访问请求对象(和指定的参数)相应地设置语言,并设置用户会话 var 以显示当前和后续页面的英文.

- 编辑 -

使用中间类初始化 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'
                ));
        }
    }
}
于 2012-01-20T22:02:13.600 回答
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。语言环境

最后,如果您正在创建自己的插件,关键在于使用

$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;
    }
}?>
于 2012-01-20T22:15:00.443 回答