我正在将Zend Framework集成到现有的应用程序中。我想将应用程序切换到Zend的自动加载机制,以替换几十个include()
语句。
但我对自动加载机制有特定要求。请允许我详细说明。
现有应用程序使用核心库(独立于ZF),例如:
/Core/Library/authentication.php
/Core/Library/translation.php
/Core/Library/messages.php
这个核心库始终保持不变,并提供多种应用程序。该库包含类似
的类class ancestor_authentication { ... }
class ancestor_translation { ... }
class ancestor_messages { ... }
在应用程序中,还有一个Library目录:
/App/Library/authentication.php
/App/Library/translation.php
/App/Library/messages.php
这些包括扩展祖先类,并且是实际在应用程序中实例化的类。
class authentication extends ancestor_authentication { }
class translation extends ancestor_translation { }
class messages extends ancestor_messages { }
通常,这些类定义是空的。他们只是扩展他们的祖先并提供类名来实例化。
$authentication = new authentication();
此解决方案的目的是能够轻松自定义应用程序的各个方面,而无需修补核心库。
现在,我需要的自动加载器必须知道这个结构。当请求类authentication
的对象时,自动装带器必须:
1. load /Core/Library/authentication.php
2. load /App/Library/authentication.php
我目前的方法是创建一个自定义函数,并将Zend_Loader_Autoloader
绑定到特定的名称空间前缀。
有没有办法在Zend中做到这一点,我忽略了? this question中接受的答案暗示存在,但这可能只是一个错误的措辞选择。
Zend Autoloader是否有扩展功能?
你能否 - 我是ZF的新手 - 想一个优雅的方式,符合框架的精神,用这个功能扩展Autoloader?我没有必要寻找一个现成的实现,一些指针(这应该是xyz
方法的扩展,你可以像这样调用...)已经足够了。
答案 0 :(得分:1)
默认情况下,自动加载器配置为匹配“Zend_”和“ZendX_”命名空间。如果您有自己的库代码使用自己的命名空间,则可以使用registerNamespace()方法将其注册到自动装载器。
$autoloader->registerNamespace('My_');
请注意,自动加载器遵循ZF命名约定,因此Zend_Foo_Bar
会查看Zend/Foo/Bar.php
。
然而,
您还可以注册任意自动加载器回调,可选择使用特定命名空间(或命名空间组)。 Zend_Loader_Autoloader将在使用其内部自动加载机制之前尝试匹配这些。
$autoloader->pushAutoloader(array('ezcBase', 'autoload'), 'ezc');
另一种方式是create custom class Loader extending Zend_Loader,然后将其注册为:
Zend_Loader::registerAutoload('My_Loader');
ZF将使用此自动加载器而不是默认加载器。
答案 1 :(得分:1)
为了扩展Gordon已经指出的内容,我将创建自己的自动加载器类,实现Zend_Loader_Autoloader_Interface
并将其推送到Zend_Loader_Autoloader
- 堆栈。
class My_Autoloader implements Zend_Loader_Autoloader_Interface
{
public function autoload($class)
{
// add your logic to find the required classes in here
}
}
$autoloader = Zend_Loader_Autoloader::getInstance();
// pushAutoloader() or unshiftAutoloader() depending on where
// you'd like to put your autoloader on the stack
// note that we leave the $namespace parameter empty
// as your classes don't share a common namespace
$autoloader->pushAutoloader(new My_Autoloader(), '');
我不会采用Zend_Loader
方法,即使尚未弃用,新Zend_Loader_Autoloader
目前似乎是最佳做法。