【问题标题】:Autoload custom library in Zend Framework 2.0Zend Framework 2.0 中的自动加载自定义库
【发布时间】:2011-12-19 09:10:20
【问题描述】:

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

提前谢谢你。

【问题讨论】:

  • 什么?这是错误的看manual
  • 它是 Zend Framework 2. Beta1。
  • 为什么要使用旧版本...(2分钟)

标签: php zend-framework autoload zend-framework2


【解决方案1】:

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

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

【讨论】:

  • 不错的答案,只是对这个特定问题的一点修正:'Garvey' =&gt; dirname(__DIR__) . '/vendor/Garvey/library/Garvey'
  • plutov,你不应该需要:require_once 'vendor/ZendFramework/library/Zend/Loader/AutoloaderFactory.php';
【解决方案2】:

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

【讨论】:

  • 在我看来这是最好的答案。使用类映射是加载类的一种快速(如果不是最快)的方法,因此 Zend 推荐。它也很清晰,易于追溯。很好地清除了这个方法,谢谢!
【解决方案3】:

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 文件。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 嗯有点令人沮丧。你可能是新人,但我更新!上面的去哪儿了?我在想 public/index.php
    • 实际上正确的方法是为此使用一个模块(仅向应用程序添加一个自动加载器)。
    • 你说的不对。模块 - 是应用程序的一部分。供应商 - 是不同应用程序的一部分。
    【解决方案5】:

    快速浏览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',
            ),
        ),
    );
    

    【讨论】:

    • 发布链接返回404
    猜你喜欢
    • 1970-01-01
    • 2013-06-21
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多