Как включить библиотеку в приложение Zend Framework 2, используя автозагрузку на основе пространства имен?

Я создал подпапку MyNamespace в /vendor/ (это правильное место для собственных библиотек?) и хотите использовать такие классы, как MyNamespace\Mvc\Router\MyCustomRouter в моем приложении. Как я могу включить эту библиотеку в автозагрузку на основе моего пространства имен?

3 ответа

Решение

Редактировать init_autoloader.php и изменить if ($zf2Path) { раздел должен быть:

if ($zf2Path) {
    if (isset($loader)) {
        $loader->add('Zend', $zf2Path);
    } else {
        include $zf2Path . '/Zend/Loader/AutoloaderFactory.php';
        Zend\Loader\AutoloaderFactory::factory(array(
            'Zend\Loader\StandardAutoloader' => array(
                'autoregister_zf' => true,
                'namespaces' => array(
                    'MyNamespace' => __DIR__ . '/vendor/MyNamespace',
                ),                    
            )
        ));
    }
}

Обратите внимание на добавление MyNamespace ключ в Zend\Loader\StandardAutoloader раздел.

В дополнение к ответу Роба, некоторые другие способы автозагрузки пользовательской библиотеки

Во-первых, убедитесь, что структура вашей папки соответствует psr0.

Типичная структура для мифической psr0-совместимой библиотеки MyNamespace, используемой в примерах

vendor/
    MyNamespace/
        lib/
            MyNamespace/
                FooClass.php
                BarClass.php

Включить из файла Module.php, используя getAutoloaderConfig

public function getAutoloaderConfig()
{
    return array(
        'Zend\Loader\StandardAutoloader' => array(
            'namespaces' => array(
                'MyNamespace' => __DIR__ . '/../../vendor/MyNamespace/lib/MyNamespace',
            ),
        ),
    );
}

Прямо в index.php с использованием AutoloaderFactory настроить StandardAutoloader

// Setup autoloading
require 'init_autoloader.php';

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

Вы можете сделать то же самое в файле./config/autoload/.

<?php    
// file ./config/autoload/namespaces.local.php

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

Еще одной альтернативой для включения вашей библиотеки является редактирование vendor/composer/autoload_namespaces.php

<?php

// autoload_namespaces.php generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'Zend\\' => $vendorDir . '/zendframework/zendframework/library/',
    'MyNamespace\\' => $vendorDir . '/MyNamespace/lib/',
);

Также вы можете использовать автозагрузку композитора

{
"autoload": {
    "psr-0": {"MyNamespace\\": "vendor/MyNamespace/"}
}}
Другие вопросы по тегам