Zend Autoloader中找不到PHPExcel类

时间:2012-01-11 08:45:37

标签: zend-framework namespaces phpexcel

我正在使用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文件的父目录中。

任何指针都将非常感激。

提前致谢。

4 个答案:

答案 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添加自定义自动加载器?

使用composer的自动加载器

首先,从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();
        }
    }
    ?>

这个解决方案可能不那么优雅,但我发现这是让不同类型的库共存的最简单方法,没有不同的自动加载器或魔术函数相互干扰。