不久前在同一条船上。最终没有使用 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);
....
}