【问题标题】:Nesting controllers with the Front Controller Pattern and MVC使用前端控制器模式和 MVC 嵌套控制器
【发布时间】:2012-08-31 09:18:45
【问题描述】:

我正在使用 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 上的here。我觉得我现在的 MVC 实现是正确的,但是前端控制器还是带来了限制。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      我认为您必须为每种不同的产品类型配备不同的“控制器”这一想法可能会让您遇到问题。

      除非您对每种产品类型有截然不同的视图,否则我认为控制器将与诸如“目录”(或“产品”或任何您想称呼它的名称)之类的概念相关联。例如,您的 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();
      

      【讨论】:

      • 好的,所以我知道不必为每种类型的产品定义控制器,而是使用通用的“目录”控制器。但是,如果某种产品需要一些非常具体的业务逻辑怎么办?例如,当销售汽车类型的产品时,应该向销售经理发送一封电子邮件,因为产品的价格范围较高。这仅适用于 Cars 类型的产品,因此您不能将其包含在“普通”目录控制器中。
      • @user1440560 我假设您所说的控制器仅用于物品展示,而不是用于购买。您仍然可以在所有产品类中提供一个实现来执行购买后挂钩。就像在product 中一样,类有一个类似post_purchase_hooks() 的方法,它可以被所有继承类覆盖。所以显然可以通过这种方式自定义每个类中的购后逻辑。
      猜你喜欢
      • 2015-11-30
      • 1970-01-01
      • 2017-02-21
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-10
      • 2013-09-28
      相关资源
      最近更新 更多