2012-11-14 298 views
2

我正在研究一个Zend Framework(1.11)应用程序,我将其移植到模块中,以便开发人员可以插入和播放各种对我们软件的添加并轻松删除。Zend框架模块库

我有(和似乎没有能够找到一个答案是)我有可靠的库代码,也就是我的结构是目前这个

- application 
    - (the standard ZF stuff) 
    - modules 
    - testModule 
     - Bootstrap.php 
     - controllers 
     - configs 
     - views 
- library 
    - CoreStuff 
     - Class.php 
     - SpecialClass.php 
    - testModuleLibrary 
     - Class.php 
     - SpecialClass.php 

而且我真正想要的问题这是为了让其他开发者更容易将模块安装到我们的系统中。

- application 
    - (the standard ZF stuff) 
    - modules 
     - testModule 
     - Bootstrap.php 
     - controllers 
     - configs 
     - views 
     - library 
      - Class.php 
      - SpecialClass.php 
- library 
    - CoreStuff 
     - Class.php 
     - SpecialClass.php 

我可以在模块Bootstrap中使用Autoloader吗?还是必须将其添加到我的包含路径?

[编辑]

这是我当前模块的引导,我又看到了这个代码的时间和时间与我的谷歌搜索危机四伏,但它似乎没有任何区别

<?php 

    class Notifications_Bootstrap extends Zend_Application_Module_Bootstrap { 

     protected function _initLibraryAutoloader() { 
      return $this->getResourceLoader()->addResourceType('library', 'library', 'library'); 
     } 

} 
+0

有点难说,因为ZF1没有模块的想法。我在使用的testModule中看到的Bootstrap.php如何? – Jojo

+0

目前它并没有做任何事情,因为所有Zend想要知道它在那里,但如果我可以让Zend知道我的模块中有另一个库,那将是一个非常理想的情况。 –

回答

1

我已使用以下代码解决了我的问题。我真的不知道为什么我没有想出这个早期:(:(

class Notifications_Bootstrap extends Zend_Application_Module_Bootstrap { 
    protected function _initConfig() { 
     set_include_path(implode(PATH_SEPARATOR, array(
      dirname(__FILE__) . '/library', 
      get_include_path(), 
     ))); 
    } 
} 
0

你可能只是使用模块的Boostrap.php。 提供功能

protected function _initAutoload(){} 

使lib可用。因此,您可以让模块开发人员这样做,因为它是开发模块以使其资源可加载的工作的一部分:)

+0

并称SNIPPIT似乎没有任何区别我也没有加入 “返回新Zend_Loader_Autoloader_Resource(阵列( ‘命名空间’=>‘通知’, ‘基本路径’=> MODULE_DIR。‘/通知’, “ (' ) ) ));“数组'( ) );” 因为它的功能体? –

1

您可以像应用程序的配置文件定义库的路径: 这是例如阳明

project: 
    bootstrap: 
     path: APPLICATION_PATH/Bootstrap/index.php 
     class: Bootstrap_Index 
    Autoloadernamespaces: 
     - Zend_ 
     - Library1_ 
     - Library2_ 
    resources: 
     FrontController: 
      moduledirectory: 
       - APPLICATION_PATH/modules 
...... 

这里是例如INI格式

[bootstrap] 
     Autoloadernamespaces[] = "Zend_" 
     Autoloadernamespaces[] = "Library1_" 
     Autoloadernamespaces[] = "Library2_" 

     resources.FrontController.moduleDirectory = APPLICATION_PATH"/modules" 
     resources.FrontController.resetRouterOnEveryRequest = true 

     bootstrap.path = APPLICATION_PATH "/Bootstrap/index.php" 
     bootstrap.class = "Bootstrap_Index" 

关于项目的目录结构,我建议你使用类似的东西:

- application 
    - Bootstrap 
     - index.php 
    - Modules 
     - Mod1 
      - controllers 
      - views 
     - Mod2 
      - controllers 
      - views 
     ... 
- library 
    - Zend 
     - ... 
    - Library1 
     - ... 
    - Library2 
     - ... 

做完,你可以有类似的URL /目录结构:模块/:控制器/:动作,并保持所有的第三方代码单独在自己的游泳池图书馆目录

+0

我并不是真的希望开发人员编辑任何核心,他们的想法是开发一个模块,并且可以有效地发挥作用。我的回答是我已经解决的问题,开发人员可以完成包含他们自己的库的工作。 –

+1

如果你遵循你的结构,你可能会得到 - Module1(Lib1,Lib2) - Module2(Lib1,Lib3),所以你将开始复制所需的库。在我的方法中,您有1个库池,您可以在其中转储所有正在使用它所需的第三方代码和模块目录。你的开发者没有改变任何核心,他们所要做的就是创建像APP_DIR/module/MyModule /这样的模块,并且这些模块会被路由器自动映射,所以你可以有URL:/:module /:controller /:action和voila! – infinity

+1

我周二回去工作时会回顾一下,它确实有道理,我可能只是偏执狂。感谢您的建议;将回报。 –

0

我加入这个回应既希望回答原来的问题,并对此处提交的一些项目提供一些说明。我是ZF 1.11中一个活跃的模块开发人员,并且使用我将要在我们维护的几个模块之一中每天解释的内容。

对于此回复的长度,我很抱歉。有几个项目需要考虑和考虑。

一,实施。

以下提供的片段据我所知提供〜1.8,并不会是你想要的1.11。

<?php 

class Notifications_Bootstrap extends Zend_Application_Module_Bootstrap { 

    protected function _initLibraryAutoloader() { 
     return $this->getResourceLoader()->addResourceType('library', 'library', 'library'); 
    } 

} 

下,虽然将工作提供优良下面我会介绍几个关键要素。

protected function _initLibraryAutoloader() { 
    return $this->getResourceLoader()->addResourceType('library', 'library', 'Library_'); 
} 

您会注意到第三个参数(名称空间)略有差异。这样做的最好的解释将是可能更新的功能如下:

Array 
(
[dbtable] => Array 
    (
     [namespace] => Admin_Model_DbTable 
     [path] => /path/to/trunk/application/modules/admin/models/DbTable 
    ) 

[mappers] => Array 
    (
     [namespace] => Admin_Model_Mapper 
     [path] => /path/to/trunk/application/modules/admin/models/mappers 
    ) 

[form] => Array 
    (
     [namespace] => Admin_Form 
     [path] => /path/to/trunk/application/modules/admin/forms 
    ) 

[model] => Array 
    (
     [namespace] => Admin_Model 
     [path] => /path/to/trunk/application/modules/admin/models 
    ) 

[plugin] => Array 
    (
     [namespace] => Admin_Plugin 
     [path] => /path/to/trunk/application/modules/admin/plugins 
    ) 

[service] => Array 
    (
     [namespace] => Admin_Service 
     [path] => /path/to/trunk/application/modules/admin/services 
    ) 

[viewhelper] => Array 
    (
     [namespace] => Admin_View_Helper 
     [path] => /path/to/trunk/application/modules/admin/views/helpers 
    ) 

[viewfilter] => Array 
    (
     [namespace] => Admin_View_Filter 
     [path] => /path/to/trunk/application/modules/admin/views/filters 
    ) 

[library] => Array 
    (
     [namespace] => Admin_Library 
     [path] => /path/to/trunk/application/modules/admin/library 
    ) 

) 

如果你比较这对以前的“库”为:

protected function _initLibraryAutoloader() { 
    $this->getResourceLoader()->addResourceType('library', 'library', 'Library_'); 
    var_dump($this->getResourceLoader()->getResourceTypes());die; 
} 

输出应该是类似的东西第三个参数,你会在第二个参数中看到它为什么会产生如此重要的差异。

重申,在这一点上,您已经声明了一个库类型,其前缀为“Library_”,即翻译为“Admin_Library”。现在,为了实现这一点,您可以像在主应用程序模块中一样在模块中创建库文件夹,只需稍作调整即可。要拥有管理员模块特定的控制器操作(Admin_Library_Controller_Action),您将拥有库/ Controller/Action.php,并且类名称为Admin_Library_Controller_Action。这是大多数人开始感到困惑的地方,但它与您应该在模块中使用的其他资源命名空间非常相似。

总结技术说明。如果您没有进一步阅读,您将能够拥有一个特定于您的模块的库,并且完全独立,可以轻松复制/粘贴可重复使用模块。

现在对于我在这里看到的其他一些回复的一些评论。

无穷指出

“如果你按照你的结构,你可能最终与 - 单词数(LIB1,LIB3),所以你会开始复制需要的库 - 模块1(LIB1,LIB2)。”

这在技术上是正确的,但如果您发现自己经常使用同一个库,那么在您的实际开发风格中会带来更多问题。我们通常将这些常用项存储在另一个库中,我们将它们用作外部的,与Zend相同,并放在Zend的一侧放在主应用程序库文件夹中。

假如你已经这样做了,我相信可能需要一些额外的说明,如果你正确地使用了命名空间,你绝对不必担心库类名的冲突。你可能会在很短的时间内发现你需要在多个模块中拥有相同代码的类,但是一旦发生这种情况,除了上面提到的Zend之外,还应该考虑一下通用库。

我对此回复的长度再次表示歉意。我希望它能帮助任何可能遇到这篇文章的人需要模块中的库实现。