【问题标题】:How exactly works this CodeIgniter controller class?这个 CodeIgniter 控制器类究竟是如何工作的?
【发布时间】:2016-11-30 04:35:48
【问题描述】:

我是一名 Java 开发人员(我经常使用 Spring MVC 在 Java 中开发 MVC Web 应用程序),对 PHP 的了解很少,我必须从事一个使用 CodeIgniter 2.1.3的 PHP 项目>.

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

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

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

所以它似乎明白 CodeIgniter 是一个类,它处理具有相同名称的应用程序的单个 URL 的类名。对吗?

所以我有这门课:

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);

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

我的推理正确吗?

如果是,我正在加载传递给 id 的视图以及 $data 变量,我认为该变量是包含可以在页面中显示的数据的模型,该变量通过以下方式检索:

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

这条线到底是什么?

最后一个疑问与我在上一个控制器中找到的另一个 back() 方法有关:它是 CodeIgniter CI_Controller 类的方法还是完全自定义的方法由在我之前开发此应用程序的开发人员?

【问题讨论】:

    标签: php codeigniter codeigniter-2


    【解决方案1】:

    一个控制器可以处理多个 URL,garanzieValoreFlex 类就是此类的一个示例。

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

    http://MYURL/garanzieValoreFlex/backhttp://MYURL/garanzieValoreFlex/reset 的 URL 将分别调用类的 back()reset() 方法。这两个函数是扩展类CI_Controller的自定义添加。

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

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

    您对$this->load->view('garanziavalore/index_bootstrap',$data); 的推理是正确的。将此类文件放在 views 目录中是标准做法。或者,views 的子目录可以像 /views/garanziavalore/ 一样使用。

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

    查找loaderhere. 的文档

    代码行

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      Codeigniter 2: http://www.codeigniter.com/userguide2/

      Codeigniter 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)返回函数是用户定义的函数。

      【讨论】:

        猜你喜欢
        • 2018-03-03
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        • 1970-01-01
        • 2013-12-05
        • 2012-01-26
        • 2019-10-12
        • 1970-01-01
        相关资源
        最近更新 更多