主要是关于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库。 无论如何,我很乐意看到别人的解决方案
答案 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功能了。