组织PHP项目

ser*_*dev 8 php model-view-controller directory-structure

这是什么

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

  • 核心/
    • controllers/ (包含应用程序使用的控制器)
    • models/ (包含应用程序使用的模型)
    • views/ (包含应用程序使用的视图)
    • base_controller.php (控制器每隔一个扩展)
    • base_model.php (模型每隔一个扩展)
  • 供应商/
    • phprouter/(一个简单的路由器类)
    • 疙瘩/ (一个简单的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. 获取视图并将页面呈现给客户端.

仅供参考:对应

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

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

面临的问题

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

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

如果事情不明确,请随意提问.
谢谢.

OZ_*_*OZ_ 2

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