2011-12-19 11 views
9

Potrzebuję użyć automatycznego ładowania do moich niestandardowych klas w Zend Framework 2.0. Moja niestandardowa biblioteka znajduje się w /vendor/Garvey/library/Garvey. Mam proste rozszerzoną AbstractTable klasę w /vendor/Garvey/library/Garvey/Db/Table/AbstractTable.php:Automatyczne dodawanie niestandardowej biblioteki w Zend Framework 2.0

<?php 

namespace Garvey\Db\Table; 

use Zend\Db\Table\AbstractTable; 

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

    } 
} 

W index.php Mam następujący kod:

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', 
    ) 
))); 

Ale mam następujący błąd. Co przegapiłem?

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

Z góry dziękuję.

+0

co? to złe spojrzenie na [podręcznik] (http://framework.zend.com/manual/en/zend.loader.autoloader.html) – noob

+0

To jest Zend Framework 2. Beta1. – pltvs

+0

Dlaczego używasz starszej wersji ... (2min) – noob

Odpowiedz

11

Oryginalna index.php będzie pracował jeśli zmieniłeś klawisz „” do „przedrostki nazw” i określ ścieżkę jak poniżej:

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

Dobra odpowiedź, tylko drobna poprawka do tego konkretnego pytania: '' Garvey '=> dirname (__ DIR__). "/ vendor/Garvey/library/Garvey'' – Hegemon

+0

plutov, nie powinieneś potrzebować: require_once 'vendor/ZendFramework/library/Zend/Loader/AutoloaderFactory.php'; –

2

Znalazłem odpowiedź. Umieścić to w index.php:

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

To jest poprawna metoda. –

+0

mmm trochę frustrujące. Możesz być nowy, ale jestem jeszcze nowszy! Gdzie się znajduje powyższe? Myślę public/index.php –

+0

Tak, zgadzasz się. index.php – pltvs

11

Lub może zignorować metodę w 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', 
      ) 
     ) 
    ); 
} 

Ale nie poleciłbym tego. Ponieważ cel ZF2 koncentruje się na prędkości w automatycznym ładowaniu, najlepszym sposobem jest użycie stylu class_map do załadowania klas. Na końcu będzie działać znacznie szybciej, ale wymaga dodatkowej pracy. Możesz zarejestrować każdą klasę w pliku class_map.

Można tworzyć class_map.php w katalogu głównym biblioteki i umieścić tam

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

I dodać tam wiele klas, jak używać. Aw getAutoloaderConfig() można dodać Ci 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

Moim zdaniem jest to najlepsza odpowiedź. Używanie mapy klas jest szybkim (jeśli nie najszybszym) sposobem ładowania klas i do tego zalecanym przez Zend. Jest również przejrzysty i łatwy do prześledzenia. Dobra robota oczyszczająca tę metodę, dzięki! –

3

Matthew Weier O'Phinney wyjaśnia this video że obecnie 3 metody autoloading:

  • ZF1 stylu include_path autoloader (stara metoda ZF1 nie zaleca)
  • Per-nazw/prefiks autoloading (nowa metoda ZF2, lepiej)
  • Class-map autoloading (zalecane i najszybszy)

class-map generator narzędzie wspomniano w docs że będą dbać o pisanie /vendor/vendor_name/library/autoload_classmap.php dla Ciebie.

Rozwiązanie, które znalazłeś, jest podobne do tego, o którym wspomina Matthew w filmie dla Pero namespace/prefolo autoloading. Zgodnie ze strukturą kodu w ZendSkeletonApplication, kod ten byłby przesyłany do pliku /init_autoloader.php, a nie do pliku /public/index.php.

2

Rzuć okiem na this post.

Następnym krokiem jest dodanie kodu do naszej biblioteki niestandardowej.

Przede wszystkim otworzyć plik ./vendor/Garvey/autoload_classmap.php

return array(

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

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

) 

Dalej jest ./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__, 
       ), 
      ), 
     ); 
    } 
} 

Teraz wewnątrz biblioteki utworzyć plik w folderze:

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

Jeden końcowego rzecz, którą musimy zrobić Ich jest dodanie tej biblioteki do pliku application.config.php.

Więc application.config.php plik będzie wyglądać tak ten sposób ...

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

Przesłanie łącza zwrotnego 404 –