【问题标题】:MVC Codeigniter - How is the controller called from the view?MVC Codeigniter - 如何从视图中调用控制器?
【发布时间】:2016-02-19 17:09:53
【问题描述】:

我还是 mvc 的新手,正在使用 codeigniter 框架进行项目。我搜索了很多教程和 stackoverflow 帖子,但仍然找不到一个非常简单问题的简单答案。如何从视图中调用控制器。它只是来自每个视图页面的 ajax 调用并 POST 所需的控制器 url?

我了解 mvc 的概念,但无法根据在视图上选择某些内容来找出调用控制器的最佳方式。也许这只是一个简单的 ajax 调用,我想多了,但如果能对此事进行一些澄清,将不胜感激。

例子:

我加载了一个表单视图。当用户选择表单上的“下一步”按钮时,我希望调用控制器来加载表单之后的下一个视图。单击按钮时,您是否只是触发对控制器 url 的 POST ?那是我的问题。也许这就是这样做的方法,但在我读过的任何地方都没有得到澄清。

【问题讨论】:

  • 不清楚您想要完成什么或您的理解在哪里崩溃。您能否扩展您的问题以具体解释您正在尝试做什么,以及您迄今为止尝试过的未能实现这一目标的事情?没有它,很难知道会有什么有用的答案。
  • @AmericanUmlaut 现在我还在学习这种模式。我了解某些控制器及其方法是如何通过 URL 调用和解析的。假设在某个表单视图上,当用户单击“下一步”按钮时,我希望它调用控制器来加载表单的下一部分。那个控制器怎么叫?再次,也许它只是一个加载该 URL 的 POST,我想多了。
  • 此图表可能有助于可视化每个请求的情况:codeigniter.com/userguide3/overview/appflow.html

标签: php codeigniter model-view-controller


【解决方案1】:

如前所述,您通常不会从视图中调用控制器。这与 MVC 背道而驰。你可以做什么,如果我的问题是正确的,你可以添加一个指向你的控制器的 URL 作为你的选择选项标签的值。比您可以将来自 javascript 的选择作为 onselect 事件处理。您只需将选定的值提供给 window.location.href,您将被重定向到您的控制器。

【讨论】:

  • 谢谢。你越来越接近我的困惑点了。如果您不从视图中调用控制器,那么控制器是如何加载的。根据应用程序的流程,某些控制器是如何加载的?显然,您不希望用户输入控制器 url。那么怎么称呼呢?
  • 当您生成视图时,您必须将您希望为用户提供的所有控制器分配给您的选项标签的值属性。当您链接到您网站上的某个页面时,情况几乎相同。但在这种情况下,您不会链接到某个 html 或 php 文件;您只需链接到您的控制器,路由机制就会处理请求。
  • 好的。所以你只是根据用户选择加载控制器 url?这是在 mvc 中执行此操作的正确方法吗?
  • 是的。为了更容易理解,请考虑 HTTP。它是一个请求-响应协议。生成视图后,响应将发送给用户。下次他将与您的代码交互时,将是当他单击指向您的控制器的链接时。
  • 非常感谢您的帮助。你真的为我阐明了 mvc 的概念。
【解决方案2】:

您实际上缺少的是 routing 结构,它决定了控制器如何根据特定的 URL 请求加载视图。

假设你有这个网址:example.com/products

这将寻找具有Products 类的控制器。此外,默认情况下,它将默认在控制器中查找名为 index 的函数。我们还希望从products 表中下拉所有产品,因此我们需要关联模型。让我们看看它是什么样子的:

class Products extends CI_Controller {
    public function index(){
        //load our Products model
        $this->load->model('Model_products');

        //let's get all of our products off of our model
        $data['products'] = $this->Products->all();

        //now let's return all of our products with our view `products`
        $this->load->view('products', $data);
    }
}

当然,我们需要application/models/products_model.php 中的关联模型,以及一个从数据库中检索所有productsall 函数。

class Products_model extends CI_Model {
    public function __construct(){
        parent::__construct():
    }

    public function all(){
        return $this->db->get('products');
    }
}

希望这有助于您清楚了解 MVC 模式如何与 internal routing 一起使用。

【讨论】:

  • 我很欣赏这个例子。我了解路由的工作方式以及视图的加载方式。我的问题是控制器是如何加载的。用户不会手动输入每个控制器 url。根据某些用户对某些视图的输入,您如何加载其他控制器。
【解决方案3】:

根据 mvc 标准,视图不应直接访问控制器方法。如果你想将另一个类方法结果带到你的视图中,你应该在你的控制器中调用它并将它存储在一个变量中,这样你就可以在视图中访问它。

使用代码点火器的示例:

//controller:
$data = array(
    'name' => 'Carlos',
);
$this->load->view('myview', $data);

然后:

//view
echo $name; //prints 'Carlos'

【讨论】:

  • 是的,所以这是从控制器加载视图。如何从视图调用或加载控制器。假设基于视图上的某个选择,我想调用另一个控制器来加载不同的视图,我该如何加载该控制器?
猜你喜欢
  • 2012-04-16
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
相关资源
最近更新 更多