我正在使用MVC方法(不使用任何框架,纯PHP)在PHP中开发一个web应用程序。与MVC通常的情况一样,每个请求都会到达前端控制器,由前端控制器将其路由到相应的控制器,并执行请求的操作。URL结构如下所示:
www.site.com/controller/action假设我正在构建一个电子商务网站,其中包含不同类别的产品。可能的URL可能是:
www.site.com/sofas/overview
www.site.com/video-games/overview对于第一个URL,加载"sofas“控制器,并执行它的overview()方法。这一切都运行得很好,直到我们不得不将这些产品嵌套在父目录中。我将使用前面的两个URL来演示我的意思:
www.site.com/furniture/sofas/overview
www.site.com/electronics/video-games/overview现在,“视频游戏”控制器嵌套在“电子”控制器中。但是,使用当前的“load controller -> execute action”结构,这将不起作用。
一种可能的解决方案是在父控制器("electronics")内创建一个方法,该方法在请求不存在的动作(“视频游戏”)的情况下被执行。此方法检查请求的操作是否作为控制器存在。如果是这样,则加载控制器并执行其操作(“概述”)。
我徒劳地寻找了标准前端控制器模式的解决方案,包括here等。我认为我的MVC实现现在是正确的,但前端控制器仍然带来了局限性。
发布于 2012-09-06 22:20:01
我认为,对于每种不同的产品类型,你必须有一个不同的“控制器”的想法可能会让你遇到问题。
除非您对每种产品类型都有截然不同的视图,否则我认为控制器将与诸如“目录”(或“产品”或您想要称为它的任何名称)之类的概念相关联。例如,您的URL结构可能如下所示
www.site.com/catalog/furniture/sofas/overview
www.site.com/catalog/electronics/video-games/overview其中URI的catalog部分确定控制器,并且附加URI段本质上是传递给控制器的指示请求的细节的参数。
这将很好地与OOP继承结构一起工作,因为您可以有一个根“product”类,然后用家具、电子产品等的子类来扩展该类,这些子类都有自己的特定于该类别的属性。您将进一步细分为沙发、视频游戏等。
您的控制器所要做的就是评估请求URI,以确定为请求加载哪个类。所以就像这样:
// 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();发布于 2012-09-06 22:17:23
您混淆了MVC结构和路由问题。
控制器应该是类似产品控制器或类别控制器的东西。按功能对控制器进行分组。
现在,路由处理请求的结构,以及请求在应用程序中的发送位置。
您应该有一个路由层,它知道(例如)使用适当的参数(即类别和子类别)将/<category>/<subcategory>/<action>发送到适当的控制器(比如产品控制器),这样它就可以构造响应。
仅将url直接映射到控制器和操作(即强制执行/<controller>/<action>)是构建应用程序架构的一种非常有限的方法。
https://stackoverflow.com/questions/12302023
复制相似问题