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

Ale*_*tau 9 php zend-framework autoload zend-framework2

我需要在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)
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

在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',
    )
)));
Run Code Online (Sandbox Code Playgroud)

但是我有以下错误.我错过了什么?

Fatal error: Class 'Garvey\Db\Table\AbstractTable' not found
Run Code Online (Sandbox Code Playgroud)

先感谢您.

小智 12

如果您将'前缀'键更改为'名称空间'并指定如下所示的路径,则原始index.php也会起作用:

Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array(
    'namespaces' => array(
        'Garvey' => dirname(__DIR__) . '/vendor/Garvey',
    )
)));
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,只是对这个特定问题的一点修改:''Garvey'=> dirname(__ DIR__)."/供应商/加维/库/ Garvey'` (2认同)

Ser*_*nov 11

或者你可以在Module.php中使用defime方法

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',
            )
        )
    );
}
Run Code Online (Sandbox Code Playgroud)

但我不推荐它.由于ZF2的目的都是以自动加载速度为中心,因此最好的方法是使用class_map样式来加载类.它最终会更快,但需要额外的工作.您可以在class_map文件中注册每个类.

您可以在库的根目录中创建class_map.php并放在那里

<?php
return array(
    'Garvey\Db\Table\AbstractTable' => __DIR__ . '/Garvey/Db/Table/AbstractTable.php', 
);
Run Code Online (Sandbox Code Playgroud)

并添加尽可能多的类.在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__,
            )
        )
    );
}
Run Code Online (Sandbox Code Playgroud)