【问题标题】:The Zend Framework way of storing modified classes?Zend Framework 存储修改类的方式?
【发布时间】:2010-08-05 03:13:25
【问题描述】:

我有一个使用 Zend Framework 和 Zend_Translate 的项目。

我不得不将标准 CSV 适配器稍微更改为 Zend_Translate。现在我面临的问题是把这个改变的适配器放在哪里。

默认情况下,适配器存储在

/Library/Zend/Translate/Adapter/Adaptername.php

这也是我放置新适配器的地方。

但是,我不想用我的自定义扩展“污染”Zend 库:我希望能够更新 ZF 而不必担心丢失文件;我想继续使用 ZF 的集中安装版本;并且自定义适配器是我正在处理的项目的一部分,真的。

是否有 Zend Framework 处理此问题的方法,或指定替代加载位置?

语言适配器加载使用

$this->_adapter = new $adapter($data, $locale, $options); 

(其中$adapter 将是Zend_Translate_Adapter_Adaptername

所以标准的自动加载规则适用。有没有一种简单的方法可以告诉 Zend Autoloader 在第二个位置查找?

【问题讨论】:

    标签: php zend-framework zend-translate


    【解决方案1】:

    你可以将它添加到lib文件夹中

    /lib
     /Zend
      /Translate
       /Adapter
        /Csv.php
     /My
      /Translate
       /Adapter
        /Csv.php
    

    取决于您的自动加载器的设置方式,you have to setup the "namespace" with it:

    $autoloader->registerNamespace('My_');
    

    或者,如果您不喜欢这个,请将其放入您的模型文件夹中。基本上,你把它放在哪里都没有关系,只要它可以被自动加载器以某种方式访问。 Zend_Autoloader 可以注册任意自动加载器回调,所以这完全取决于你。

    【讨论】:

    • 我的答案几乎完全一样,你的措辞更好:) +1
    • 干杯@Gordon,但这意味着我也必须自己重写Zend_Translate,对吧?因为它根据您传递的$adapter 参数从Zend_Translate_Adapter... 构造类名,所以不可能将其改为My_Translate_Adapter_...。我要做的是让 Zend 在两个目录结构中查找 same 命名空间——这很可能是不可能的。我会研究一下 Zend_Loader,看看我能找到什么。
    • @Pekka 不,那不应该是必要的。见framework.zend.com/manual/en/…
    • 干杯,我忽略了这一点(甚至查看源代码以查看它是否确实如此。)它现在可以与自定义类一起使用。谢谢!!
    【解决方案2】:

    由于本网站的规定,我无法评论 Gordon 的回答,但他说得对。要回答有关如何加载适配器的问题,您需要将完整的类名传递给翻译对象的构造函数:

    $translate = new Zend_Translate('My_Translate_Adapter_Class', ...);

    组件首先检查 Zend 命名空间以防您传入短名称(如“gettext”),但随后会尝试将适配器名称作为类直接加载。

    至少,在 1.10 中是这样,我想已经有一段时间了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2013-01-23
      相关资源
      最近更新 更多