这个 CodeIgniter 控制器 class 究竟是如何工作的?

How exactly works this CodeIgniter controller class?

我是一名 Java 开发人员(我经常使用 Spring MVC 在 Java 中开发 MVC 网络应用程序),对 PHP 的了解很少,我有在使用 CodeIgniter 2.1.3.

的 PHP 项目上工作

所以我对控制器在 CodeIgniter 中的工作方式有一些疑问。

1) 在 Spring MVC 中,我有一个带有一些注释方法的控制器 class,每个方法处理一个特定的 HTTP 请求(注释定义了方法处理的 URL)和 return 必须显示的视图的名称。

阅读 CodeIgniter 的官方文档,我觉得这个框架的逻辑很不一样:https://www.codeigniter.com/userguide3/general/controllers.html#what-is-a-controller

所以它似乎理解 CodeIgniter 是一个 class 处理单个 URL 具有相同名称的应用程序 class 名字。正确吗?

所以我有这个 class:

class garanzieValoreFlex extends CI_Controller {

    ..................................................... 
    ..................................................... 
    ..................................................... 

    function __construct() {
        parent::__construct();

        $this->load->helper(array('form', 'url'));
        $this->load->library(array('form_validation','session'));
    }


    public function reset() {

       $this->session->unset_userdata("datiPreventivo");
       $this->load->view('garanziavalore/garanzie_valore_questionario_bootstrap',array());

   }


   public function index() {

        $this->load->model('Direct');
        $flagDeroga = "true" ;

        $this->session->userdata("flagDeroga");

        $data = $this->session->userdata("datiPreventivo");
        $this->load->model('GaranzieValoreFlexModel');

        $data = $this->session->userdata("datiPreventivo");
        $this->load->model('GaranzieValoreFlexModel');

        $this->load->view('garanziavalore/index_bootstrap',$data);
    }

    public function back() {

        $this->load->model('Direct');
        $flagDeroga = "true" ;

        $this->session->userdata("flagDeroga");
            $data = $this->session->userdata("datiPreventivo");
            $this->load->model('GaranzieValoreFlexModel');
            //$this->load->view('garanziavalore/garanzie_valore_questionario_bootstrap',$data);
            $this->load->view('garanziavalore/index_tornaIndietro_bootstrap',$data);

    }


    ..................................................... 
    ..................................................... 
    ..................................................... 

}

所以,据我了解,基本上这个控制器只处理指向 URL 的 HTTP 请求:http://MYURL/garanzieValoreFlex.

所以据我了解,当我访问前一个 URL 时执行的方法是 index(),即通过此行:

$this->load->view('garanziavalore/index_bootstrap',$data);

显示我在项目的 views 目录中找到的 garanziavalore/index_bootstrap.php 页面 (它是必须进入 views 目录的标准吗?)

我的推理是否正确?

如果是,我正在加载传递给 id 的视图还有 $data 变量,我认为它是包含可以在页面中显示的数据的模型,这个变量是检索人:

$data = $this->session->userdata("datiPreventivo");

这行到底是什么意思?

最后一个疑问是关于我在之前的controller中找到的另一个back()方法:是不是CodeIgniter[=54=的方法] CI_Controller class 或在我之前开发此应用程序的开发人员完全自定义的内容?

你的推理是错误的。我真的建议您阅读官方的 codeigniter 教程,以便您了解 MVC 的工作原理: 以下是链接

代码点火器 2: http://www.codeigniter.com/userguide2/

代码点火器 3: http://www.codeigniter.com/user_guide/

CI 控制器处理不同的 url。如果你在控制器中创建一个名为 index 的函数,它会在访问控制器时自动加载。对于您的情况,http://MYURL/garanzieValoreFlex 应该访问该函数。 要访问任何其他功能,您需要 http://MYURL/garanzieValoreFlex/**MyFunction** (阅读更多 http://www.codeigniter.com/user_guide/general/urls.html?highlight=url#codeigniter-urls)后退函数是用户定义的函数。

一个控制器可以处理多个 URL,class garanzieValoreFlex 就是这样的一个例子 class。

URL http://MYURL/garanzieValoreFlex 将调用 index 方法。

URL的http://MYURL/garanzieValoreFlex/backhttp://MYURL/garanzieValoreFlex/reset会分别调用class的back()reset()方法。这两个函数是对扩展 class CI_Controller.

的自定义添加

Codeigniter (CI) URL 遵循模式 example.com/class/function/argument/ 函数和参数段是可选的。

当 URL 仅使用 class 名称(例如 example.com/class)时,CI 将查找并调用 index() 方法(如果存在)。如果 index() 不存在,您将获得 404 Page Not Found 显示。

您关于 $this->load->view('garanziavalore/index_bootstrap',$data); 的推理是正确的。将此类文件放在 views 目录中是标准做法。可以选择 views 的子目录,如 /views/garanziavalore/.

CI 使用文件结构将不同的 classes(库)与特定路径相关联。控制器、模型和视图 classes 存储在各自的文件夹中。然后 loader class 将确切地知道从哪里开始寻找 class 的任何给定 "type"。例如,对 $this->load->view('garanziavalore/index_bootstrap',$data); 的调用告诉 loader class 从 /application/views/garanzivalore/ 目录中获取文件 index_boostrap.php。代码 $this->load->model('GaranzieValoreFlexModel'); 告诉加载程序在 /application/models/.

中使用文件 GaranzieValoreFlexModel.php

查找 loader class here.

的文档

代码行

$data = $this->session->userdata("datiPreventivo");

正在调用 session class(库)的 userdata 方法。将会话数据视为一个数组。如果数组是这样定义的。 (这只是完成的伪代码)。

$userdata = array(); //empty array structure

调用 $this->session->userdata("datiPreventivo") 实际上返回 $userdata["datiPreventivo"] 的值。