2

私はZF2を学び、アプリケーションを計画しているところです。

モジュールのいくつかのグループを持つ1つのアプリケーションが欲しいです。モジュールの各グループには、最大20以上のモジュールを含めることができます。

アプリ全体のモジュールの一意の名前を保証することはできませんが、モジュールグループ内での一意性を保証することはできます。

理想的には、ホスティングルーターを使用してモジュールグループにリクエストをルーティングします。

例: http: //admin.mysite.com/foo/ =>'Admin / Foo / Index / Index'、

http://special.mysite.com/foo/ =>'Special / Foo / Index / Index'

アイデア#1

モジュールグループごとに異なるmodule_pathを使用し、モジュールグループの周りのモジュールパスに名前空間を付けて、モジュールのクラスの一意性を判断したいと考えていました。ただし、module_autoloaderに送信されるモジュールは、渡される文字列の最初の部分にのみ注意を払うようです。

例えば

array('modules' => array(
 'Admin\Admin','Admin\Bob','Admin\Users'
));

これは私が理解していない奇妙な振る舞いになります:

  • 3つすべてが正しいモジュールコントローラーを指しますが、独自のビューではなく、Admin \ Admin(モジュールリストの最初にある)のビューをロードします。
  • IE / users、Admin \ Users \ IndexControllerをロードしますが、ビュースクリプトAdmin \ Admin \ view \ admin \ Index \ index.phtml

templateInjecterにいくつかの小さな変更を加えることでこれを修正できましたが、面倒なようです。

アイデア#2

モジュール名をサブディレクトリの前に付けるだけです。

namespace AdminAdmin\Controller,
class  IndexController {}

考え

  • 名前空間はクラスプレフィックスよりも優先されます
  • モジュールごとにハードコードされたルートを使用する代わりに、これを可能な限り自動化しようとしています
  • 共通のCookiehost/memcacheやdbなどを介して認証用のモジュールを共有する複数のアプリケーションを使用することは理にかなっています...
  • モジュールコントローラーなどのtreeRouteStack内のホスティングタイプルートを使用して、各モジュールを特定のサブドメインにルーティングします。

質問:

  • この状況または同様の状況に対する彼らのベストプラクティスはありますか、またその理由は何ですか?
4

1 に答える 1

5

あなたの質問の私の解釈は、あなたが本当に2つの質問をしているということです:

(1)名前空間モジュール

これは、ZF2でネイティブに可能です。ZF2のモジュールは基本的に単なるPHP名前空間であるため、という名前のモジュールFoo\Barは完全に受け入れられ、デフォルトでは、モジュールローダーはそのモジュールクラスを検索しmodule/Foo/Barますvendor/Foo/Bar

たとえば、モジュールAnvilを作​​成し、名前空間Acmeの下に作成する場合は、ディレクトリを作成しmodule/Acme/Anvil、その中にファイルを作成しModule.phpます。

<?php
namespace Acme\Anvil;

class Module
{
    /* module class code goes here */
}

アプリケーションでは、キーに次のconfig/application.config.phpように追加Acme\Anvilします。modules

return array(
    'modules' => array(
        'Application',
        'Acme\Anvil',
    ),
    // Remaining bits of config array are unchanged
);

(2)モジュールを動的にロードする

採用できるアプローチの1つは、サイトのブートストラップindex.phpを変更して、ホスト名に基づいてオンザフライで構成を変更することです。たとえば、ZendSkeletonApplicationapplication.config.phpを使用して、次のようにファイルを設定します。

<?php
return array(
    'modules' => array(
        'Application',
        // Other modules common to all sites go here
    ),
    'sites' => array(
        'site-one.mydomain.com' => array(
            'modules' => array(
                'ModuleOne',
                'ModuleTwo',
            ),
        ),
        'site-two.mydomain.com' => array(
            'modules' => array(
                'ModuleThree',
            ),
        ),
    ),
    // Remaining bits of config array are unchanged
);

これを機能させるために、public/index.phpロード元の構成配列をインターセプトしてキーconfig/application.config.phpを再構成するように少し変更します。modules

// Pick host out of request
$hostname = $_SERVER['HTTP_HOST'];

// Load application configuration
$applicationConfig = require 'config/application.config.php';

// Merge site-specific modules into loaded modules array
$applicationConfig['modules'] = array_merge(
    $applicationConfig['modules'],
    $applicationConfig['sites'][$hostname]['modules']
);

// Run the application!
Zend\Mvc\Application::init($applicationConfig)->run();

このアプローチは、特定のホスト名に対してロードされるモジュールを変更する簡単な方法を提供しますが、サイト固有の構成ファイルの自動ロードおよびサイト固有のモジュールディレクトリも可能にするように簡単に拡張できます。

于 2012-10-11T12:59:31.923 に答える