3

私はこれについてすでに多くのSOトピックを読みましたが、まだ適切な答えを見つけていません(または作成できていません)。

私は小さなMVCフレームワークに取り組んでおり、コントローラーから呼び出すことができるグローバルクラス/オブジェクトが必要です(モデルもそうかもしれません)。

私が取ることができるルートがいくつかあります:

  1. グローバル変数
  2. 静的クラス/レジストリ
  3. 依存性注入

インターネットは、DI が最適なルートであることに同意しているようです。私はその考えを理解したと思いますが、まだ快適ではありません. そこで、背景情報をいくつか紹介したいと思います。このプロジェクトに取り組んでいるのはおそらく私だけです。これは小さなプロジェクトであり、すべてのコントローラーがメインのコントローラーを拡張します (そのため、そこにクラスのようなライブラリを 1 つだけロードできます)。

具体的な例として、カテゴリの配列が必要です。そこで、その配列を CategoryController に入れることから始めました。しかし今、その配列をフロントビューと ProductController でも使用したいことに気付きました。明らかに、すべての CategoryController を ProductController にロードしたくはありません。この例は単純なので、その配列を何らかの構成または設定ファイルに入れることができるとも言えますが、それが例である理由です。私はおそらく、より多くの機能でそれを拡張します。

要約すると、PHP(特にMVCモデル内)では、クラス(主にコントローラー)にある種の共通クラスまたはその他の共有可能な機能へのアクセスをどのように与えることができますか.

4

2 に答える 2

2

コントローラーは「何か」(通常はフロントコントローラー) によって作成されます。そのため、コントローラーが作成されるときに、依存性注入コンテナーを注入できます。

また、構成/ブートストラップ (コントローラーが作成される前) で、コンテナーにカテゴリーを追加する必要があります。

そうすれば、すべてのコントローラーからカテゴリーにアクセスできます。

これは、依存性注入の精神に完全には適合しない単純な例であることに注意してください。最善の解決策は、(コンテナを注入するのではなく) カテゴリを直接注入することです。しかし、そのパターンを一般化すると、それは大変な作業になる可能性があります (フロント コントローラーで処理する多くの依存関係)。

解決策は、それを行うことができる依存性注入フレームワークを使用することです。

たとえば、私は注釈付きのものを注入できる DI コンテナー ( PHP-DI ) に取り組んでいますが、DI 用のライブラリは他にもいくつかあるので、選択肢があります。

于 2013-03-24T20:47:13.773 に答える
-1

私の2セント:

少し前に行った小さな自作のミニフレームワークで、Application という名前のグローバルシングルトンクラスを作成しました。どこからでもアクセスできる必要があるものはすべて、このクラスのプロパティまたはメソッドでした。

私の場合、$dbデータベース アクセス用の$userプロパティ、ユーザー データとメソッドにアクセスするための$inputプロパティ、「パワード」$_REQUESTアクセス用のプロパティなどがあります。

もちろん、さまざまなシナリオに適した他の多くのオプションがあります。このアプローチは、その機会に私にとってうまくいきました。

さて、別のコントローラーからコントローラーにアクセスしたい場合、これは本当に奇妙に聞こえます。アクセスしたいこの「もの」は、モデルクラス、ライブラリクラス、またはその他のものである必要がありますが、コントローラークラス内で「ロック」されるべきではありません。実際、コントローラーは「できるだけ薄く」する必要があり、ユーザー入力 (要求) に基づいて他のクラスから適切なメソッドを呼び出し、次に何らかの出力メソッドを呼び出して応答 (応答) を生成して送信することに重点を置く必要があります。

最後に、私はいくつかの批判や不満 (賞賛も) を読みましstaticたが、主に他の何よりも「ヘルパー」であるクラスのために、メソッドをたくさん利用しています。

于 2013-03-23T23:50:12.893 に答える