-
CodeIgniterURL是一种基于段的方法
CodeIgniterURL是一种基于段的方法:
查询字符串形式的URL是可选的,
根据模型-视图-控制器模式,此时的URL段一般以如下形式表示:
example.com/class/function/ID
1. 第一段表示控制器类
2. 第二段表示调用类中的函数或方法。
3. 第三及下面的段是表示传递给控制器的参数。
4. 可以选择URI类或URL辅助函数中函数简化URI的工作。
5. 使用URI路由可以使URL重定向,以得到灵活性。
删除index.php文件
可以通过 .htaccess文件设置规则删除它。使用”negative”方法将非指定内容重定向:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f //此处有大坑。加上这句可保证一般css、js文件正常加载。(注意删掉这句注释哦)
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
注意:如果你的项目不在根目录请把上面这一句改为:RewriteRule ^(.*)$ index.php/$1 [L]
添加URL后缀:
通过设置config/config.php生成URL指定文件后缀。举例来说,如果URL为:example.com/index.php/products/view/shoes
那么就可以添加一个后缀,例如 .html,使其显示为:example.com/index.php/products/view/shoes.html
(icebird注:英文中由于参数可直接看懂其含义,并未说明应修改哪个参数,在这里应修改$config['url_suffix']这个参数。)
启用查询字符串:
可能会用到查询字符串:
Index.php?c=products&m=view&id=345
CodeIgniter支持这个功能是可选的,可在conifg.php中进行设置。
$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c'; //控制器名
$config['function_trigger'] = 'm'; //方法名
$config['directory_trigger']='d'; //若控制器在子目录下,URL中需带有这个参数,指定控制器所在子目录名称
那么将enable_query_strings更改为TRUE,那么这个功能就被激活了。此时就可以通过关键字来调用需要的控制器和方法了:
index.php?c=controller&m=method
如果使用查询字符串,那么就必须使用自己建立的URL,而且不能使用URL辅助函数(或者其他的URL的辅助函数,例如表单辅助函数),因为这些都是根据分段URL设计的。
控制器:
一个控制器就是一个类文件:是一种能够和URI关联在一起来命名的。
假设URI为:
eample.com/index.php/blog/
上面这个例子中,CodeIgniter将尝试装载一个名为blog.php的控制器。
当控制器的名字匹配URI的第一段时,它将被装载。
让我们看看:Hello World!
注意类名以大写字母开头。换句话说,这是有效的:
<?php
Class Blog extends CI_Controller{
}
?>
下面的blog首字母小写属于无效写法:
<?php
Class blog extends CI_Controller{
}
?>
方法:
上面的例子中用到的方法名是index().如果URI的第二部分为空的话,会默认载入”index”方法。也可以将地址写成这样来访问”HelloWorld”:example.com/index.php/blog/index/
URI的第二部分是用来决定调用控制器中哪个方法的:
<?php
Class Blog extends CI_Controller{
Function __construct()
{
parent::__construct();
}
public function index()
{
echo “Hello World”;
}
Public function comments()
{
echo ‘看这里’; //这里要注意输出中文字符;需要浏览器,编辑器,以及数据库的字体格式为相同格式
}
}
?>
将URI片段传递给方法:
如果你的URI超过2个部分,那么超过的将被作为参数传递给方法。
假设URI是这样的:
example.com/index.php/products/shoes/sandals/123
URI的第3和第4部分会被传递给你的方法(“sandals”和”123”):
也就是启用URL时,不需要额外的赋值,只需写在第三第四段上给予其该有的赋值就可。
<?php
Class Products extends CI_Controller{
public function shoes($sandals,$id)
{
echo $sandals;
echo $id;
}
}
?>
上面的方法在URL访问地址中加上第三和第四个赋值参数的操作;否则出错。
当然也可以这样写:
<?php
Class function extends CI_Controller{
public function shoes($sandals=’test’,$id=’1’)
{
echo $sandals;
echo $id;
}
}
?>
这样就不需要再写URL时调用参数了
定义默认控制器:
当在网站不存在某个URI或者用户直接从根目录访问的时候。CodeIgniter会加载默认控制器。打开application/config/routes.php文件来设置默认控制器:
$route[‘default_controller’]=’Blog’;
这里的Blog就是你希望使用的控制器名字。如果此时你不指定任何的URI片段来访问你的主页就会看到默认的”Hello World”信息。
重新定义方法的调用规则:
URI第二片段会调用控制器中的哪个方法。CodeIgniter允许你使用_remap()方法来废除这种规则:
Public function _remap()
{
//some code here…
}
注意:如果你的控制器中包含一个名为 _remap() 的方法,那么不管你的 URI 中包含什么,它总会被忽略掉。这个方法会废除掉由 URI 片段来决定哪个方法被调用的规则,允许你重新定义调用方法的规则(方法的路由规则)。
public function _remap($method)
{
if($method==’some_method’)
{
$this->$method();
}
else
{
$this->comments();
}
}
任何附加在该方法名称之后的段都会被视为_remap()的第二个参数(可选)。这个可选的数组参数可以与PHP的call_user_func_array联用,模拟CodeIgniter的默认行为。
public function _remap($method,$params=array())
{
$method=’process_’.$method;
if(method_exists($this,$method))
{
return call_user_func_array(array($this,$method),params);
}
show_404();
}
处理输出
CodeIgniter拥有一个输出类用来确保你修改的数据会自动的被传递给浏览器。关于这个的信息可以在视图和输出类里找到。有时候,可能会想自己发布修改一些最终数据或自己把它传递给浏览器。
CodeIgniter允许你的控制器增加一个名为_output()的方法来接受最终的数据。
注意: 如果你的控制器包含一个 _output() 方法,那么它将总是被调用,而不是直接输出最终的数据。这个方法类似于OO里的析构函数,不管你调用任何方法这个方法总是会被执行。
Public function _output($output)
{
echo $output;
}
请注意,你的 _output() 将接收最终的数据。 Benchmark和内存的使用率数据将被渲染,缓存文件会被写入(如果已启用缓存),并且 HTTP 头也将被发送(如果您使用该功能),然后交给 _output() 函数。
为了让你的控制器输出缓存正确, 它的 _output() 函数可以这样来写:
If($this->output->cache_expiration>0)
{
$this->output->_write_cache($output);
}
如果正在使用页面执行时间和内存使用统计的功能,这可能不完全准确,因为他们不会考虑你做的任何进一步动作。请在输出类蚕蛹可用的方法,来控制输出以使其在任何最终进程完成之前执行。
私有方法:
在某些情况下,可能想要隐藏一些方法使之无法对外查阅。将方法私有化很简单,只要在方法名字前面加一个下划线”_”做前缀就无法通过URL访问到了。例如:
private function _utility()
{
//some code
}
那么通过下面这样的URL进行访问时无法访问到的:
example.com/index.php/blog/_utility/
如何将控制器放入子文件夹中
如果是建立一个大型应用程序,CI可以很方便的将控制器放到子文件夹。
注意: 如果你要使用某个子文件夹下的功能,就要保证 URI 的第一个片段是用于描述这个文件夹的。例如说你有一个控制器在这里:
application/controllers/products/shoes.php
调用这个控制器的时候你的 URI 要这么写:
example.com/index.php/products/shoes/show/123
你的每个子文件夹中需要包含一个默认的控制器,这样如果 URI 中只有子文件夹而没有具体功能的时候它将被调用。只要将你作为默认的控制器名称在 application/config/routes.php 文件中指定就可以了。
CodeIgniter 也允许你使用 URI 路由 功能来重新定向 URI。
parent::__construct();
这行代码的必要性在于,你此处的构造函数会覆盖掉这个父控制器类中的构造函数,所以我们要手动调用它。
<?php
class Blog extends CI_Controller {
public function __construct()
{
parent::__construct();
}
}
?>
如果你需要设定某些默认的值或是在实例化类的时候运行一个默认的程序,那么构造函数在这方面就非常有用了。
构造函数并不能返回值,但是可以用来设置一些默认的功能。
查询字符串形式的URL是可选的,
根据模型-视图-控制器模式,此时的URL段一般以如下形式表示:
example.com/class/function/ID
1. 第一段表示控制器类
2. 第二段表示调用类中的函数或方法。
3. 第三及下面的段是表示传递给控制器的参数。
4. 可以选择URI类或URL辅助函数中函数简化URI的工作。
5. 使用URI路由可以使URL重定向,以得到灵活性。
删除index.php文件
可以通过 .htaccess文件设置规则删除它。使用”negative”方法将非指定内容重定向:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f //此处有大坑。加上这句可保证一般css、js文件正常加载。(注意删掉这句注释哦)
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
注意:如果你的项目不在根目录请把上面这一句改为:RewriteRule ^(.*)$ index.php/$1 [L]
添加URL后缀:
通过设置config/config.php生成URL指定文件后缀。举例来说,如果URL为:example.com/index.php/products/view/shoes
那么就可以添加一个后缀,例如 .html,使其显示为:example.com/index.php/products/view/shoes.html
(icebird注:英文中由于参数可直接看懂其含义,并未说明应修改哪个参数,在这里应修改$config['url_suffix']这个参数。)
启用查询字符串:
可能会用到查询字符串:
Index.php?c=products&m=view&id=345
CodeIgniter支持这个功能是可选的,可在conifg.php中进行设置。
$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c'; //控制器名
$config['function_trigger'] = 'm'; //方法名
$config['directory_trigger']='d'; //若控制器在子目录下,URL中需带有这个参数,指定控制器所在子目录名称
那么将enable_query_strings更改为TRUE,那么这个功能就被激活了。此时就可以通过关键字来调用需要的控制器和方法了:
index.php?c=controller&m=method
如果使用查询字符串,那么就必须使用自己建立的URL,而且不能使用URL辅助函数(或者其他的URL的辅助函数,例如表单辅助函数),因为这些都是根据分段URL设计的。
控制器:
一个控制器就是一个类文件:是一种能够和URI关联在一起来命名的。
假设URI为:
eample.com/index.php/blog/
上面这个例子中,CodeIgniter将尝试装载一个名为blog.php的控制器。
当控制器的名字匹配URI的第一段时,它将被装载。
让我们看看:Hello World!
注意类名以大写字母开头。换句话说,这是有效的:
<?php
Class Blog extends CI_Controller{
}
?>
下面的blog首字母小写属于无效写法:
<?php
Class blog extends CI_Controller{
}
?>
方法:
上面的例子中用到的方法名是index().如果URI的第二部分为空的话,会默认载入”index”方法。也可以将地址写成这样来访问”HelloWorld”:example.com/index.php/blog/index/
URI的第二部分是用来决定调用控制器中哪个方法的:
<?php
Class Blog extends CI_Controller{
Function __construct()
{
parent::__construct();
}
public function index()
{
echo “Hello World”;
}
Public function comments()
{
echo ‘看这里’; //这里要注意输出中文字符;需要浏览器,编辑器,以及数据库的字体格式为相同格式
}
}
?>
将URI片段传递给方法:
如果你的URI超过2个部分,那么超过的将被作为参数传递给方法。
假设URI是这样的:
example.com/index.php/products/shoes/sandals/123
URI的第3和第4部分会被传递给你的方法(“sandals”和”123”):
也就是启用URL时,不需要额外的赋值,只需写在第三第四段上给予其该有的赋值就可。
<?php
Class Products extends CI_Controller{
public function shoes($sandals,$id)
{
echo $sandals;
echo $id;
}
}
?>
上面的方法在URL访问地址中加上第三和第四个赋值参数的操作;否则出错。
当然也可以这样写:
<?php
Class function extends CI_Controller{
public function shoes($sandals=’test’,$id=’1’)
{
echo $sandals;
echo $id;
}
}
?>
这样就不需要再写URL时调用参数了
注意:如果你使用 URI 路由特性,则传递到方法中的 URI 片段将被重新路由一次。
定义默认控制器:
当在网站不存在某个URI或者用户直接从根目录访问的时候。CodeIgniter会加载默认控制器。打开application/config/routes.php文件来设置默认控制器:
$route[‘default_controller’]=’Blog’;
这里的Blog就是你希望使用的控制器名字。如果此时你不指定任何的URI片段来访问你的主页就会看到默认的”Hello World”信息。
重新定义方法的调用规则:
URI第二片段会调用控制器中的哪个方法。CodeIgniter允许你使用_remap()方法来废除这种规则:
Public function _remap()
{
//some code here…
}
注意:如果你的控制器中包含一个名为 _remap() 的方法,那么不管你的 URI 中包含什么,它总会被忽略掉。这个方法会废除掉由 URI 片段来决定哪个方法被调用的规则,允许你重新定义调用方法的规则(方法的路由规则)。
public function _remap($method)
{
if($method==’some_method’)
{
$this->$method();
}
else
{
$this->comments();
}
}
任何附加在该方法名称之后的段都会被视为_remap()的第二个参数(可选)。这个可选的数组参数可以与PHP的call_user_func_array联用,模拟CodeIgniter的默认行为。
public function _remap($method,$params=array())
{
$method=’process_’.$method;
if(method_exists($this,$method))
{
return call_user_func_array(array($this,$method),params);
}
show_404();
}
处理输出
CodeIgniter拥有一个输出类用来确保你修改的数据会自动的被传递给浏览器。关于这个的信息可以在视图和输出类里找到。有时候,可能会想自己发布修改一些最终数据或自己把它传递给浏览器。
CodeIgniter允许你的控制器增加一个名为_output()的方法来接受最终的数据。
注意: 如果你的控制器包含一个 _output() 方法,那么它将总是被调用,而不是直接输出最终的数据。这个方法类似于OO里的析构函数,不管你调用任何方法这个方法总是会被执行。
Public function _output($output)
{
echo $output;
}
请注意,你的 _output() 将接收最终的数据。 Benchmark和内存的使用率数据将被渲染,缓存文件会被写入(如果已启用缓存),并且 HTTP 头也将被发送(如果您使用该功能),然后交给 _output() 函数。
为了让你的控制器输出缓存正确, 它的 _output() 函数可以这样来写:
If($this->output->cache_expiration>0)
{
$this->output->_write_cache($output);
}
如果正在使用页面执行时间和内存使用统计的功能,这可能不完全准确,因为他们不会考虑你做的任何进一步动作。请在输出类蚕蛹可用的方法,来控制输出以使其在任何最终进程完成之前执行。
私有方法:
在某些情况下,可能想要隐藏一些方法使之无法对外查阅。将方法私有化很简单,只要在方法名字前面加一个下划线”_”做前缀就无法通过URL访问到了。例如:
private function _utility()
{
//some code
}
那么通过下面这样的URL进行访问时无法访问到的:
example.com/index.php/blog/_utility/
如何将控制器放入子文件夹中
如果是建立一个大型应用程序,CI可以很方便的将控制器放到子文件夹。
注意: 如果你要使用某个子文件夹下的功能,就要保证 URI 的第一个片段是用于描述这个文件夹的。例如说你有一个控制器在这里:
application/controllers/products/shoes.php
调用这个控制器的时候你的 URI 要这么写:
example.com/index.php/products/shoes/show/123
你的每个子文件夹中需要包含一个默认的控制器,这样如果 URI 中只有子文件夹而没有具体功能的时候它将被调用。只要将你作为默认的控制器名称在 application/config/routes.php 文件中指定就可以了。
CodeIgniter 也允许你使用 URI 路由 功能来重新定向 URI。
构造函数
如果要在你的任意控制器中使用构造函数的话,那么必须在里面加入下面这行代码:parent::__construct();
这行代码的必要性在于,你此处的构造函数会覆盖掉这个父控制器类中的构造函数,所以我们要手动调用它。
<?php
class Blog extends CI_Controller {
public function __construct()
{
parent::__construct();
}
}
?>
如果你需要设定某些默认的值或是在实例化类的时候运行一个默认的程序,那么构造函数在这方面就非常有用了。
构造函数并不能返回值,但是可以用来设置一些默认的功能。
已保留的方法名称
因为你添加的控制器类继承了主要的应用程序控制器,所以你要小心你的方法名不要和那个类中的方法名一样了,否则你的方法会覆盖原有的。详细信息请查看保留字部分。
就这样了!
OK,总的来说,这就是关于控制器的所有内容了。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式