Zend Framework 2.0中的自动加载自定义库


Autoload custom library in Zend Framework 2.0

我需要在Zend Framework 2.0中使用自定义类的自动加载。我的自定义库位于/vendor/Garvey/library/Garvey。我在/vendor/Garvey/library/Garvey/Db/Table/AbstractTable.php中有一个简单的扩展abstractttable类:

<?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

提前感谢。

如果您将'prefixes'键更改为'namespaces'并指定如下路径,则原始index.php也可以工作:

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

或者您可以在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__,
            )
        )
    );
}

Matthew Weier O'Phinney在这个视频中解释了现在有3种自动加载方法:

  • zf1 -style include_path自动加载器(旧的zf1方法,不推荐)
  • 按命名空间/前缀自动加载(新的zf2方法,更好的)
  • 类映射自动加载(推荐和最快的)

文档中提到了一个类映射生成器实用程序,它将负责为您编写/vendor/vendor_name/library/autoload_classmap.php

您找到的解决方案类似于Matthew在视频中提到的每个名称空间/前缀自动加载的解决方案。按照ZendSkeletonApplication中的代码结构,这些代码将放在/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',
        ),
    ),
);