6

1)您网站的主页在哪里适合“控制器”?我见过一些人使用“页面”控制器来处理静态页面,如关于、主页、联系方式等,但对我来说这似乎不是一个好主意。为您的主页创建一个独特的控制器会是更好的选择吗?毕竟,它可能需要访问多个模型并且不能很好地与整个模型一起使用,每个模型理论一个控制器,某些人使用。

2)如果您需要针对多种类型的用户的仪表板,那是一个仪表板控制器,它的切换代码取决于哪个用户,或者您会在每个用户的每个控制器中说一个仪表板操作?例如,admin/dashboard、account/dashboard 等。

3) 在我看来,在尝试解释控制器时,使用整个简单的 CRUD 示例就像一个魅力,但是一旦你超越了这些简单的功能,它就会崩溃并且可能导致你的控制器变得笨拙。为什么有些人选择创建登录控制器,而其他人在用户控制器中制作登录功能?我认为的一个原因是我们很多人都来自页面方法背景,很难将控制器视为“对象”或“名词”,因为页面并不总是以这种方式工作。举个例子,你到底为什么要创建一个“页面”控制器来处理实际上彼此无关的页面,只是为了有一个“容器”来适应动作。只是对我来说似乎不合适。

4)控制器是否应该更多地与用例有关,而不是与可以执行操作的“对象”有关?出于所有密集目的,您可以创建一个用户控制器来执行整个应用程序中的每个操作。或者您可以像某些人所说的那样为每个“关注区域”创建一个控制器。或者,您可以根据需要为每个视图创建一个控制器。有太多的余地,以至于很难找出一致的使用方法。

控制器可能不应该如此混乱,但出于某种原因,它们让我感到困惑。任何有用的意见将不胜感激。

4

1 回答 1

5

1) 我为我的一些 MVC 东西使用了一组简单的自制类,它将控制器名称与操作和视图名称相关联(它是前端控制器样式,类似于 Zend)。对于一个通用网站,我们假设它有一个主页、隐私政策、联系页面和一个关于页面。我真的不想为所有这些东西制作单独的控制器,所以我会把它们放在我IndexController的.actionIndex()actionPrivacy()actionContact()actionAbout()

为此,在我的 Views 目录中,我有一个与每个操作关联的模板目录。默认情况下,任何操作都会自动查找关联的模板,但您可以根据需要指定一个。所以actionPrivacy()会寻找模板文件index/privacy.phpactionContact()会寻找index/contact.php,等等。

当然,这也与 URL 相关。所以一个 url hit tohttp://www.example.com/index/about会运行actionAbout()​​,它会加载 About 页面模板。由于 about 页面是完全静态的内容,我actionAbout()除了为 Front Controller 提供一个公共操作来查看和运行之外,什么都不做。

因此,为了回答您问题的核心,我确实将多个“页面”放入一个控制器中,它可以很好地满足我的目的。每个控制器一个模型是我认为在使用 Web MVC 时不会尝试遵循的理论,因为它似乎更适合具有状态的应用程序。

2) 为此,我将有多个控制器。按照我上面使用的相同方法,我会/admin/dashboard按照/account/dashboard您的建议使用,尽管没有理由他们不能使用相同的(或相同的部分)模板。

我想如果我有大量不同类型的用户,我会让事情变得更通用并且只使用一个控制器,并且有一个 mod_rewrite 规则来处理加载。这可能取决于仪表板的功能复杂程度以及帐户设置的情况。

3)我发现 CRUD 功能很难直接实现到 MVC 的任何层中,并且仍然保持干净、灵活和高效。我喜欢将 CRUD 功能抽象到任何对象都可以调用的服务层中,并拥有一个基对象类,我可以从中扩展任何需要 CRUD 的对象。

我建议将一些 PHP ORM 框架用于 CRUD。他们可以省去很多获得良好实现的麻烦。

就登录控制器与用户控制器而言,我想这取决于您的应用程序域。以我的编程风格,我倾向于将“登录”视为用户模型域中的一个简单操作,因此在用户控制器中对其进行单一操作。更准确地说,我将UserController实例化一个用户模型并在模型上调用一个登录例程。我不能告诉你这是正确的方式,因为我不能确定正确的方式应该是什么。这是一个上下文问题。

4) 你是对的。您可以轻松创建一个控制器来处理您的应用程序/网站想要做的所有事情。但是,我认为您会同意这将成为维护的噩梦。想起我在一家市场研究公司的上一份工作时,我仍然会有些笨拙地思考,那里的内部 PHP 应用程序是由一个海外团队完成的,我只能假设几乎没有培训。我们说的是处理整个站点的 10,000 行脚本。这是不可能维持的。

因此,我建议您将您的应用程序/网站分解为业务域,并基于此创建控制器。找出你的应用程序的核心概念,然后从那里开始。

例子

假设我有一个关于海牛的网站,因为显然海牛很摇滚。我想要一些普通的网站页面(关于、联系方式等)、用户帐户管理、论坛、图片库,也许还有一个研究文档资料区(关于海牛的最新科学)。很简单,很多都是静态的,但你可以开始看到故障。

IndexController- 处理页面、隐私政策、通用静态内容。

UserController- 处理帐户创建、登录/注销、偏好

PictureController- 显示图片,处理上传

ForumController- 可能不多,我会尝试集成一个外部论坛,这意味着我在这里不需要太多功能。

LibraryController- 显示最近的新闻和研究列表

HugAManateeController- 通过 HTTP 实时拥抱的虚拟海牛

这可能至少给你一个基本的分离。如果您发现控制器变得非常大,则可能是时候将业务域分解为单独的控制器了。

每个项目都会有所不同,所以一点点的规划对于你将拥有什么样的建筑结构大有帮助。

Web MVC 可能会变得非常主观,因为它与应用程序具有状态的 MVC 模型完全不同。在处理 Web 应用程序时,我尝试将主要功能排除在控制器之外。我喜欢他们实例化一些对象或模型,根据正在执行的操作运行几个方法,并在完成后收集一些视图数据以传递给视图。越简单越好,我将核心业务逻辑放入模型中,模型应该代表应用程序的状态。

希望有帮助。

于 2009-04-29T23:40:36.283 回答