Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过服务层使独立的ZF模块在非ZF应用程序中可调用_Php_Zend Framework_Zend Framework2_Zend Autoloader_Servicemanager - Fatal编程技术网

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

Php 通过服务层使独立的ZF模块在非ZF应用程序中可调用,php,zend-framework,zend-framework2,zend-autoloader,servicemanager,Php,Zend Framework,Zend Framework2,Zend Autoloader,Servicemanager,我创建了一个Zend框架模块,它管理一组数据库和文件系统操作。我已经成功地获得了100%的测试覆盖率(使用模拟数据库),我想测试这个模块与测试环境的集成 我在/modules/MyModule/src/MyModule/Service/MyModuleService.php中有一个服务类,它目前没有实现任何接口。文档并没有暗示这是我需要做的事情 class MyModuleService { public function doA(){...} public function d

我创建了一个Zend框架模块,它管理一组数据库和文件系统操作。我已经成功地获得了100%的测试覆盖率(使用模拟数据库),我想测试这个模块与测试环境的集成

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

class MyModuleService
{
    public function doA(){...}
    public function doB(){...}
.....
}
我没有更改默认应用程序框架中应用程序文件夹中的任何内容。我已经编写了模型类,这些模型类执行大量数据库和文件系统操作。服务类最终将触发这些操作。 根据教程完成了基本配置之后,当我尝试在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_导出现在返回以下内容:

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,
        )
    )
);
在my 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
方法注册类映射自动加载程序


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

谢谢@tomdarky的帮助。现在如何从该类创建实例?我更新了我原来的帖子。我将把它标记为已解决,因为我的设置方式有缺陷。我需要找到更好的方式将我的ZF模块与任何外部应用程序集成: