通过服务层在非ZF应用程序中调用独立的ZF模块

问题描述:

我创建了一个管理一组数据库和文件系统操作的Zend Framework模块。我设法获得了100%的测试覆盖率(使用模拟数据库),并且我想测试此模块到测试环境中的集成。通过服务层在非ZF应用程序中调用独立的ZF模块

我在/modules/MyModule/src/MyModule/Service/MyModuleService.php中有一个Service类,它目前没有实现任何接口。文档并不暗示这是我需要做的事情。

class MyModuleService 
{ 
    public function doA(){...} 
    public function doB(){...} 
..... 
} 

我从默认的应用程序框架中没有更改应用程序文件夹中的任何内容。我已经编写了模型类来完成大量的数据库和文件系统操作。 Service类最终会触发这些操作。 根据教程完成基本配置后,似乎ZF在我尝试在ZF文件系统外访问它们时没有注册我的类。

//dependencies for auto loader 
require_once 'Zend/Loader/AutoloaderFactory.php'; 
use Zend\Loader\AutoloaderFactory; 

//NEW registering the autoloader (as per Tomdarkness' response) 
Zend\Loader\AutoloaderFactory::factory(array(
     'Zend\Loader\StandardAutoloader' => array(
      'autoregister_zf' => TRUE, 
      'namespaces'  => array(
       'MyModule'=> '/path/to/zendframework/module/src/MyModule', 
      ) 
     ) 
    ) 
); 

//what factories are auto-loaded? 
var_export(AutoloaderFactory::getRegisteredAutoloaders()); 

的var_export现在返回以下:

array(
    'Zend\\Loader\\StandardAutoloader' => Zend\Loader\StandardAutoloader::__set_state(
     array('namespaces'    => 
       array('Zend\\'   => '/usr/lib/zendframework/library/Zend/', 
        'MyModule\\'  => '/path/to/zendframework/module/src/MyModule/', 
      ), 'prefixes'   => array(), 
       'fallbackAutoloaderFlag' => FALSE, 
     ) 
    ) 
); 

在我module.php我做声明服务如下:

/* Configure DB Service Managers */ 
    public function getServiceConfig() 
    { 
     return array(
      // ... 
      'invokables' => array(
       'myModuleService'=> function ($sm){ 
        $myModuleTable = $sm->get('MyModuleTable\Model\MyModuleTable'); 
        return new MyModuleService($myModuleTable); 
       } 
      ), 
    } 

如何我现在可以从这个实例化一个MyModuleService自动加载课程?

您致电:

var_dump(AutoloaderFactory::getRegisteredAutoloaders()); 

但是你没有实际注册任何自动加载。要注册,你需要运行标准自动加载磁带机:

Zend\Loader\AutoloaderFactory::factory(array(
    'Zend\Loader\StandardAutoloader' => array(
     'autoregister_zf' => true 
    ) 
)); 

您还可以通过factory方法,如果你已经产生classmaps注册类映射自动加载。

请注意,如果您使用的是作曲家,那么您只需要在文件中包含vendor/autoload.php,而不是使用AutoloaderFactory。但是,请记住,如果使用此方法,则需要在composer.jsonautoload部分中注册模块命名空间。

+0

谢谢@Tomdarkness,帮助。我现在如何从这个类创建一个实例?我更新了我原来的帖子。 – Laurent

+0

我将这个标记为已解决,因为我的设置方式有缺陷。我需要找到一个更好的方式来整合我的ZF模块与任何外部应用程序:http://*.com/questions/19154300/zf2-load-service-config-from-module – Laurent