4

あなたの何人かが私にこれを手伝ってくれることを願っています。

Codeigniter 2 と Doctrine 2 を使用するプロジェクトで作業しています。すべて正常に動作していますが、修正したい「正気」の問題がいくつかあります。

私が今抱えている主な問題は、エンティティを永続化することです。通常の MVC では、永続性はモデルにあるはずですが、エンティティとリポジトリしかなく、いわゆる「モデル」がないため、このコードをすべてコントローラーに配置して、それらを巨大で威圧的にしています:(

これに対する最良のアプローチは、コントローラーとエンティティの間に「サービス」レイヤーを配置することであるといくつかの場所で読んだことがありますが、古典的な MVC パターンが難しいため、Codeigniter でこれを行う良い方法が見つかりませんでした。

それで、これにアプローチする方法についてアドバイスを求めています。みなさん、同じように悩んでいる方はいませんか?

4

2 に答える 2

1

私は私の問題の解決策を見つけました、それがあなたの何人かのために働くことを願っています。

JoelのCodeigniter2とDoctrine2のVerhagen統合を使用しています。詳細については、彼の記事をご覧ください。 " http://www.joelverhagen.com/blog/2011/05/setting-up-codeigniter-2-with-doctrine -2-the-right-way / "

簡単に言えば、私が行っているのは、Codeigniterのモデルをサービスレイヤーとして使用することです。これは私が見つけた中で最もクリーンなアプローチでした。主な理由は、すべての「配線」がすでにCodeigniterによって行われているため、他に何もする必要がなかったからです:D。

Joelの実装のフォルダー構造にいくつかの変更を加える必要がありました。そうすれば、CIのモデルを使用しながら、彼のDoctrineコードを使用できます。そこで、すべてを「models」フォルダー内から「entities」という新しいフォルダーに移動しました(これは最良の名前ではないかもしれませんが、機能します:P)。次に、新しいフォルダーへのすべての参照を変更し、すべてが機能することを確認しました。

これで、「サービスレイヤー」が機能し、コードがよりクリーンになりました。

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-10-31T18:28:23.650 に答える
0

しばらく前に同じ船に乗っていました。DoctrineのORMを使用しないことになりましたが、基本的にあなたは正しいです.Doctrineのエンティティとリポジトリを介して直接モデル化されていないものには「サービスレイヤー」が必要です。

これを行う方法は、プロジェクト コード用に /application/ に名前空間付きのフォルダーを作成することです。次に、Doctrine Common のクラス ローダーを使用して、そのフォルダーを名前空間として認識しました。たとえば、/application/Acme/Authentication.php には以下が含まれます。

namespace Acme;
class Authentication {
   //Do Doctrine queries in various methods here
}

Doctrine のクラスローダーは内部で SPL (spl_autoload_register など) を使用します。つまり、PHP 5.3 の名前空間を完全に使用できるということです。その後、このサービス層内のドクトリン dbal にアクセスするための依存性注入のすべての楽しい試練と苦難があります。コントローラーは、この「サービスレイヤー」を直接使用します。私が言ったように、私の場合、Doctrine の ORM を使用しないことに決めたので、「サービス層」内で CodeIgniters ActiveRecord データベース クラスを使用しています。$this->CI =& get_instance() を使用するのではなく ... DI コンテナーを使用してコンストラクターへのデータベース アクセスを提供しています。

たとえば、私の認証/ログインコントローラーアクションでは、

function login() {
   $user = $_POST['u'];
   $pass = $_POST['p'];

   $auth = new Acme\Authentication($this->db); //or use a DI container
   $user = $auth->authenticate($user, $pass);

   ....
}
于 2012-10-25T20:10:18.907 に答える