使用前端控制器模式和MVC嵌套控制器

时间:2012-09-06 14:09:23

标签: php model-view-controller front-controller

我正在使用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

现在,“视频游戏”控制器嵌套在“电子”控制器中。但是,使用当前的“负载控制器 - >执行动作'结构这不起作用。

一种可能的解决方案是在父控制器(“电子设备”)中创建一个方法,该方法在请求未执行动作时被执行(“视频游戏”)。此方法检查请求的操作是否作为控制器存在。如果是,则控制器被加载并执行它的动作(“概述”)。

我毫无结果地搜索了标准前端控制器模式的这种限制的解决方案,包括SO上的here。我认为我的MVC实现现在是正确的,但前端控制器仍然带来了限制。

2 个答案:

答案 0 :(得分:1)

我认为您必须为每种不同的产品类型设置不同的“控制器”,这可能会导致您遇到问题。

除非你对每种产品类型都有截然不同的观点,否则我认为控制器会链接到一个概念,例如“目录”(或“产品”或任何你想称之为的东西)。例如,您的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();

答案 1 :(得分:0)

您将MVC结构与路由问题混淆。

控制器应该类似于产品控制器或类别控制器。按功能分组控制器。

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

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

只有将url直接映射到控制器和操作(即强制/<controller>/<action>)才是构建应用程序体系结构的一种非常有限的方式。