希望你们中的一些人能帮我一把。
我在一个使用Codeigniter 2和Doctrine 2的项目中工作,一切都很好,但我有一些"理智"问题想解决。
我现在面临的主要问题是持久化实体。在一个正常的MVC中,持久性应该在模型中,但现在我只有实体和存储库,而没有所谓的"模型",我把所有这些代码都放在控制器中,使它们变得巨大而可怕:(
我在一些地方读到,最好的方法是在控制器和实体之间有一个"服务"层,但我在Codeigner中没有找到一个好的方法来做到这一点,因为它是经典的MVC模式。
所以我想请教一下如何解决这个问题。你们有没有遇到同样的问题?
我为我的问题找到了一个解决方案,希望它对你们中的一些人有效。
我正在使用Joel的Codeigniter 2和Doctrine 2的Verhagen集成,您可以阅读他的文章了解更多详细信息"http://www.joelverhagen.com/blog/2011/05/setting-up-codeigniter-2-with-doctrine-2-the-right-way/">
简单地说,我正在做的是使用Codeigniter的Models作为服务层。这是我能找到的最干净的方法,主要是因为所有的"布线"都已经由Codeigniter完成了,所以我不必做任何其他事情:D。
我不得不对Joel实现的文件夹结构进行一些修改,这样我就可以使用CI的模型,并且仍然使用他的条令代码。因此,我将文件夹"models"中的所有内容都移到了一个名为"entities"的新文件夹中(我知道这可能不是最好的名称,但它很有效:P)。然后,我将所有引用更改为新文件夹,并检查是否一切正常。
就是这样,现在我有了我的"服务层"工作,我的代码也更干净了。
如果你们中的一些人需要帮助,请随时询问我。
不久前曾同病相怜。最终没有使用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 AcmeAuthentication($this->db); //or use a DI container
$user = $auth->authenticate($user, $pass);
....
}