3

我必须使用 Codeigniter 和 Doctrine 创建一个 php 项目。我与 j2ee 合作了很多,我想在我的 php 项目中使用相同的项目结构。

所以这就是我的想法:

  1. 控制器,例如(用户控制器)
  2. 服务又名模型接口 (UserService)
  3. 服务实现,例如(UserServiceImpl 实现 UserService)
  4. 道接口(UserDao)
  5. Dao 接口实现,例如(DoctrineUserDao)
  6. 教义实体
  7. 意见

我还没有看到在 php 项目中实现服务接口,并且总是缺少 dao 设计模式。php mvc 项目中的接口和 DAO 是多余的吗?

还有一个问题:据我所知,Codeigniter 使用以下语法加载模型: $this->load->model('UserServiceImpl'); 我认为这有点蹩脚,我更喜欢使用带有命名空间的自动加载器,这很糟糕吗?

4

1 回答 1

1

我用 CodeIgniter 设计了一些较小的系统,现在我正在设计/构建一个大系统。我总是遵循相同的结构(我将在这里描述的那个),到目前为止它对我来说非常有效。对于我当前的项目,我们尝试使用 Doctrine 作为 ORM,但最终我决定将其从项目中排除——这与其说是帮助,不如说是负担。

(我可能对图层使用略有不同的术语,但我尽量将它们与您的术语平行放置。)

我使用的结构是:

  1. 控制器(例如 /application/controllers/UserController.php)
  2. 数据映射器 (ORM) 层(例如 /models/tables/UserTable.php)
  3. 领域对象层(例如 /models/data_models/User.php)
  4. 布局(例如 /models/layouts/default.php)
  5. 模板(视图)(例如 /application/templates/user/view-profile.php)

职责:

  • (2) Data Mapper 层包含所有 SQL,以及所有 Doctrine EntityManager 用法。它存储和检索域对象。
  • (3) 域对象表示实体(实体元数据在 Doctrine 的注释中描述,使用 Docblock Annotations 格式)。
  • (1) 控制器只做调用ORM层的逻辑,可能做一些数据或计算的重组。
  • (4) 布局层帮助我将页面的准静态框架与更动态的内容分开。查看CodeIgniter 和布局?如果你喜欢这个主意。
  • (5) 模板基本上是带有一些 PHP 片段的 HTML。

我所有包含类的文件每个文件都包含一个类,名称与文件名相同(根据http://www.php-fig.org/psr/0/),但我不使用命名空间,因为我觉得很难使其与不使用它们的 CodeIgniter 一起工作。

您可以在自动加载器中加载模型,尤其是在您从事中小型项目并且性能不重要的情况下。在这些情况下,我总是使用自动加载器加载我的所有模型。然而,在一个更大的项目中,更值得在自动加载器中加载广泛使用的模型,在控制器构造函数中加载更具体的模型,甚至在动作中加载更具体的模型。

于 2013-10-17T09:16:28.920 回答