PHP MVC框架中的面向对象设计

PHP MVC框架中的面向对象设计,php,oop,model-view-controller,Php,Oop,Model View Controller,传统上,在MVC框架(如CodeIgniter或Kohana)中,我在创建不同页面时创建控制器。将有一个登录控制器,一个家庭控制器等。但是最近我学到了更多关于面向目标编程的知识,我想开始使用它。尽管框架使用类,但它与对象的原理不同 对。登录控制器是一个对象。但是我应该在哪里编写我的“用户”类呢?我是否在库中编写它们并在需要时导入它们?如果有的话,正确的做法是什么 我只是不知道如何才能做到这一点。最好将用户类编写为库,因为它不是控制器(假设),您不应该通过URL直接访问用户类。因此,如果希望类是面

传统上,在MVC框架(如CodeIgniter或Kohana)中,我在创建不同页面时创建控制器。将有一个登录控制器,一个家庭控制器等。但是最近我学到了更多关于面向目标编程的知识,我想开始使用它。尽管框架使用类,但它与对象的原理不同

对。登录控制器是一个对象。但是我应该在哪里编写我的“用户”类呢?我是否在库中编写它们并在需要时导入它们?如果有的话,正确的做法是什么


我只是不知道如何才能做到这一点。

最好将用户类编写为库,因为它不是控制器(假设),您不应该通过URL直接访问用户类。因此,如果希望类是面向对象的,最好的做法是编写一个类。如果你想拥有静态功能,也可以创建一个助手文件。

我认为它太个性化了。这取决于所构建的应用程序的类型。让我们考虑一下CodeIgniter或Kohana,但要考虑您的个人框架和个人应用程序

如果您有一个简单的登录系统,其中用户只是一个名称和一个ID,并且所有的交互都是在应用程序的其他阶段之间进行的,而不是在用户之间进行的交互,那么您的用户类只包含关于用户的信息(对数据库的简单查询可以从
用户
表中检索某些信息),可以作为帮助者

但在某些应用程序(本例中为平台)中,用户可能与其中的任何其他对象相等

例如,在构建一个类似论坛的应用程序时,您可能希望具有警告级别、信誉、各种用户操作日志等

此外,用户是一个与“主题”相同的对象,它还具有例如喜欢/不喜欢、优先级等

在本例中,您为用户构建了一个模型和一个控制器

createUser()、getUser()、getUserWarnActions()、updateUserActions()、logUserActionChange()

所有这些方法都将在一个名为UserModel的类中,该类扩展了模型主类

例如,其中UserActions是警告级别、电子邮件更改、用户名更改、声誉更改

在控制器中,您可能希望

updateWarnLevel()
=>它与
updateUserActions()
交互,告诉模型它的操作=警告级别,并根据给定值进行更新

因此,这些方法将位于一个类中,即扩展控制器主类的
UserController

但这实际上取决于您如何看待您的用户类。根据我的说法,将控制器/模型称为Warn level是一种不好的做法,因为它是另一个抽象的一部分,而不是单独的抽象

为了假设哪个是子对象还是父对象,我会尝试创建一个结构,比如db结构,然后创建模型/控制器/帮助器

如果您有以下数据库表:

  • 使用者
  • 用户声誉
  • 用户警告级别
  • 话题
  • 专题投票
  • 警告级别//包含id级别取决于级别的内容
它明确地意味着
用户
主题
将是应用程序中的模型/控制器,而
警告级别
将不会是,因为它们是单独的表,只是因为它们有一些逻辑,但它们不是父表,只是子表


如果你开始使用的框架不是直接的Rails克隆,就是受Rails体系结构影响很大,那么你并不是真正实现MVC。Ruby on Rails框架最初的目的是成为一个纯粹的快速原型框架,这意味着他们在“脚手架的祭坛”上牺牲了大多数MVC概念

基于Rails的PHP框架用模板替换全功能视图,用一些实例集合替换模型层,让“控制器”处理所有表示和应用程序逻辑

MVC设计模式的基础是业务逻辑(包含在模型层)和用户界面(由表示层管理)之间的分离,这两层分别包含不同的结构组

用户
不是模型。现代MVC中没有“模型”。相反,您的
用户
实例是模型。此外,它不应直接暴露于控制器或其他表示层结构

表示层和模型层之间的交互应由服务执行。模型层中的服务是结构,负责处理域对象和存储抽象(直接或通过和/或)之间的交互

在这种情况下,
用户
实例位于识别服务中的某个位置,用于处理用户身份验证的不同业务逻辑方面。不要将其与授权混淆。对于MVC上下文中的授权,建议使用稍微不同的方法

p.S.:如果您刚刚开始真正深入研究OOP,您可能会发现在您的研究中很有用


<>我的两分钱

你是一般地还是具体地问Ci/Kohana?我不想把它当作Cl/Kohana问题来解决。因为我认为我在其他框架中也见过类似的结构。但是你可以认为它是Cl/Kohana特定的。它不是在创建不同的页面时写更多的控制器。它主要是令状。如果操作是访问这些控制器的方法,则需要执行更多操作。换句话说,在MVC中,对象是控制器和模型。是的,是库或帮助文件。但这是最佳做法吗?考虑到这些(Cl/Kohana)框架是在
namespace Controller;

class Authentication
{
    // .... snip
    public function postLogin( $request )
    {
        $service = $this->serviceFactory->create('Recognition');
        $service->authenticate( $request->getParameter('username'),
                                $request->getParameter('password') );
    }
    // .... snip
}