9

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

先感谢您。

4

5 回答 5

12

如果您将 'prefixes' 键更改为 'namespaces' 并指定如下路径,您的原始 index.php 也将起作用:

Zend\Loader\AutoloaderFactory::factory(array('Zend\Loader\StandardAutoloader' => array(
    'namespaces' => array(
        'Garvey' => dirname(__DIR__) . '/vendor/Garvey',
    )
)));
于 2012-02-22T20:03:20.873 回答
11

或者你可以在 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__,
            )
        )
    );
}
于 2012-06-11T02:43:40.323 回答
3

Matthew Weier O'Phinney 在此视频中解释说,现在有 3 种自动加载方法:

  • ZF1 风格的 include_path 自动加载器(旧的 zf1 方法,不推荐
  • 每个命名空间/前缀自动加载(新的 zf2 方法,更好
  • 类映射自动加载推荐和最快

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

您找到的解决方案类似于 Matthew 在视频中提到的按名称空间/前缀自动加载的解决方案。遵循ZendSkeletonApplication中的代码结构,该代码将放在/init_autoloader.php文件中,而不是在/public/index.php文件中。

于 2012-10-09T11:53:53.153 回答
2

我找到了答案。把它放在你的 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();
于 2011-12-19T09:16:20.837 回答
2

快速浏览一下这篇文章

现在下一步是将一些代码添加到我们的自定义库中。

首先打开一个文件./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',
        ),
    ),
);
于 2012-10-22T00:47:25.597 回答