【问题标题】:PHP MVC structure where to put own classesPHP MVC结构放置自己的类
【发布时间】:2015-04-18 10:48:54
【问题描述】:

我刚刚开始研究 MVC 模式。 我的问题是:

我应该把我的其他类文件(数据库、用户、记录器、邮件程序等)放在哪里?我是否应该为他们创建一个新目录,例如libs?

我应该在model 函数中实例化Controller 中的类吗?

<?php

class Controller {
    protected function model($model) {
        require_once('../app/models/'. $model .'.php');

        return new $model();
    }

    protected function view($view, $data = []) {
        require_once '../app/views/'. $view .'.php';
    }
}

【问题讨论】:

  • 看来你放弃了学习 MVC 而决定学习 Laravel。好吧 .. 无论支付什么费用,我想,如果您有重新开始学习 MVC 的冲动,您可以阅读此处列出的讲座和其他材料:stackoverflow.com/a/16356866/727208

标签: php model-view-controller structure


【解决方案1】:

我应该把我的其他类文件(数据库、用户、记录器、邮件程序等)放在哪里?我是否应该为他们创建一个新目录,例如libs?

将它们放在单独的文件中,因为它们都提供不同的功能应该没问题。您的目录命名没有区别 - 只要它符合您的项目或一般的命名约定(可能,甚至更好)。

我应该在模型函数中实例化Controller中的类吗?

不。据我所知,流程可能类似于:

  1. index 文件接收请求并启动新的bootstrap 实例
  2. bootstrap 设置 throwable 处理程序和路由器
  3. router 然后根据请求方法和通过匹配一组路由提供的 uri 调用相应的方法
  4. 匹配的route初始化MVC三元组的所有组件和可调用方法。组件(Model 层、View 层和Controller 层)被传递给router 调用的方法。在我的例子中,我调用类FrontController,调用方法init
  5. 基本上,init 是实际制作 MVC 三元组的地方。 Model 层负责业务逻辑、持久化等。需要注意的是,Model 不是单个文件或类(ViewController 相同)。 View 层和Controller 层都参考Model 层来执行相应的操作。 View 层的任务是管理输出,例如,决定输出是否将具有application/jsontext/plainContent-Type,或者要渲染哪个Template。此外,Views 不是用于显示数据的Templates。这里注意,Views直接从Model层询问必要的数据;与Controller 层没有任何交互。最后,Controller 层会在需要交互时介入,例如,用户提交表单,相应的Controller 过滤输入并从Model 层调用方法.

【讨论】:

  • 投反对票是因为: 1. 在构造函数中提倡计算; 2. 使用静态类;3 控制器不处理通信(MVVM 中的视图模型处理); 4. 你关于在上帝对象中制作控制器的建议真的很令人不安
【解决方案2】:

由于 MVC 包含三个主要部分,我建议(并注意到市场上几乎所有框架都这样做)为这三个组件中的每一个创建一个目录,并将类放在适当的目录中。

关于其他组件,Database 是一个实用程序,可以放在例如lib 目录中,User 是一个模型,可以转到model 文件夹,Logger/@ 987654326@也可以到lib文件夹下。这些只是示例,无需严格遵循。

至于实例化,每个Controller 可以定义它所依赖的modelslibraries 列表,并让MVC 框架处理这些对象的初始化。你会以这种方式遵循dependency injection 模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2019-12-30
    • 2015-05-26
    相关资源
    最近更新 更多