Автозагрузка пользовательской библиотеки в Zend Framework 2.0

Мне нужно использовать автозагрузку для моих пользовательских классов в Zend Framework 2.0 . Моя пользовательская библиотека расположена в /vendor/Garvey/library/Garvey . У меня есть простой расширенный класс AbstractTable в /vendor/Garvey/library/Garvey/Db/Table/AbstractTable.php :

 <?php namespace Garvey\Db\Table; use Zend\Db\Table\AbstractTable; abstract class AbstractTable extends AbstractTable { public function getItemById($id) { } } 

В index.php у меня есть следующий код:

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

Но у меня есть следующая ошибка. Что я пропустил?

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

Заранее спасибо.

Ваш исходный index.php также работал бы, если вы изменили ключ «префиксы» на «пространства имен» и указали путь, как показано ниже:

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

Или вы можете использовать метод defime в 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', ) ) ); } 

Но я бы не рекомендовал его. Поскольку цель ZF2, ориентированная на скорость автозагрузки, лучше всего использовать стиль class_map для загрузки ваших классов. Он будет работать намного быстрее в конце, но потребует дополнительной работы. Вы можете зарегистрировать каждый класс в вашем файле class_map.

Вы можете создать class_map.php в корне вашей библиотеки и разместить там

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

И добавьте туда столько классов, сколько вы используете. А в getAutoloaderConfig () вы можете добавить вам 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__, ) ) ); } 

Мэтью Вейер O'Phinney объясняет в этом видео, что есть теперь 3 метода для автоматической загрузки:

  • ZF1-стиль include_path автозагрузчик ( старый метод zf1, не рекомендуется )
  • Самостоятельная загрузка пространства имен / префиксов ( новый метод zf2, лучше )
  • Автозагрузка класса карты ( рекомендуется и самая быстрая )

Утилита генератора классов-классов упоминается в документах, которые позаботятся о записи /vendor/vendor_name/library/autoload_classmap.php для вас.

Решение, которое вы нашли, похоже на то, что Мэтью упоминает в видео для автозагрузки Per-namespace / prefix. Следуя структуре кода в ZendSkeletonApplication , этот код будет /init_autoloader.php файле /init_autoloader.php , а не в файле /public/index.php .

Я нашел ответ. Поместите это в свой 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(); 

Быстро посмотрите этот пост .

Теперь следующий шаг – добавить код в нашу пользовательскую библиотеку.

Прежде всего откройте файл ./vendor/Garvey/autoload_classmap.php

 return array( 'Garvey\Module' => __DIR__ . '/Module.php', 'Garvey\Db\Table' => __DIR__ . '/library/Garvey/Db/Table/AbstractTable.php', ) 

Далее ./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__, ), ), ); } } 

Теперь внутри вашей библиотеки создайте файл внутри папки:

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

Последнее, что нам нужно сделать, это добавить эту библиотеку в файл application.config.php .

Поэтому ваш файл application.config.php будет выглядеть примерно так …

 return array( 'modules' => array( 'Application', 'Garvey' ), 'module_listener_options' => array( 'config_glob_paths' => array( 'config/autoload/{,*.}{global,local}.php', ), 'module_paths' => array( './module', './vendor', ), ), );