【问题标题】:Is it a good practice to create an object of a controller in another controller following MVC in PHP?在 PHP 中的 MVC 之后在另一个控制器中创建控制器的对象是一种好习惯吗?
【发布时间】:2019-05-03 21:46:51
【问题描述】:

我们(大多数人)都知道控制器的工作是处理客户端(例如网络浏览器)发出的请求,获取模型,渲染视图。

我的高级开发人员有 20 年的经验,伴随着原生 PHP 成长,不像我 4 年的经验,伴随着 PHP MVC 框架成长。我看到我的高级开发人员在另一个控制器的操作函数中创建了一个控制器的对象,因为他想使用与以下示例相同的业务逻辑。

class FooController extend Controller {

     public function view($id) {

         // Business logic goes here...

         // Pseudo code
         // If request comes from BarController
         // Render no layout, only view template.


         // If request comes from browser
         // Render view template with layout.
     }
}

class BarController extends Controller {

     public function viewFoo($id) {

          // Create an object of FooController so that we can reuse the business logic of the view function.
          $foo = new FooController();
          $foo_view = $foo->view($id);

          // Render $foo_view template.
     }
}

遵循 MVC 设计模式,在另一个控制器(在本例中为 BarController::viewFoo($id))中创建控制器的对象(在本例中为 FooController)是一种好习惯吗?

【问题讨论】:

  • 没有。另外,您所描述的是不是 MVC。
  • @tereško 我同意你的看法。我不会创建控制器的对象(用于处理用户请求),也不会调用控制器的操作函数来重用该操作函数中的业务逻辑。相反,我会将业务逻辑放在模型中,并且在任何控制器中,我宁愿创建该模型的对象并在业务逻辑所在的位置调用该模型的函数。

标签: php model-view-controller methods controller


【解决方案1】:

这种做法在某些情况下可能没问题,但一般来说这是问题的征兆。

根据某些人的说法,可重用的业务逻辑不属于控制器。相反,他们推荐了“胖模型瘦控制器”的一些变体(将这些术语放在互联网搜索引擎中)。控制器应该非常简单,可重用的逻辑应该在模型层,或者在单独的服务层中。

鉴于此,大多数人会认为控制器不会像这样重用。这使得应用程序变得脆弱:想象有人更改了重用的控制器或它呈现的视图:他们不会知道他们必须测试应用程序的这个不相关的部分。

【讨论】:

  • 我同意你的看法。当我的高级开发人员说“我有 20 年的纯 PHP 经验。你的经验最少。所以当你看到我的编程方式时,你会感到震惊。”,我开始怀疑他 20 年对新出现的 MVC 框架的经验,OOP,编程到接口而不是实现等。
猜你喜欢
  • 2016-06-09
  • 2014-03-09
  • 2021-08-24
  • 2011-10-31
  • 2014-08-27
  • 2012-07-10
  • 2014-09-22
  • 2018-02-25
  • 2014-09-27
相关资源
最近更新 更多