1) 我为我的一些 MVC 东西使用了一组简单的自制类,它将控制器名称与操作和视图名称相关联(它是前端控制器样式,类似于 Zend)。对于一个通用网站,我们假设它有一个主页、隐私政策、联系页面和一个关于页面。我真的不想为所有这些东西制作单独的控制器,所以我会把它们放在我IndexController
的.actionIndex()
actionPrivacy()
actionContact()
actionAbout()
为此,在我的 Views 目录中,我有一个与每个操作关联的模板目录。默认情况下,任何操作都会自动查找关联的模板,但您可以根据需要指定一个。所以actionPrivacy()
会寻找模板文件index/privacy.php
,actionContact()
会寻找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 应用程序时,我尝试将主要功能排除在控制器之外。我喜欢他们实例化一些对象或模型,根据正在执行的操作运行几个方法,并在完成后收集一些视图数据以传递给视图。越简单越好,我将核心业务逻辑放入模型中,模型应该代表应用程序的状态。
希望有帮助。