这个 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/back
和http://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"]
的值。
我是一名 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/back
和http://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"]
的值。