首页 文章

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

提问于
浏览
9

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

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

先感谢您 .

5 回答

  • 11

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

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

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

    但我不推荐它 . 由于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__,
                )
            )
        );
    }
    
  • 11

    Matthew Weier O'Phinney在this video解释说现在有3种自动加载方法:

    • ZF1样式的include_path自动加载器(旧的zf1方法,不推荐)

    • 每个命名空间/前缀自动加载(新的zf2方法,更好)

    • Class-map autoloading(推荐和最快)

    文档中提到了class-map generator实用程序,它将负责为您编写 /vendor/vendor_name/library/autoload_classmap.php .

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

  • 3

    我找到了答案 . 把它放在你的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();
    
  • 2

    快速浏览this post .

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

    首先打开一个文件 ./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',
            ),
        ),
    );
    

相关问题