这个CodeIgniter控制器类的工作原理是什么?

时间:2016-07-26 13:35:24

标签: php codeigniter codeigniter-2

我是一名Java开发人员(我经常使用Spring MVC来开发Java中的MVC Web应用程序),他对PHP非常了解,我必须处理一个使用 CodeIgniter 2.1.3

所以我对控制器如何在 CodeIgniter 中工作有所怀疑。

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

阅读 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

据我所知,我访问上一个网址时执行的方法是 index(),按此行:

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

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

我的推理是否正确?

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

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

这条线究竟是什么?

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

2 个答案:

答案 0 :(得分:1)

你的推理是错误的。我真的建议你阅读官方的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)后退功能是用户定义的功能。

答案 1 :(得分:1)

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

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

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

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

当网址仅使用example.com/class等类名时,CI会查找并调用index()方法(如果存在)。如果index()不存在,您将显示404 Page Not Found

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

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

查找loaderhere.

的文档

代码行

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

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

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

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