3

ZF2 に足を踏み入れようとして、最初の問題に遭遇しました。Shanty_Mongo (MongoDb に接続するための外部ライブラリ) を使用したいモジュールについて説明します。

そのため、ライブラリの Shanty ディレクトリ全体をコピーし、新しい Model クラスを作成しました。

namespace Dummy\Model;

use Shanty\Mongo\Document;

class Dummy extends Shanty_Mongo_Document {
  public function setConnections( $connections ) {
    Shanty_Mongo::addConnections($connections);
  }
}

(setConnections()は、よく理解していればDIで使用されます)

Shanty_Mongo_Document が見つからないようです。余分なライブラリを指すように application.config.php に何かを追加する必要がありますか?

4

1 に答える 1

4

ライブラリShanty_Mongoは、名前空間を使用しない「古い」アンダースコアで区切られたライブラリです。ZF2 では、スタイルは同じ PSR-0 標準ですが、名前空間があります (そうShanty_MongoなりますShanty\Mongo)。ただし、たとえばクラスマップを使用して、これらの古いスタイルをうまくロードできます。次に、ZF2 プロジェクト内でアンダースコアで区切られたクラスを使用できます。

このライブラリのモジュールを作成し、そのモジュールを./vendor(「サードパーティの機能を提供するモジュール」の場合) の下に置くことをお勧めします。このモジュールでは、次のディレクトリ構造を作成できます (モジュールの名前は ShantyMongo と仮定します)。

./vendor/ShantyMongo/
    library/
    Module.php
    autoload_classmap.php
    autoload_function.php
    autoload_register.php

このライブラリは、Shanty-Mongo git リポジトリのサブモジュールです。このファイルは、 ZF2 リポジトリのディレクトリ内のautoload_classmap.phpphp スクリプトによって作成されたクラスマップです。次に、autoload_function.php は次のように単純なものにすることができます。classmap_generator.phpbin

<?php
return function ($class) {
    static $map;
    if (!$map) {
        $map = include __DIR__ . '/autoload_classmap.php';
    }

    if (!isset($map[$class])) {
        return false;
    }
    return include $map[$class];
};

そして autoload_register.php は次のようになります:

<?php
spl_autoload_register(include __DIR__ . '/autoload_function.php');

このモジュールがあることを ZF2 アプリケーションに知らせるには、module.php にShantyMongo\Moduleクラスを入力する必要があります。次のようなもので十分です。

<?php

namespace ShantyMongo;

use Zend\Module\Consumer\AutoloaderProvider;

class Module implements AutoloaderProvider
{
    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\ClassMapAutoloader' => array(
                __DIR__ . '/autoload_classmap.php',
            )
        );
    }
}

「ShantyMongo」をモジュール配列に追加すると、ZF2application.config.php内でこのサードパーティ ライブラリのオートローダーがセットアップされます。その後、次のようにモデルを使用できます。

<?php

namespace Dummy\Model;

class Dummy extends Shanty_Mongo_Document {
  public function setConnections ($connections) {
    Shanty_Mongo::addConnections($connections);
  }
}

ShantyMongo は名前空間を使用しないため、その use ステートメントはもうありません。

于 2011-12-13T09:23:22.090 に答える