tak*_*hin 6 php zend-framework global-variables
你觉得Zend_Registry有用吗?
它应该用于哪些任务?不是吗?
变量的全局状态不是一个好习惯.主要对象可以通过注入全局状态$front->setParam('paramName', $object),那么Zend_Registry的目的是什么?
Gor*_*don 10
当您想要查找对象时,通常从另一个与其关联的对象开始,并使用该关联导航到该对象.因此,如果要查找客户的所有订单,请从客户对象开始,并使用方法获取订单.但是,在某些情况下,您将无法使用适当的对象.您可能知道客户的ID号但没有参考.在这种情况下,你需要某种查找方法 - 查找程序 - 但问题仍然存在:你如何找到查找程序?
我使用注册表(当我使用它时)的主要原因是因为它创建了一个易于访问的应用程序范围.使用注册表,我不必在全球范围内丢弃对象; 只有注册表本身是全球性的.从任何地方查找我扔进注册表的任何内容都很方便,包括模型:
然而,就像Singletons一样,Registry经常不受欢迎.以下是Brandon Savage的一篇文章,其中考虑了为何不使用注册表.反对登记处的主要论点是
那些投票反对注册管理机构的人通常主张使用依赖注入,尽管应该注意的是,一旦你获得了它的实例,你也可以注入注册表.但是,您没有Inversion of Control,因为using对象将从Registry中提取它所需的内容.使用注册表作为服务定位器是一种有效的方法.
请参阅Martin Fowler关于ServiceLocator与依赖注入的文章.
就像你的问题评论中指出的那样,Zend_Registry不是严格的单身人士.除了使用您使用的全局实例外,您还可以根据需要实例化多个实例Zend_Registry::getInstance().所以对象可以拥有自己的注册表.但是当以这种方式使用Registry时,它基本上只是一个美化的ArrayObject.
最后注意事项:就像所有设计模式一样,如果适用于您的问题,请使用它.
Pas*_*TIN 10
使用时$front->setParam,您正在Front Controller中定义参数.
但是该参数在应用程序的其他层(例如Model )中不可用(或不应该使用).
Zend_Registry与任何其他全局变量一样,可以从应用程序的任何位置获得 - 包括在模型内部.
但是使用注册表而不是一堆全局变量可以确保你不会在任何地方都有很多全局变量:即使使用注册表意味着一些全局状态(这应该说不是那么好),最好将其全部放入一个地方.
一些现实生活中的例子可能是:
最后,我觉得Zend_Registry有用吗?
那么,当谈到拥有一些全球状态时,是的,它是有用的.
但如果它的使用可以避免,它可能会更好:从概念上讲,不要让你的类依赖于任何全局状态更好:更容易重用,更容易测试,...
关于这一点,你可能想要一个看看Dependency Injection是什么.
我同意Pascal MARTIN的观点。我刚刚开始习惯于依赖注入。但是我还没有找到在控制器中注入对象的方法,所以我最近做的是使用de Registry访问控制器中的服务。在当前项目中,我正在执行以下操作:
引导程序:
// simple DI without an IoC container, and what have you
$dbAdapter = Zend_Db::factory( /* bla bla */ );
$mediaService = new Service_Media( new Repository_Media_Db( $dbAdapter ) );
$registry = Zend_Registry::getInstance();
$registry->mediaService = $mediaService;
Run Code Online (Sandbox Code Playgroud)
...然后在控制器中:
public function init()
{
$this->_mediaService = Zend_Registry::get( 'mediaService' );
}
public function listAction()
{
// simplified
$this->view->media = $this->_mediaService->listAllUploadedVideos();
}
Run Code Online (Sandbox Code Playgroud)
希望这对您有用。
| 归档时间: |
|
| 查看次数: |
10240 次 |
| 最近记录: |