0

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

www.site.com/controller/action

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

www.site.com/sofas/overview
www.site.com/video-games/overview

对于第一个 URL,加载“沙发”控制器,并执行它的 overview() 方法。这一切都很好,直到我们必须将这些产品嵌套在父类别中。我将使用前两个 URL 来说明我的意思:

www.site.com/furniture/sofas/overview
www.site.com/electronics/video-games/overview

现在,“视频游戏”控制器嵌套在“电子”控制器中。但是,对于当前的“加载控制器 -> 执行操作”结构,这将不起作用。

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

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

4

2 回答 2

1

我认为您必须为每种不同的产品类型配备不同的“控制器”,这可能是您遇到问题的地方。

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

www.site.com/catalog/furniture/sofas/overview
www.site.com/catalog/electronics/video-games/overview

URI的catalog一部分决定了控制器,而附加的 URI 段本质上是传递给控制器​​的参数,指示请求的细节。

这将与 OOP 继承结构很好地配合,因为您可以拥有一个根“产品”类,然后使用家具、电子产品等的子类扩展该类,每个子类都有自己特定于该类别的属性。你会是沙发、视频游戏等的进一步子类。

您的控制器所要做的就是评估请求 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-06T14:20:00.577 回答
0

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

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

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

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

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

于 2012-09-06T14:17:22.560 回答