8

Zend Framework 2を小さなプロジェクトに使用して、理解を深めたいと思います。私はさまざまなブログ記事、ドキュメント、そしてもちろんAkrabat(Rob Allen)による素晴らしいチュートリアルを経験してきました。

しかし、私のすべての読書で、ZendFramework2が期待するモジュールの正しいまたは優先されるディレクトリ構造についての説明に出くわすことはありません。

Akrabatチュートリアルでは、 RobAllenのサンプルモジュールは単一のモデルとコントローラーを使用しています。彼が選んだディレクトリ構造は次のとおりです。

/module
    /Album
        /config
        /src
            /Album
                /Controller
                /Form
                /Model
        /view
            /album
                /album

これはすべて問題ありませんが、複数のページ/セクションがあるサイトで予想されるように、モジュールに複数のコントローラーとモデルがある場合はどうなりますか?すべてのコントローラーを/src/ Album / Controllerディレクトリーに配置しますか、それとも、追加のモデルおよび関連するコントローラーとビューごとに/ src / xxx /ディレクトリーの別のセットを作成しますか?

/ viewディレクトリで、さまざまなコントローラが使用するビューのセットごとにサブディレクトリに分割しますか?

私にとっての混乱は、Robの例では、彼のメインのコントローラー/モデルがモジュールと同じ名前であるという事実から来ていると思います。そのため、彼のアルバムモジュールにはディレクトリがあり、モデル、コントローラー、ビュー用のアルバムディレクトリがさらにあります。彼のモジュールの名前をAlbumからたとえばMyModuleに変更すると、ディレクトリ構造は次のようになります。

/module
    /MyModule
        /config
        /src
            /Album
                /Controller
                /Form
                /Model
        /view
            /MyModule
                /album

その場合、追加のモデル、Artist、および関連するコントローラーが次のように編成されます。

/module
    /MyModule
        /config
        /src
            /Album
                /Controller
                /Form
                /Model
            /Artist
                /Controller
                /Form
                /Model
        /view
            /MyModule
                /album
                /artist

上記でない場合、それはどのような構造になりますか?

もちろん、これはすべて、ZF2が厳密な構造を期待していることを前提としています。そうでない場合は、明らかに私はそれを私が望むように整理することができます。

4

1 に答える 1

15

最後の質問にすばやく答えるために-ZF2は実際にディレクトリ構造を気にしません。または、私はむしろ言うべきです-それは事前定義された構造を持っていません。これが、オートローダー構成とクラスマップを備えている理由です(使用するアプローチによって異なります)。

'default'オートローダー(Module.phpを参照)は、ほとんどの例で見つけることができますが、ModuleNameクラスが次の./src/ModuleNameディレクトリにあることを前提としています。

// ./modules/ModuleName/Module.php
public function getAutoloaderConfig()
{
    return array(
        'Zend\Loader\StandardAutoloader' => array(
            'namespaces' => array(
                __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
            ),
        ),
    );
}

__NAMESPACE__それがそれらの部分の意味であることをあなたは知っていると思います。

したがって、というモジュールがある場合Cat、そのクラスはにあると予想されます./modules/Cat/src/Cat

次に、アプリケーションにいくつかの新しい機能を追加することにした場合は、という別のモジュールを追加しDog、そのクラスファイルをに配置します./Dog/src/Dog

しかし、それは決してあなたがこのようにしなければならないという意味ではありません。また、動物に関連するすべてのクラスを、たとえばと呼ばれる1つのモジュールに配置することもできますAnimals。オートローダーを次のように変更する必要があります。

// ./modules/Animals/Module.php
public function getAutoloaderConfig()
{
    return array(
        'Zend\Loader\StandardAutoloader' => array(
            'namespaces' => array(
                'Cat' => __DIR__ . '/src/Cat',
                'Dog' => __DIR__ . '/src/Dog',
            ),
        ),
    );
}

...そしてクラスをとのようなファイルに配置し./modules/Animal/src/Cat/Persian.phpます./modules/Animal/src/Dog/Collie.php

ただし、モジュールを、他のモジュールについて具体的なことを何も知らない別個のエンティティとして考えることをお勧めします。「実際の」例として、フロントエンド(html、cssなど)とAPI機能を備えたアプリケーションがあります。

私は3つのモジュールを持っています:

  • Application-データベース構成、dbテーブルクラス、マッパー、モデル、認証クラスなどが含まれます。基本的に、他のモジュールが必要とする可能性のあるすべてのものが含まれます。
  • Api-特定の形式のリクエストを期待し、JSONなどとして出力するコントローラーがあります(つまり、ビューは必要ありません)。このモジュールのクラスは、まだすべてのデータベース機能が必要なため、アプリケーションモジュールのクラスを使用していますが、すべてを分離することで、アプリケーション全体のロジックをAPIロジックから分離できます。私はこのモジュールを私が望んでいたものから引き裂くことができました、そしてそれは他に何も壊しませんでした。
  • Website-ページのレンダリングのみを担当するモジュール。繰り返しになりますが、データベースからデータをレンダリングしてユーザーが編集できるようにしたいので、アプリケーションのクラスを使用しますが、Apiも必要とするため、このモジュールだけの機能は必要ありません。

./config/application.config.phpはそれらをこの順序でロードします:

return array(
    'modules' => array(
        'Application',
        'Api',
        'Website',
    ),
    // all other entries
);

これは、他のすべてのモジュールからApplicationクラスにアクセスできることを意味します。何らかの理由でAPIを無効にしたい場合は、Apiディレクトリを削除するだけで、フロントエンドは引き続き機能します。

お役に立てれば!:)

TL;DRオートローダーを正しく構成することを忘れないでください。ファイルは任意の方法で構造化できます。

于 2012-10-09T18:29:35.113 に答える