2012-01-11 29 views
8

Tôi đang vật lộn với các không gian tên trong khung công tác Zend (ít nhất tôi nghĩ đó là vấn đề không gian tên).Không tìm thấy lớp PHPExcel trong Zend Autoloader

Tôi muốn tích hợp PHPExcel vào dự án Zend của mình. cấu trúc tập tin có liên quan như sau:

/ 
-library 
    -ABCD 
    -PHPExcel 
    -Zend 
    -ZendX 
    -PHPExcel.php 

lớp Tuỳ chỉnh hoạt động tốt, sau

Zend_Loader_Autoloader::getInstance()->registerNamespace('ABCD_'); 

trong bootstrap. Ngoài ra, những lớp học này đều được đặt tên là ABCD_blahdeblah.

Tuy nhiên, việc đăng kýNamespace ('PHPExcel_') không giúp Zend tìm các lớp thích hợp. Khi tôi thử

$sheet = new PHPExcel; 

trong bộ điều khiển, tôi gặp lỗi "Không tìm thấy lớp". Tôi đoán rằng điều này là do các lớp trong PHPExcel không được đặt tên với tiền tố không gian tên, hoặc bởi vì tệp PHPExcel.php chính nằm bên ngoài vùng tên mà tôi vừa khai báo. Nhưng cấu trúc PHPExcel yêu cầu nó nằm trong thư mục cha của phần còn lại của các tệp class/font/etc.

Mọi con trỏ sẽ được đánh giá cao.

Xin cảm ơn trước.

+0

PHPExcel có sử dụng các lớp khác không? Không thể đổi tên lớp thành 'My_PHPExcel' hoặc' App_PHPExcel' và đặt mọi thứ vào thư mục tương ứng? – bububaba

+0

Nó sử dụng các lớp khác, bằng thuyền. Nó sẽ là một công việc tái cấu trúc. Hiện tại, tôi chỉ sử dụng "include_once" trong bộ điều khiển; nó không lý tưởng, nhưng làm việc. – yycroman

Trả lời

10

Tạo trình tải tự động cho PHPExcel và thêm nó vào ngăn xếp tự động tải Zend.

Trong 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; 
    } 
} 

Và trong application/configs/application.ini:

autoloadernamespaces[] = "My_" 

Sau đó, trong application/Bootstrap.php:

protected function _initAutoloading() 
{ 
    $autoloader = Zend_Loader_Autoloader::getInstance(); 
    $autoloader->pushAutoloader(new My_Loader_Autoloader_PHPExcel()); 
} 

Sau đó, bạn sẽ có thể nhanh chóng PHPExcel - nói rằng, trong một điều khiển - đơn giản:

$excel = new PHPExcel(); 

Phần dính duy nhất là tất cả điều này là cách PHPExcel xử lý tải tất cả các phụ thuộc của nó trong thư mục riêng của nó. Nếu điều đó được thực hiện một cách thông minh - hoặc với các cuộc gọi như require_once basename(__FILE__) . '/someFile.php' hoặc với trình nạp tự động của riêng nó mà bằng cách nào đó không có trong cách của trình tự động tải xuống Zend - thì tất cả sẽ được làm mát. #famouslastwords

+0

Hoạt động như mong đợi - và giờ tôi cũng biết cách thực hiện nó cho các thư viện khác, cảm ơn bạn! – yycroman

+1

Niềm vui của tôi. Khi tôi cuối cùng đã tìm ra điều này, nó mở ra một thế giới hoàn toàn mới để tích hợp các thư viện không phải PSR-0, giống như rất nhiều mã di sản mà tôi xử lý. Chúc mừng! –

+0

rất hữu ích. làm việc tuyệt vời cho các lớp học tùy chỉnh –

1

Cố gắng sửa đổi autoloader PHPExcel:

Thêm

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

như hai dòng đầu tiên của phương pháp Register() trong /Classes/PHPExcel/Autoloader.php, ngay trước

return spl_autoload_register(array('PHPExcel_Autoloader', 'Load')); 
0

Tôi đã gặp sự cố tương tự với cả exel-librare (phpxls) và thư viện pdf (fpdf) và sau một số lần thử khác nhau, tôi chỉ giải quyết bằng cách bao gồm tệp được yêu cầu từ thư viện theo cách thủ công và đi từ đó. Gian hàng phpxls và fdpd sau đó có thể xử lý mọi thứ khác mà không can thiệp vào các phương thức tự động tải xuống zend.

Ví dụ psudo_code trông giống như thế này, nơi tôi trả về đối tượng của lớp mong muốn và sau đó có thể tiếp tục làm việc với lớp đó. Bạn có thể offcourse chọn để bao gồm những thứ trong constructor và xây dựng từ đó.

<?php 
    class exelClass{ 

     public function exelFunction(){ 

      require_once 'required_file.php'; 

      $exelObject = new exelObject(); 

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

Giải pháp này có thể không phải là tao nhã, nhưng tôi phát hiện ra rằng đó là cách dễ nhất để cho phép các loại hình thư viện để cùng tồn tại mà không autoloaders differnet hoặc các chức năng kỳ diệu interfearing với nhau.

4

Ngày nay, nhà soạn nhạc là một công cụ thường được sử dụng không trở nên phổ biến trong năm 2012. Ngay cả các dự án cũ hơn được xây dựng trong ZF1 cũng có thể sử dụng nhà soạn nhạc và trình tự động tải.

Cách nhận tất cả thư viện của bạn hoạt động mà không phải thêm bộ nạp tự động tùy chỉnh vào application.ini mỗi lần?

Make sử dụng của nhà soạn nhạc của autoloader

Đầu tiên, hãy bắt đầu với setting up composer.json. Khi được tạo, hãy chạy composer install để thu thập tất cả các gói bắt buộc và tạo trình tải tự động của nhà soạn nhạc.

Bây giờ, hãy cập nhật public/index.php của dự án của bạn. Từ bây giờ tất cả các yêu cầu được tải thông qua nhà soạn nhạc sẽ được tự động tải.

<?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(); 
Các vấn đề liên quan