0

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

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

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

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

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

是否有另一种更符合直接 MVC 的方法来执行此操作?

4

1 回答 1

0

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

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

于 2012-09-28T15:12:38.050 回答