Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何绕过CodeIgniter中的控制器?_Php_Codeigniter_Frameworks - Fatal编程技术网

Php 如何绕过CodeIgniter中的控制器?

Php 如何绕过CodeIgniter中的控制器?,php,codeigniter,frameworks,Php,Codeigniter,Frameworks,我一直在使用PHP的CodeIgniter框架,我很喜欢它,但我注意到它似乎要求每个视图都有一个控制器。我想知道是否有一种方法可以从视图本身调用特定的模型,而不是通过控制器进行路由。我知道在大多数情况下,使用控制器是最佳实践,特别是当模型中的数据需要以某种方式修改时,但我也有一些情况,我只需要对视图进行严格的数据拉取(通过ajax加载),为此设置控制器似乎是多余的 有什么想法吗?提前谢谢 我想知道是否有办法 从视图中调用特定模型 本身,而不是通过 控制器 据我所知,这是不可能的,CI控制器的主要

我一直在使用PHP的CodeIgniter框架,我很喜欢它,但我注意到它似乎要求每个视图都有一个控制器。我想知道是否有一种方法可以从视图本身调用特定的模型,而不是通过控制器进行路由。我知道在大多数情况下,使用控制器是最佳实践,特别是当模型中的数据需要以某种方式修改时,但我也有一些情况,我只需要对视图进行严格的数据拉取(通过ajax加载),为此设置控制器似乎是多余的

有什么想法吗?提前谢谢

我想知道是否有办法 从视图中调用特定模型 本身,而不是通过 控制器

据我所知,这是不可能的,CI控制器的主要抽象类对使用控制器施加了限制,否则会出现致命错误


实际上,你所说的将打破MVC设计模式的最佳实践。您必须通过控制器而不是视图进入模型。

我有点搞不清楚您到底想实现什么。除了作为处理传入请求的干净方法之外,控制器的价值在于管理模型和视图之间的交互,并确定要加载哪些视图。直接从视图加载模型数据也是完全合理的,但是您首先是如何到达视图的呢


我想我只是很难看到这里的上下文。

要通过Ajax运行查询,仍然需要在javascript调用中提供URL/路径。您无法回避控制器函数必须“捕获”此调用这一事实;不能将url直接映射到模型。您所需要的只是控制器中的3-4行代码

通过,您可以将URL映射到不同的控制器,因此您不需要“每个视图都需要一个控制器”。我总是创建一个名为“ajax”的控制器来处理这些请求

jquery的基本ajax调用可以是这样的

$('#prod_img').load( "http://domain.com/ajax/get_img", {'color': 'blue', 'url_title': 'bla' } )

你基本上误解了MVC,至少是在CI中实现的MVC

站点上的所有URL(至少是那些使用CI框架的URL)都映射到控制器中的函数(方法)

URL是通过常规HTTP还是通过AJAX访问并不重要。这始终是一对一映射。因此,您应该将控制器/方法组合视为“网页”。不要将视图视为网页

模型和视图从属于控制器。控制器将特定的职责委托给他们-模型的数据库交互,以及视图的页面输出

由于模型和视图仅用于执行委派的职责,因此在任何给定的控制器/方法中都不需要使用它们。例如,帮助页面通常不需要与数据库交互,因此没有为给定帮助页面提供服务的控制器/方法组合所使用的模型。同样,表单处理程序在处理完成后经常重定向到另一个页面。因此,没有与表单处理程序对应的视图(但是(可能)在重定向到页面中有一个从控制器/方法调用的视图)

此外,模型和视图不一定与单个控制器/方法一一对应。任何给定的模型都可以从多个控制器中加载和使用。类似地,控制器可以有一个供所有方法使用的单一单片视图,或者可以为每个方法分配自己的视图。(或者,正如我刚才所说,一个给定的控制器/方法根本不能利用任何视图。)

最后,CI不强制执行严格的MVC分离。您可以在控制器内与数据库交互并回显HTML,CI不会抱怨。然而,这种责任的分离和委派是遵循的,因为逻辑上的责任分离使代码更容易阅读,并帮助您在编码中遵循干式原则


基本理解是“网页”对应于控制器/方法。视图和模型在使用时,处理控制器/方法的委派职责。

您可以在控制器中回显内容,因此您不应该试图绕过控制器,而应该研究如何删除视图。这实际上很简单,您可以像在模型中一样在控制器中加载db类


但是,如果您真的不想使用MVC,那么Codeigniter可能不适合您。

您应该更多地了解MVC的原理。 视图严格用于表示数据,模型不应直接与视图通信

但是,如果这是您想要的,那么只需将$this->db从控制器传递到视图,并在视图中使用它。
再说一遍,这不是一个好的实践。

事实上,您所说的将打破MVC设计模式的最佳实践。这完全取决于您坚持哪个MVC“版本”。至少有3种不同的“版本”。。。一种说法是控制器将模型推入视图。一种说法是视图将模型拉入自身。另一种说法是控制器将数据推送到视图中(因此模型与视图100%分离,没有依赖关系)。虽然我同意你的观点,最重要的是保持一致性,但并不是为了把事情按不同的顺序联系起来而破坏MVC。MVC是关于分离,而不是关系…@ircmaxell:有趣的是,它有三个版本,我说的是CI遵循的模式。如果你能发布一个关于这三个版本的讨论链接,那就太好了,谢谢:)看起来酷客已经告诉过你了,但我一开始并没有阅读他的完整答案。反正我的比较短(但他的比较好):)