しばらく前に同じ船に乗っていました。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);
....
}