【问题标题】:How to set up abstraction layer and modules如何设置抽象层和模块
【发布时间】:2012-06-10 19:02:20
【问题描述】:

我遇到了一个我无法解决的问题。我正在用 php 开发自己的 web 应用程序框架。我知道那里有很多好东西,但我喜欢玩这个,而且我不会将它用于任何敏感的制作内容。

所以问题来了:我有一个抽象基类,其中包含一些我希望所有模型都继承的函数。还有一个抽象的基本控制器,它用基本操作的功能扩展了基本模型。 目前,所有创建的模型都扩展了基本模型,所有控制器都扩展了基本控制器。因此,所有控制器也通过 Base 控制器从 Base 模型继承。 但是现在我无法从模型控制器访问模型属性,因为模型扩展了基本控制器,而且模型扩展基本控制器似乎很奇怪。

我应该如何设置它以便我可以从它们各自的控制器访问模型属性?

谢谢!

【问题讨论】:

  • 为什么需要 BaseController 扩展 BaseModel ?你用这种方法解决什么问题?
  • BaseModel 定义了 __set 和 __get 等函数。 BaseController 具有诸如获取数据以发送到视图之类的操作。我想所有函数都可以进入一个 BaseClass,但由于 BaseController 中的内容是数据操作,而 BaseClass 中的内容涉及属性,因此将它们分开似乎是合乎逻辑的。
  • 我不明白为什么控制器需要魔法 getter 和 setter。此外,您应该避免使用它们。魔术 getter/setter 带有性能损失。其他问题是 - 你将如何强制 $something->email 不能 包含无效的电子邮件地址?
  • 模型中设置了验证条件,控制器检查是否有条件,然后验证数据。如果失败,则中止操作。

标签: php model-view-controller frameworks


【解决方案1】:
  • 首先,在我看来,您对什么是 Model .. 以及 .. 的理解很糟糕。也许this comment 会有所帮助。

  • 另一件事,这似乎是错误的,这整个画面是这样的:

    所以,所有的控制器也都通过 Base 控制器继承自 Base 模型。

    您应该避免深度继承。而且由于 ControllersWhat-You-Call-Models 具有完全不同的职责,因此两者都不应该继承任何东西。你必须明白extendsis-a的同义词。

    如果你写class Admin extends User,那么这意味着每个管理员都是用户。这也意味着,当您写 class User extends Table 时,它是错误的(.. 有点侮辱)。

  • Controller 不应从 what-you-call-model 读取属性(假设您不是 implementing MVP 模式)。这部分应该由 View 完成,因为那将是负责表示逻辑的部分。

    为此,您 what-you-call-model 应该有特定的 getter。你永远不应该直接暴露属性(例如,设置它们public),因为那样你会破坏封装。

.. 我的 3 美分

【讨论】:

  • 好吧,我猜我对 MVC 的解释并不完全正确。正如我从您发布的链接中了解到的那样,MVC 实际上并不真正存在于 Web 开发中。我的模型保存数据库表的映射并保存从数据库加载的数据,控制器保存数据的所有操作,视图处理模板。
  • @Abel ,您是如何获得未使用 MVC 的印象的?我刚刚写到classical MVC(定义在 80 年代)不是网络友好的。这就是为什么存在 4 种不同的类似 MVC 的模式,它们被使用
  • 嗯,我只是指这个说法:“秘密是:用 php 编写 MVC 是不可能的。”我想,在我的示例中,我正在尝试实现 Model2 MVC。
猜你喜欢
  • 1970-01-01
  • 2015-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 2012-11-22
  • 2013-04-26
相关资源
最近更新 更多