如何使用基于命名空间的自动加载将库包含到Zend Framework 2应用程序中?

时间:2013-03-27 15:17:45

标签: namespaces zend-framework2 autoload zend-autoloader

我在MyNamespace中创建了一个子文件夹/vendor/(它是自己库的正确位置吗?)并希望在我的应用程序中使用MyNamespace\Mvc\Router\MyCustomRouter这样的类。如何将此库包含在基于命名空间的自动加载中?

3 个答案:

答案 0 :(得分:3)

除了Rob的回答,还有其他一些自动加载自定义库的方法

首先,确保您的文件夹结构符合psr0

示例中使用的神秘的psr0兼容MyNamespace库的典型结构

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

使用getAutoloaderConfig

从Module.php文件中包含
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',
         ),
     )
));

包含您的lib的另一种选择是编辑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/',
);

答案 1 :(得分:1)

修改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密钥。

答案 2 :(得分:0)

您也可以使用composer autoloading

{
"autoload": {
    "psr-0": {"MyNamespace\\": "vendor/MyNamespace/"}
}}