2011-12-19 21 views
9

Tôi cần sử dụng tự động tải cho các lớp tùy chỉnh của mình trong Zend Framework 2.0. Thư viện tùy chỉnh của tôi nằm ở số /vendor/Garvey/library/Garvey. Tôi có một lớp AbstractTable mở rộng đơn giản trong /vendor/Garvey/library/Garvey/Db/Table/AbstractTable.php:Tự động tải thư viện tùy chỉnh trong Zend Framework 2.0

<?php 

namespace Garvey\Db\Table; 

use Zend\Db\Table\AbstractTable; 

abstract class AbstractTable extends AbstractTable 
{ 
    public function getItemById($id) 
    { 

    } 
} 

Trong index.php Tôi có đoạn mã sau:

require_once 'vendor/ZendFramework/library/Zend/Loader/AutoloaderFactory.php'; 
Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array(
    'prefixes' => array(
     'Garvey' => 'vendor/Garvey/library/Garvey', 
    ) 
))); 

Nhưng tôi có các lỗi sau. Những gì tôi đã bỏ lỡ?

Fatal error: Class 'Garvey\Db\Table\AbstractTable' not found 

Cảm ơn bạn trước.

+0

gì? đó là sai nhìn vào [hướng dẫn] (http://framework.zend.com/manual/en/zend.loader.autoloader.html) – noob

+0

Nó là một khung công tác Zend 2. Beta1. – pltvs

+0

Tại sao bạn sử dụng phiên bản cũ hơn ... (2 phút) – noob

Trả lời

11

index.php ban đầu của bạn cũng sẽ làm việc nếu bạn đã thay đổi chìa khóa của tiền tố 'thành' không gian tên và xác định con đường như dưới đây:

Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array(
    'namespaces' => array(
     'Garvey' => dirname(__DIR__) . '/vendor/Garvey', 
    ) 
))); 
+2

Câu trả lời hay, chỉ cần chỉnh sửa một chút cho câu hỏi cụ thể này: ''Garvey' => dirname (__ DIR__). '/ vendor/Garvey/library/Garvey'' – Hegemon

+0

plutov, bạn không nên cần: require_once' vendor/ZendFramework/library/Zend/Loader/AutoloaderFactory.php '; –

2

Tôi đã tìm thấy câu trả lời. Đặt điều này trong index.php của bạn:

require_once 'vendor/ZendFramework/library/Zend/Loader/StandardAutoloader.php'; 
$loader = new Zend\Loader\StandardAutoloader(); 
$loader->registerNamespace('Garvey', realpath('vendor/Garvey/library/Garvey')); 
$loader->register(); 
+0

Đó là cách chính xác. –

+0

mmm một chút bực bội. Bạn có thể mới nhưng tôi thậm chí còn mới hơn! Trường hợp ở trên đi đâu? Tôi đang suy nghĩ công khai/index.php –

+0

Có, bạn đã sửa. index.php – pltvs

11

Hoặc bạn phương pháp có thể giải quyết trong Module.php

public function getAutoloaderConfig() 
{ 
    $return = array(
     'Zend\Loader\ClassMapAutoloader' => array(
      __DIR__ . '/autoload_classmap.php' 
     ), 
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
       'Garvey' => __DIR__ . '/../../vendor/Garvey/library/Garvey', 
      ) 
     ) 
    ); 
} 

Nhưng tôi không khuyên bạn nên sử dụng phương pháp này. Vì mục đích ZF2 tập trung vào tốc độ tải tự động theo cách tốt nhất là sử dụng kiểu class_map để tải các lớp của bạn. Nó sẽ làm việc nhanh hơn nhiều vào cuối nhưng yêu cầu công việc bổ sung. Bạn có thể đăng ký mọi lớp trong tệp class_map của bạn.

Bạn có thể tạo class_map.php trong thư mục gốc của thư viện của bạn và đặt ở đó

<?php 
return array(
    'Garvey\Db\Table\AbstractTable' => __DIR__ . '/Garvey/Db/Table/AbstractTable.php', 
); 

Và thêm có nhiều lớp học như bạn sử dụng. Và trong getAutoloaderConfig(), bạn có thể thêm bạn classmap

public function getAutoloaderConfig() 
{ 
    $return = array(
     'Zend\Loader\ClassMapAutoloader' => array(
      __DIR__ . '/autoload_classmap.php', 
      __DIR__ . '/../../vendor/Garvey/library/Garvey/class_map.php', 
     ), 
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
      ) 
     ) 
    ); 
} 
+0

Theo tôi, đây là câu trả lời hay nhất. Sử dụng bản đồ lớp là cách nhanh nhất (nếu không phải là nhanh nhất) để tải các lớp và do Zend đề xuất. Nó cũng rõ ràng và dễ theo dõi. Tốt công việc thanh toán bù trừ phương pháp này ra, cảm ơn! –

3

Matthew Weier O'Phinney giải thích trong this video rằng hiện nay có 3 phương pháp để tự động load:

  • ZF1 kiểu include_path autoloader (cũ phương pháp zf1 , không được khuyến khích)
  • Per-namespace/tiền tố tự động load (mới phương pháp zf2, tốt hơn)
  • Class-map autoloading (đề nghị và nhanh nhất)

Một tiện ích class-map generator được đề cập trong các tài liệu mà sẽ chăm sóc bằng văn bản cho /vendor/vendor_name/library/autoload_classmap.php cho bạn.

Giải pháp bạn tìm thấy tương tự như giải pháp mà Matthew đề cập trong video cho Tự động tải tiền tố/không gian tên. Theo cấu trúc mã trong ZendSkeletonApplication, mã đó sẽ xuất hiện trong tệp /init_autoloader.php, thay vì trong tệp /public/index.php.

2

Xem nhanh this post.

Bây giờ bước tiếp theo là thêm một số mã vào thư viện tùy chỉnh của chúng tôi.

Trước hết mở một tập tin ./vendor/Garvey/autoload_classmap.php

return array(

    'Garvey\Module' => __DIR__ . '/Module.php', 

    'Garvey\Db\Table' => __DIR__ . '/library/Garvey/Db/Table/AbstractTable.php', 

) 

Tiếp theo là ./vendor/Garvey/Module.php

namespace Garvey; 

use Zend\ModuleManager\Feature\AutoloaderProviderInterface; 

class Module implements AutoloaderProviderInterface 
{ 
    public function getAutoloaderConfig() 
    { 
     return array(
      'Zend\Loader\ClassMapAutoloader' => array(
       __DIR__ . '/autoload_classmap.php', 
      ), 

      'Zend\Loader\StandardAutoloader' => array(
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/library/' . __NAMESPACE__, 
       ), 
      ), 
     ); 
    } 
} 

Bây giờ bên trong thư viện của bạn tạo ra một tập tin bên trong thư mục:

./vendor/Kdecom/library/Kdecom/Db/Table/AbstractTable.php

Một thức điều chúng ta cần làm ich là thêm thư viện này vào tệp application.config.php của bạn.

Vì vậy application.config.php tập tin của bạn sẽ trông giống như sau theo cách này ...

return array(
    'modules' => array(
     'Application', 
     'Garvey' 
    ), 

    'module_listener_options' => array(
     'config_glob_paths' => array(
      'config/autoload/{,*.}{global,local}.php', 
     ), 

     'module_paths' => array(
      './module', 
      './vendor', 
     ), 
    ), 
); 
+0

Trả về liên kết bài đăng 404 –

Các vấn đề liên quan