首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Front Controller模式和MVC嵌套控制器

使用Front Controller模式和MVC嵌套控制器
EN

Stack Overflow用户
提问于 2012-09-06 22:09:23
回答 2查看 598关注 0票数 0

我正在使用MVC方法(不使用任何框架,纯PHP)在PHP中开发一个web应用程序。与MVC通常的情况一样,每个请求都会到达前端控制器,由前端控制器将其路由到相应的控制器,并执行请求的操作。URL结构如下所示:

代码语言:javascript
复制
www.site.com/controller/action

假设我正在构建一个电子商务网站,其中包含不同类别的产品。可能的URL可能是:

代码语言:javascript
复制
www.site.com/sofas/overview
www.site.com/video-games/overview

对于第一个URL,加载"sofas“控制器,并执行它的overview()方法。这一切都运行得很好,直到我们不得不将这些产品嵌套在父目录中。我将使用前面的两个URL来演示我的意思:

代码语言:javascript
复制
www.site.com/furniture/sofas/overview
www.site.com/electronics/video-games/overview

现在,“视频游戏”控制器嵌套在“电子”控制器中。但是,使用当前的“load controller -> execute action”结构,这将不起作用。

一种可能的解决方案是在父控制器("electronics")内创建一个方法,该方法在请求不存在的动作(“视频游戏”)的情况下被执行。此方法检查请求的操作是否作为控制器存在。如果是这样,则加载控制器并执行其操作(“概述”)。

我徒劳地寻找了标准前端控制器模式的解决方案,包括here等。我认为我的MVC实现现在是正确的,但前端控制器仍然带来了局限性。

EN

回答 2

Stack Overflow用户

发布于 2012-09-06 22:20:01

我认为,对于每种不同的产品类型,你必须有一个不同的“控制器”的想法可能会让你遇到问题。

除非您对每种产品类型都有截然不同的视图,否则我认为控制器将与诸如“目录”(或“产品”或您想要称为它的任何名称)之类的概念相关联。例如,您的URL结构可能如下所示

代码语言:javascript
复制
www.site.com/catalog/furniture/sofas/overview
www.site.com/catalog/electronics/video-games/overview

其中URI的catalog部分确定控制器,并且附加URI段本质上是传递给控制器的指示请求的细节的参数。

这将很好地与OOP继承结构一起工作,因为您可以有一个根“product”类,然后用家具、电子产品等的子类来扩展该类,这些子类都有自己的特定于该类别的属性。您将进一步细分为沙发、视频游戏等。

您的控制器所要做的就是评估请求URI,以确定为请求加载哪个类。所以就像这样:

代码语言:javascript
复制
// assume URI has been parsed to get value such as "sofas", "video-games", etc. into a variable called $class_to_load
$product = new $class_to_load;
$product->overview();
票数 1
EN

Stack Overflow用户

发布于 2012-09-06 22:17:23

您混淆了MVC结构和路由问题。

控制器应该是类似产品控制器或类别控制器的东西。按功能对控制器进行分组。

现在,路由处理请求的结构,以及请求在应用程序中的发送位置。

您应该有一个路由层,它知道(例如)使用适当的参数(即类别和子类别)将/<category>/<subcategory>/<action>发送到适当的控制器(比如产品控制器),这样它就可以构造响应。

仅将url直接映射到控制器和操作(即强制执行/<controller>/<action>)是构建应用程序架构的一种非常有限的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12302023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档