私は、アプリケーションを作成します異なる顧客によって使用されます。彼らはほとんど同じことを見ることができます。しかし、一部の顧客にはいくつかの余分なボタンがあり、一部の機能は無効になっているか、または別のものがあります。
多くのif/elseステートメントまたはswitchステートメントを避けたいと思います。だから私は、一般的なモジュールと、必要に応じて異なるものを上書きまたは上書きする各顧客のための特別なモジュールを持つことができたと思った。次の理論的構造を見てください(すべてのファイルは通常のYiiファイルです)。
app
general
controllers
OrderController
InvoiceController
ShippingController
views
order
index, view, update, create, _form
invoice
index, view, update, create, _form
shipping
index, view, update, create, _form
layout
main
models
Order
Invoice
Shipping
customerA
controllers
OrderController // some action is different
customerB
views
invoice
view // some buttons should be overridden
layout
main.php // other page structure
customerC
views
order
index // table gets some additional columns
model
Order // has some more properties
customerD
// this customer exists but has nothing that must be changed
// it uses all what is in general
...
web
common
console
...
これはサウンドファイルの構造だと思います。少なくともそれは明らかで分かりやすいものです。顧客が何かを要求した場合、特定の顧客のファイルがあるかどうかを調べ、そのファイルを使用するか、一般的なモジュール(フォールバック)のファイルを使用するかどうかをアプリケーションが最初に調べるようにします。私の質問は、どうすればいいのですか?
どうすればいいですか?または、部分的にのみ可能ですか?コントローラとビューでのみ?私はビュー/コントローラ/モデルファイルには異なるアプローチが必要かもしれないと思います。私はクラスのオートローディングが適応できると思います。そして私は、ルーティング利用すると思うだろう(顧客が認証される必要がありますが、それは彼または彼女自身の顧客を使用することができます):
http://example.com/customerA/invoice/view?id=1234
は、すべてこれは構成のか、依存性注入を行うことができますか?モジュールが必要ですか、またはファイル編成で十分ですか?
(思考:オーバーライドコントローラは単純なものでしたが、私はそのビューファイルがコントローラが別のビューのパスを設定するためにオーバーライドされます場合にのみ、上書きすることができると思います。。)
は、誰もがこれを解決するためのアイデアを持っていますか?これがコントローラーとビューで動作するなら、私はうれしいでしょう。しかし、モデルも素晴らしいだろう。あるいは、他の提案や代替アプローチを持っている人はいますか?ソリューションの一部しか知りませんが、私に教えてください。
満足のいく答えが時間とともに進化するかもしれないと私は考えます。しかし、他の人にとっては良い解決策を見出すことが役に立ちます。それでは、それを試してみましょう;-) ...またはこのタスクに適した別のフレームワークですか? :-(