组织PHP项目

时间:2011-06-15 11:31:41

标签: php model-view-controller directory-structure

它是什么

这是我到目前为止所做的:

  • 芯/
    • controllers / (包含应用使用的控制器)
    • models / (包含应用使用的模型)
    • views / (包含应用使用的视图)
    • base_controller.php (控制器每隔一段延伸)
    • base_model.php (所有其他扩展模型)
  • 供应商/
    • phprouter / (一个简单的路由器类)
    • pimple / (一个简单的DI容器类)
  • configuration.php (包含所有应用配置)
  • index.php (包括配置,供应商,基本型号,基本控制器,设置DI容器并路由请求)

请参阅此处的代码:http://pastebin.com/pxUpUvv6
请注意,给定的代码只是一个示例,因此控制器,模型,视图尚未到位。此外,它可能是错误的 - 因为未经测试 - 但现在无关紧要。

请求流程

  1. 客户端请求 index.php
  2. 包括配置,供应商,基本控制器,基本型号。
  3. DI容器和依赖项已初始化,我们现在可以将它们注入任何位置。
  4. 我们将控制器映射到URL,路由器完成其工作。
  5. 获取控制器(尽管这不在示例代码中,如上所述)。
    • 我们做了一些事情。
    • 然后该方法调用::call_model(),其中包含 core / models / 中的相应模型,然后从相应的模型类中调用我们使用的相同方法。
  6. 获取模型。
    • 更多东西。
    • 模型然后调用::call_view()',其中包含来自 core / views / 的相应视图。
  7. 获取视图并将页面呈现给客户端。
  8. 仅供参考:对应

    对应的控制器,模型,视图示例:

    • 控制器Controller_Products::list()位于核心/控制器/ Controller_Products.php
    • Model_Products::list()模型设为核心/模型/ Model_Products.php
    • 查看 core / views / Model_Products_list.php

    面临的问题

    实际上,我觉得这种结构有点不舒服。 Dunno,它似乎远非可扩展,可模糊......

    1. 基本的文件夹结构 - 根core{, /controllers, /models/, /views}vendors在根看起来对你好吗?
    2. 我觉得我应该在 index.php 之外得到__autoload(),这对我来说似乎有点太大了。如果是这样,DI容器呢?
    3. 也许如果我需要两个以上的外部库,最好不要手动将它们逐个包含在内?但是怎么样?
    4. 将所有配置放在根目录下的文件 configuration.php 中,就像老式的PHP4一样。感谢Pimple的强大功能,我可以直接将此配置嵌入其中但是,在哪里?
    5. 我认为我处理::call_model() core / base_controller.php )和::call_view() core / base_model.php )的方式是有点尴尬。你同意吗?什么是重做整个事情的简化方法?
    6. 考虑到我的所有问题,我最终会将框架用作Symfony吗?
    7. 如果不清楚,请随意提问 感谢。

1 个答案:

答案 0 :(得分:2)

  1. 是。
  2. 您可以同时使用自动加载和DI容器。 There is example,autoload如何与命名约定一起使用。我建议使用spl_autoload。
  3. 使用自动加载功能,您可以删除所有(或几乎所有)包含。
  4. 在index.php中,我猜。
  5. 是的,这是错误的方式。首先,尽量不要使用静态方法。此外,模型应该有具有描述性名称的方法,而不仅仅是“打电话给我,我会尽我所能”。这是一个更复杂的问题 - 您需要了解Controller和Model应该如何进行合作。作为变体,阅读一些书籍。控制器应调用Model的方法,以获取某些情况的数据。建模它不仅仅是控制器代码的地方。不同的控制器可以使用不同的型模型也可以使用其他模型。
  6. 回答这个问题不能客观:)