我正在使用Zend Framework中的命名空间(至少我认为这是命名空间问题)。
我想将PHPExcel集成到我的Zend项目中。相关文件结构如下:
/
-library
-ABCD
-PHPExcel
-Zend
-ZendX
-PHPExcel.php
自定义类在
之后正常工作Zend_Loader_Autoloader::getInstance()->registerNamespace('ABCD_');
在引导程序中。此外,这些课程都被命名为ABCD_blahdeblah。
但是,执行registerNamespace('PHPExcel_')无助于Zend找到合适的类。当我尝试
$sheet = new PHPExcel;
在控制器中,我收到“未找到类”错误。我猜这是因为PHPExcel中的类没有使用命名空间前缀命名,或者因为主PHPExcel.php文件位于我刚刚声明的命名空间之外。但PHPExcel结构要求它位于其余类/ font / etc文件的父目录中。
任何指针都将非常感激。
提前致谢。
答案 0 :(得分:10)
为PHPExcel创建自动加载器并将其添加到Zend自动加载器堆栈。
在library/My/Loader/Autoloader/PHPExcel.php
:
class My_Loader_Autoloader_PHPExcel implements Zend_Loader_Autoloader_Interface
{
public function autoload($class)
{
if ('PHPExcel' != $class){
return false;
}
require_once 'PHPExcel.php';
return $class;
}
}
在application/configs/application.ini
:
autoloadernamespaces[] = "My_"
然后,在application/Bootstrap.php
:
protected function _initAutoloading()
{
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->pushAutoloader(new My_Loader_Autoloader_PHPExcel());
}
然后你应该能够用一个简单的实例化PHPExcel - 比如在控制器中 - :
$excel = new PHPExcel();
唯一的粘性部分就是PHPExcel处理在其自己的文件夹中加载所有依赖项的方法。如果这是智能地完成 - 无论是使用require_once basename(__FILE__) . '/someFile.php'
之类的调用,还是使用自己的自动加载器,它都不会妨碍Zend自动加载器 - 那么一切都应该很酷。 #famouslastwords
答案 1 :(得分:4)
如今作曲家是一个经常使用的工具,在2012年还不那么受欢迎。即使是在ZF1中构建的旧项目也可以使用作曲家及其自动加载器。
如何让您的库全部工作,而无需每次都向application.ini
添加自定义自动加载器?
首先,从setting up composer.json开始。创建后,运行composer install
以收集所有必需的包并创建作曲家的自动加载器。
现在,让我们更新您的项目public/index.php
。从现在开始,通过composer加载的所有要求都将被自动加载。
<?php
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development'));
// Include composer autoloader
require_once __DIR__ . '/../vendor/autoload.php';
/** Zend_Application */
require_once 'Zend/Application.php';
// Create application, bootstrap, and run
$application = new Zend_Application(
APPLICATION_ENV,
array( 'config' => APPLICATION_PATH . '/configs/application.ini' )
);
$application->bootstrap();
$application->run();
答案 2 :(得分:1)
尝试修改PHPExcel自动加载器:
添加
if (function_exists('__autoload')) {
spl_autoload_register('__autoload');
}
作为/Classes/PHPExcel/Autoloader.php中Register()方法的前两行,紧接在
之前return spl_autoload_register(array('PHPExcel_Autoloader', 'Load'));
答案 3 :(得分:0)
我对exel-librare(phpxls)和pdf-library(fpdf)都有类似的问题,经过一些不同的尝试,我刚刚决定从库中包含所需的文件并从那里开始。然后,phpxls和fdpd可以在不干扰zend自动加载器方法的情况下处理其他所有内容。
psudo_code示例看起来像这样,我返回所需类的对象,然后可以继续使用它。你可以选择在构造函数中包含东西并从中构建。
<?php
class exelClass{
public function exelFunction(){
require_once 'required_file.php';
$exelObject = new exelObject();
return $exelObject->Output();
}
}
?>
这个解决方案可能不那么优雅,但我发现这是让不同类型的库共存的最简单方法,没有不同的自动加载器或魔术函数相互干扰。