Автозагрузка пользовательской библиотеки в Zend Framework 2.0 - PullRequest
9 голосов
/ 19 декабря 2011

Мне нужно использовать автозагрузку для своих пользовательских классов в 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

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

Ответы [ 5 ]

11 голосов
/ 23 февраля 2012

Ваш оригинальный index.php также работал бы, если бы вы изменили ключ 'prefixes' на 'namespaces' и указали путь, как показано ниже:

Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array(
    'namespaces' => array(
        'Garvey' => dirname(__DIR__) . '/vendor/Garvey',
    )
)));
11 голосов
/ 11 июня 2012

Или вы можете определить метод в 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 () вы можете добавить свою карту классов

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__,
            )
        )
    );
}
3 голосов
/ 09 октября 2012

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

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

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

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

2 голосов
/ 22 октября 2012

Быстрый просмотр этой записи .

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

Прежде всего откройте файл ./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',
        ),
    ),
);
2 голосов
/ 19 декабря 2011

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