通过服务层在非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.json
的autoload
部分中注册模块命名空间。
谢谢@Tomdarkness,帮助。我现在如何从这个类创建一个实例?我更新了我原来的帖子。 – Laurent
我将这个标记为已解决,因为我的设置方式有缺陷。我需要找到一个更好的方式来整合我的ZF模块与任何外部应用程序:http://*.com/questions/19154300/zf2-load-service-config-from-module – Laurent