Codeigniter 2中的服务层与Doctrine 2

时间:2012-10-11 17:39:21

标签: php codeigniter doctrine doctrine-orm codeigniter-2

希望你们中的一些人能够帮助我。

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

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

我已经在一些地方读过,最好的方法是在Controller和实体之间有一个“服务”层,但我没有找到一个很好的方法在Codeigniter中做这个,因为很难经典MVC模式。

所以即时通讯要求提供一些如何解决这个问题的建议。 你们中的任何人都有同样的问题吗?

2 个答案:

答案 0 :(得分:1)

我为我的问题找到了一个解决方案,希望它适用于你们中的一些人。

我正在使用Joel的Verhagen整合Codeigniter 2和Doctrine 2,你可以阅读他的文章了解更多细节“http://www.joelverhagen.com/blog/2011/05/setting-up-codeigniter-2-with-doctrine-2-the-right-way/

简单来说,我正在做的是使用Codeigniter的模型作为服务层。 这是我能找到的最干净的方法,主要是因为Codeigniter已经完成了所有“布线”,所以我没有做任何其他事情:D。

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

就是这样,现在我的“服务层”工作了,我的代码更加清晰。

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

答案 1 :(得分: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容器向构造函数提供数据库访问。

例如,在我的auth / login controller操作中,我可能有

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

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

   ....
}