php 前端控制器,关于php:具有前端控制器模式和MVC的嵌套控制器

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

www.site.com/controller/action

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

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。我认为我现在对MVC的实现是正确的,但是前端控制器仍然带来局限性。

我认为对于每种不同的产品类型都必须具有不同的"控制器"的想法可能会遇到问题。

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

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();

好的,这样我就不必为每种产品定义控制器,而是使用通用的"目录"控制器。 但是,如果某种产品需要一些非常具体的业务逻辑怎么办? 例如,当销售汽车类型的产品时,由于产品价格范围较高,因此应向销售经理发送电子邮件。 这仅适用于Cars类型的产品,因此您不能将其包含在常规Catalog控制器中。

@ user1440560我假设您所谈论的控制器严格用于物品显示,而不是用于购买。 您仍然可以在所有产品类中提供一个实现来执行购买后挂钩。 像product类中一样,有一个类似post_purchase_hooks()的方法可以被所有继承的类覆盖。 这样显然可以在每个类中自定义购买后逻辑。

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

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

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

您应该具有一个路由层,该路由层知道(例如)将///发送给具有适当参数(即类别和子类别)的适当控制器(例如产品控制器),以便可以构造响应。

仅将url直接映射到控制器和操作(即强制//)是构建应用程序体系结构的非常有限的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值