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

时间:2013-09-30 15:21:39

标签: php zend-framework zend-framework2 zend-autoloader servicemanager

我创建了一个Zend Framework Module来管理一组数据库和文件系统操作。我已经设法获得100%的测试覆盖率(使用模拟数据库),我想测试该模块与测试环境的集成。

我在/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?

1 个答案:

答案 0 :(得分:0)

你打电话:

var_dump(AutoloaderFactory::getRegisteredAutoloaders()); 

但您实际上并没有注册任何自动加载器。要注册标准自动装载机,您需要运行:

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

如果您已经生成了类映射,也可以通过factory方法注册Classmap自动加载器。

注意,如果您使用的是composer,那么您实际上只需要在文件中包含vendor/autoload.php,而不是使用AutoloaderFactory。但是,请记住,如果使用此方法,则需要在autoload的{​​{1}}部分中注册模块名称空间。