Мне нужно использовать автозагрузку для моих пользовательских классов в 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 метода для автоматической загрузки:
Утилита генератора классов-классов упоминается в документах, которые позаботятся о записи /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', ), ), );