2010-08-04 108 views
1

我有一个使用Zend Framework和Zend_Translate的项目。Zend Framework存储修改类的方法?

我不得不稍微改变标准CSV适配器到Zend_Translate。现在我遇到了将这个改变的适配器放在哪里的问题。

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

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

这是我已经把新的适配器为好。然而,我不想用我的自定义扩展来“污染”Zend库:我想保持能够更新ZF而不必担心丢失文件;我想继续使用集中安装的ZF版本;而自定义适配器是我正在开发的项目的一部分,真的。

是否有Zend Framework的方式来处理这个问题,或指定一个替代的加载位置?

语言适配器使用

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

(其中$adapterZend_Translate_Adapter_Adaptername

因此,标准的自动加载规则加载。有没有一种简单的方法可以告诉Zend Autoloader查看第二个位置?

回答

5

您可以将它添加到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

我的回答完全一样,你的措辞更好:) +1 – 2010-08-04 18:26:36

+0

干杯@戈登,但这意味着我必须重写'Zend_Translate'本身,对吧?因为它从'Zend_Translate_Adapter'构造了类名......根据你传递的'$ adapter'参数,不可能顶层将它改为'My_Translate_Adapter _...'。我所要做的就是让Zend在两个目录结构中查找* same *命名空间 - 这可能是不可能的。我会看看Zend_Loader,看看我能找到什么。 – 2010-08-04 18:48:18

+0

@Pekka不,这不应该是必要的。请参阅http://framework.zend.com/manual/en/zend.translate.adapter.html#zend.translate.adapter。自我写作 – Gordon 2010-08-04 19:16:00

1

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

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

在Zend命名空间中的部件首先检查的情况下,你已经通过在一个简短的名字(如'gettext')中,但会尝试直接加载适配器名称作为类。

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

+0

我忽略了这个事实 - 它现在起作用了。谢谢! – 2010-08-04 19:18:39