【问题标题】:Drivers vs Controllers (MVC)驱动程序与控制器 (MVC)
【发布时间】:2012-09-20 11:13:17
【问题描述】:

我正在使用 Codeignitor 2.x 并且我最初使用控制器作为模块(尽管不完全是 HMVC),因为我有一个可以调用其他较低级别控制器的顶级控制器。我的想法是,因为这些较低级别的控制器仍在与视图交互,所以它们应该仍然是控制器而不是模型或驱动程序。

然而,我发现控制器的每个实例也会产生一个新的 CI 实例。所以我会为每个请求运行 3 或 4 个 CI 实例。大量开销,还导致会话问题。

我已经将这些较低级别的控制器作为驱动程序移入库中。他们现在在构造方法中捕获 CI 实例,并对其进行修改。这使它非常好用,并且不需要 HMVC 扩展。驱动程序也不能从外部调用,因此它允许我通过特定入口点汇集所有请求。

我的问题是这在结构上是否正确。我一直认为驱动程序应该只修改通过方法调用提供的数据,但其中许多驱动程序会直接从GET 和 POST,虽然它们不会直接附加到视图,但它们经常访问视图文件,并将处理后的视图传递给 CI 实例进行输出。

[编辑] 更多上下文: 我创建的驱动程序之一本质上是一个名为“Access”的用户登录驱动程序。它为创建/登录/注销方法调用“用户”模型。驱动程序使用 POST 数据检查用户模型,然后加载带有错误的正确视图以及所需的任何内容。这个想法是,有 2 行,我可以在整个项目的任何控制器中包含这个驱动程序,因此代码冗余显着减少。同样,我知道驱动程序应该被限制在它们的范围内,但是驱动程序不会修改其范围之外的任何内容,而只是返回它创建的视图。

还有另一种更符合直接 MVC 的方法吗?

【问题讨论】:

    标签: php oop model-view-controller codeigniter hmvc


    【解决方案1】:

    我不能说是对还是错。但如果我是你,我不会那样做。我可能会重构一些代码。我会确保他们不会直接从$_GET$_POST 超全局变量中获取和操作数据。相反,将一些数据作为参数传递给函数调用。这将使测试更容易,因为您不必模拟GETPOST 请求。虽然从技术上讲,您可以从代码中手动设置超全局变量的值,但我不建议这样做。提供数据作为参数会更好,特别是如果您想编写随后执行的测试用例。另外,让库与超出其自身范围的范围进行交互可能会引入一些隐藏的问题。

    在我看来,库应该类似于模块,您可以在其中拖放,然后轻松使用它们。如果您的代码确实需要从$_GET$_POST 获取或操作值,那么也许它们应该是模型。此外,您可能想考虑您的代码是否实际上是一个库。问问自己,这段代码在这个应用程序之外有用吗?或者它是否高度依赖并且只能对这个特定的应用程序有用?如果你对后者说是,那么它可能应该是一个模型而不是一个库。最后一件事,您应该将视图留给控制器。只需从库/模型方法返回您需要的数据,然后将其从控制器传递给视图。

    【讨论】:

    • 通过查看 CI 使用驱动程序的目的,我在某种程度上能够证明我的方法是正确的,并且我意识到我的驱动程序与表单验证库所做的非常接近。它不会修改其范围之外的任何内容,而是提供对全球可用数据的解释。
    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2019-03-17
    • 2017-05-24
    • 2013-10-25
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多