【问题标题】:Organizing a PHP project组织一个 PHP 项目
【发布时间】:2011-06-15 11:31:40
【问题描述】:

它是什么

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

  • 核心/
    • 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. 获取视图并将页面呈现给客户端。

仅供参考:对应

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

  • 控制器 Controller_Products::list()core/controllers/Controller_Products.php
  • 模型Model_Products::list()core/models/Model_Products.php
  • 查看 core/views/Model_Products_list.php

面临的问题

实际上,我对这种结构感到有些不舒服。不知道,它似乎远非可扩展、可模块化......

  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 会更好?

如果有不清楚的地方,请随时提问。
谢谢。

【问题讨论】:

  • 你有没有考虑过使用像Zend这样的MVC框架。
  • 如果可能的话,也许你应该把问题分成几个问题。
  • 我同意@Ozair Kafray,没有必要重新发明轮子。 Zend Framework 或 Symphony 都是很好的模块化 MVC 框架,已经为您解决了这些问题。
  • @Ozair Kafray @Adam Pointer 我确实在考虑使用框架,但我想先得到一些建议。 @Michael 好吧,不能真正拆分它,因为所有部分都是相关的,例如,这并不是说我在谈论一个流行的框架。 @yes123 抱歉,没有这么深的问题。
  • @seriousdev:查看以下 2 个 Stackoverflow 线程:http://stackoverflow.com/questions/694929/whats-your-no-framework-php-frameworkhttp://stackoverflow.com/questions/75882/what-in-your-mind-is-the-best-php-mvc-framework

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多