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

あなたが見つけた解決策は、マシューが名前空間ごと/プレフィックスごとの自動読み込みについてビデオで言及したものと似ています。ZendSkeletonApplicationのコード構造に従って、そのコードは/init_autoloader.phpファイル内ではなくファイル内に配置され/public/index.phpます。

于 2012-10-09T11:53:53.153 に答える
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 に答える
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 に答える