2


2

Zend Frameworkを利用した電子商取引プラットフォームを開発しています。 同じコードベースを使用して、アプリケーションのいくつかのインスタンスを起動して実行しています。 構成設定は、さまざまな店舗を区別するために使用されます。

私たちが直面している課題は、上で概説した構成アプローチを使用するのではなく、一般的なプラットフォームを現状のままにして拡張したいということです。 一般的なプラットフォーム(またはベースアプリケーション)には、共通のコントローラ、モデル、およびビューが含まれている必要があります。 特定のインスタンスに固有のカスタム機能(コントローラ、モデル、およびビュー)は、別の拡張機能に含まれ、コアプラットフォームにプラグインされた方法で含まれる必要があります。 このようにして、共有コードベースはきれいに保たれ、肥大化することはありません。

誰かがそのようなアプローチで何か経験がありますか? ベストプラクティスはありますか?

どんなポインタでも大歓迎です!

3 Answer


2


私は私の代理店で最近同じ問題を見てきました、そして私が現在テストしている解決策は以下のアプリフォルダー構造を含みます:

app/
    default/
            controllers/
            models, etc
    ecommerce/
              controllers/
              models, etc
lib/
    S24/
        ComponentCode.php
modules/
        ecommerce/
                  admin/
                        controllers/
                        models, etc
                  default/
                          controllers/
                          models, etc
data, public web, temp, other ZF folders

一般的なコンポーネントコードは「+ lib 」に保存され、モジュラーアプリケーションは「 modules 」に保存され、個々のクライアントWebサイトコードは「 app +」に保存されます。

`+ lib / S24 `と ` modules / ecommerce +`フォルダーは各プロジェクトで共通で同じものになります(これらのフォルダーはSVNの外部にあります)。

`+ app `はモジュールディレクトリなので、 ` default `および ` ecommerce `フォルダーはZF内にモジュールを作成します。 ` app / default `はデフォルト(つまり、 モジュールなし)コントローラ。 ` app / ecommerce `には、 ` modules / ecommerce / default / controllers +`内のコントローラーを単純に拡張するコントローラーのセットが含まれます。

必要に応じて、 `+ app / ecommerce / controllers +`の機能を拡張したり、新しい機能を追加したりできます。

モジュール管理システムを同じに保ち、複数の管理システム(www.domain.com/admin/ecommerceやwww.domain.com/admin/userなどのURL)をサポートするため、モジュール管理システムを直接提供します。 `+ modules `フォルダー。 その後、カスタム管理ページを「 app / admin / controllers +」に追加できます。

// Add Controller folder
$front->addControllerDirectory('/path/to/modules/ecommerce/admin/controllers', 'ecommerceAdmin');

// Add route
$router->addRoute(
    'ecommerceAdmin',
    new Zend_Controller_Router_Route('admin/ecommerce/:controller/:action',
                                     array('module' => 'ecommerceAdmin',
                                           'controller' => 'index',
                                           'action' => 'index'))
);

私が言っているように私は現在これをテストしていますが、私はそれがあなた自身のシステムのためのいくつかのアイデアを与えることを願っています。 これが完全に安定したら、そのトピックに関するブログ記事を書きたいと思います。


0


私たちはあなたのプラットフォームに似たサービスアプリケーションとしてソフトウェアを運営しています、そして私たちの場合、すべてのインスタンスデータはインスタンス自身のデータベースに格納されています。

カスタム機能(コード)の処理に関しては、それが完全にオーダーメイドであれば、カスタムコードをモジュール化するか、顧客の一意の識別子によって参照されるコンテナにパッケージ化してオンデマンドでコードをロードするのが合理的でしょう。 これはモジュールにとっては単純ですが、個々のコントローラやアクションさえも欲しいなら明らかにもっと複雑です。

いくつかのシステムは機能性が注入されることを可能にするそれら自身のイベント/コールバックシステムを構築します、これは公共のAPIのためにより一般的ですが。


0


編集:私は様々なコメントに気づいていなかった。 そのため、カスタマイズされたコードは単一のパッケージには含まれず、機能が追加され、オーバーライドされません。

ここでの問題は、コードが何もオーバーライドしないで、機能を追加するということです。 おそらくあなたは、クラス名を含む設定ファイルを読む、何らかの形のプラグインシステムを見ているでしょう。 これらのクラスは各プラグインについての情報を提供します(すなわち UIがタブを使用している場合は、タブの名前のプロパティがあります。

実装ごとにどのような機能が異なるかは、実際には異なります。 高レベルの解決策を提供するためには、より多くの情報があると便利です。

私がPHPの自動ロードを使う方法( OOPのしくみを参照)異なるファイルに格納されているクラスを「含める」ように管理する])クラス名に応じて別々のフォルダを作成します。 これは他の実装からコードを分離するのに役立つかもしれません。