如何使用一个ZF2模块作为第三方库?

时间:2013-03-02 11:44:37

标签: yii zend-framework2 autoload

主要是关于ZF2的问题,但主要任务是如何将ZF2集成到Yii。

如果它是ZF1,我只需要包含我需要的文件。 ZF2有一点点复杂的结构。

特别需要加载ServiceManager模块。

我试过了:

$loader = new Zend\Loader\ClassMapAutoloader();
$loader->registerAutoloadMap(realpath(dirname(__FILE__) . '/lib/Zend/ServiceManager'));
$loader->register();

出了错误:

Warning: include(/Project/lib/Zend/ServiceManager): failed to open stream: Invalid argument in /Project/lib/Zend/Loader/ClassMapAutoloader.php on line 186

Warning: include(): Failed opening '/Project/lib/Zend/ServiceManager' for inclusion (include_path='/Project/lib:.:/usr/local/zend/share/ZendFramework/library:/usr/local/zend/share/pear') in /Project/lib/Zend/Loader/ClassMapAutoloader.php on line 186

Fatal error: Uncaught exception 'Zend\Loader\Exception\InvalidArgumentException' with message 'Map file provided does not return a map. Map file: "/Project/lib/Zend/ServiceManager"' in /Project/lib/Zend/Loader/ClassMapAutoloader.php:88
Stack trace:
#0 /Project/index.php(14): Zend\Loader\ClassMapAutoloader->registerAutoloadMap('/Project/...')
#1 {main}
  thrown in /Project/lib/Zend/Loader/ClassMapAutoloader.php on line 88

根据documentation我需要在配置数组中设置命名空间描述吗?

有人可以举例说明如何只包含一个模块吗?

更新1:

我也试过这个:

require_once 'Zend/Loader/StandardAutoloader.php';

$l = new Zend\Loader\StandardAutoloader();
$l->registerPrefix('Zend', realpath(dirname(__FILE__) . '/lib/Zend/') );
$l->register();

有效。之后我打电话给:

use Zend\Debug;
Zend\Debug::dump($l);

这会再次出现错误:

Fatal error: Class 'Zend\Debug' not found in ...

更新2:

此代码适用于我:

require_once 'Zend/Loader/StandardAutoloader.php';

$l = new Zend\Loader\StandardAutoloader();
$l->registerNamespace('Zend', realpath(dirname(__FILE__) . '/lib/Zend'));
$l->registerPrefix('Zend', realpath(dirname(__FILE__) . '/lib/Zend') );
$l->register();

现在我可以在项目的任何地方包含Zend库。 无论如何,我很乐意看到别人的解决方案

2 个答案:

答案 0 :(得分:2)

我建议不要使用你提出的解决方案,因为它有点像黑客攻击。关于ZF2的一个有趣的事情是,它使您明确定义依赖关系,以便您的应用程序可以轻松地与它们交谈。因此,您可以通过composer安装Yii作为依赖项:

"yiisoft/yii": "dev-master"

如果您通过Composer安装它,您的类自动加载器将通过对Yii框架的引用进行更新。因此,它允许您通过FQCN访问这些文件,即:

use Yii\Path\To\Class as YiiClass;

...

$yii = new YiiClass();

或者:

$yii = new \Yii\Path\To\Class();

使用Composer还可以让您及时了解最新版本(您只需重新运行编写器脚本,它就可以为您安装)。

答案 1 :(得分:2)

我有几个脚本位于ZF2正常区域之外,我需要使用框架的随机函数。我找到的简单解决方案是:

chdir(dirname(__DIR__));

require_once 'init_autoloader.php';

\Zend\Mvc\Application::init(require_once 'config/application.config.php');

这些文件没有什么特别之处,因为它们是ZF2 Skeleton App的标准配置。

现在我可以使用任何ZF2功能了。