4

希望你们中的一些人能帮我解决这个问题。

我在一个使用 Codeigniter 2 和 Doctrine 2 的项目中工作,一切正常,但我有一些我想解决的“理智”问题。

我现在遇到的主要问题是持久化实体。在普通的 MVC 中,持久性应该在模型中,但是现在我只有实体和存储库,而且我没有所谓的“模型”,我将所有这些代码放在控制器中,使它们变得巨大而令人生畏:(

我在一些地方读到过,最好的方法是在控制器和实体之间有一个“服务”层,但是由于经典的 MVC 模式很难,我还没有在 Codeigniter 中找到一个好的方法。

所以我就如何解决这个问题寻求一些建议。你们中有人遇到同样的问题吗?

4

2 回答 2

1

我找到了解决我的问题的方法,希望它对你们中的一些人有用。

我正在使用 Joel 的 Codeigniter 2 和 Doctrine 2 的 Verhagen 集成,您可以阅读他的文章了解更多详细信息“ http://www.joelverhagen.com/blog/2011/05/setting-up-codeigniter-2-with-doctrine -2-正确的方式/

简而言之,我正在做的是使用 Codeigniter 的模型即服务层。这是我能找到的最干净的方法,主要是因为所有“接线”都已经由 Codeigniter 完成,所以我不需要做任何其他事情:D。

我不得不对 Joel 实现的文件夹结构进行一些修改,这样我就可以使用 CI 的模型并仍然使用他的 Doctrine 代码。所以我将所有内容从“models”文件夹中移动到一个名为“entities”的新文件夹中(我知道这可能不是最好的名称,但它可以工作:P)。然后我更改了对新文件夹的所有引用并检查了一切是否正常。

就是这样,现在我有了我的“服务层”workign,我的代码更干净了。

如果你们中的一些人需要这方面的帮助,请随时问我。

于 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 回答