Класс PHPExcel не найден в Zend Autoloader - PullRequest
8 голосов
/ 11 января 2012

Я борюсь с пространствами имен в 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 ]

10 голосов
/ 11 января 2012

Создайте автозагрузчик для 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

4 голосов
/ 09 мая 2017

В настоящее время composer - это часто используемый инструмент, который не был так популярен в 2012 году. Даже более старые проекты, созданные в ZF1, могут использовать composer и его автозагрузчик.

Как заставить все ваши библиотеки работать без необходимости каждый раз добавлять пользовательские автозагрузчики в application.ini?

Использовать автозагрузчик композитора

Сначала начните с , настроив composer.json . После создания запустите composer install, чтобы собрать все необходимые пакеты и создать автозагрузчик композитора.

Теперь давайте обновим public/index.php вашего проекта. Отныне все требования, загружаемые через композитор, будут автоматически загружаться.

<?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();
1 голос
/ 12 января 2012

Попробуйте изменить автозагрузчик PHPExcel:

Добавьте

    if (function_exists('__autoload')) {
        spl_autoload_register('__autoload');
    }

в качестве первых двух строк метода Register () в /Classes/PHPExcel/Autoloader.php, непосредственно перед

return spl_autoload_register(array('PHPExcel_Autoloader', 'Load'));
0 голосов
/ 12 января 2012

У меня была похожая проблема как с exel-librare (phpxls), так и с pdf-библиотекой (fpdf), и после нескольких разных попыток я просто решил включить необходимый файл из библиотеки вручную и перейти оттуда. Booth phpxls и fdpd могут обрабатывать все остальное, не вмешиваясь в методы автозагрузчика zend.

Пример psudo_code будет выглядеть следующим образом, где я возвращаю объект нужного класса и затем могу продолжать работать с этим. Вы могли бы, конечно, выбрать, чтобы включить вещи в конструктор и строить из этого.

    <?php
    class exelClass{

        public function exelFunction(){

            require_once 'required_file.php';

            $exelObject = new exelObject();

            return $exelObject->Output();
        }
    }
    ?>

Это решение может быть не таким уж элегантным, но я обнаружил, что это самый простой способ обеспечить сосуществование разных типов библиотек без автозагрузчиков с разными сетями или магических функций, не взаимодействующих друг с другом.

...