20.5 CodeIgniter框架应用
从20.4节介绍的4个框架中,本书选择CodeIgniter为例进行讲解。通过前面几小节的内容,读者已经了解到CodeIgniter是一个为用PHP编写Web应用程序的人员提供的工具包。它的目标是实现比从零开始编写代码更快速地开发项目,为此,CodeIgniter提供了一套丰富的类库来满足通常的任务需求,并且提供了一个简单的接口和逻辑结构来调用这些库。CodeIgniter可以将需要完成的任务代码量最小化,这样开发人员就可以把更多的精力放到项目的开发上。另外,CodeIgniter提供了非常完善的文档,读者通过这些文档可以快速学习、理解CodeIgniter,并且可以在开发中高效使用CodeIgniter框架。
20.5.1 CodeIgniter的技术特点介绍
CodeIgniter在设计之初就有其明确的目标,这个目标就是在最小化、最轻量级的开发包中得到最大的执行效率、功能和灵活性。为了这个目标,CodeIgniter在开发过程的每一步都致力于基准测试、重构和简化工作,拒绝加入任何无助于目标的东西。
从技术和架构角度看,CodeIgniter按照下列目标创建。
·动态实例化。在CodeIgniter中,组件的导入和函数的执行只有在被要求的时候才进行,而不是在全局范围。
·松耦合。耦合是指一个系统的组件之间的相关程度。组件互相依赖越少,那么系统的重用性和灵活性就越好。CodeIgniter的目标就是构建一个非常松耦合的系统。
·组件单一性。单一是指组件有一个非常小的专注目标。在CodeIgniter里面,为了达到最大的用途,每个类和它的功能都是高度自治的。
CodeIgniter是基于模型、视图、控制器这一设计模式的,从前面的学习当中,读者了解到该模式将应用程序的逻辑层和表现层进行分离。在实践中,由于表现层从PHP脚本中分离了出来,所以它允许网页中只包含很少的PHP代码。
在CodeIgniter中,模型(Model)代表数据结构,包含取出、插入、更新数据库的这些功能。视图(View)通常是一个网页,但是在CodeIgniter中,一个视图也可以是一个页面片段,如头部、顶部HTML代码片段。它还可以是一个RSS页面,或其他任一页面。控制器(Controller)相当于一个指挥者,或者说是一个“中介”,它负责联系视图和模型以及其他任何处理HTTP请求和产生网页的资源。
20.5.2 安装CodeIgniter
CodeIgniter安装分为如下4个步骤。
(1)解压缩安装包。
(2)把CodeIgniter文件夹和里面的文件部署到服务器,通常,index.php位于应用服务器的根目录。
(3)编辑application/config/config.php文件,设置基本URL。
(4)如果需要使用数据库,编辑application/config/database.php,在这个文件中设置数据库参数。
下面介绍CodeIgniter框架的组织结构。从官方网站下载CodeIgniter框架,解压缩后可以看到最主要的一个目录是system,该目录就是CodeIgniter框架的目录。除此之外,还有一个index.php文件,该文件用来做一些初始化配置,它还起到处理HTTP请求的作用。
20.5.3 CodeIgniter的Controller
在CodeIgniter中,一个Controller就是一个类文件,Controller所属的类和普通的PHP类几乎没有区别,唯一的区别在于Controller类的命名方式,它所采用的命名方式可以使该类和URI关联起来。例如如下URL地址,就说明了这个问题。
www.mysite.com/index.php/news/
当访问到上面这个地址时,CodeIgniter会尝试找一个名叫news.php的控制器(Controller),然后加载它。当一个Controller的名字匹配URI段的第一部分,即news时,它就会被加载。代码20-4演示创建一个简单的Controller类。
代码20-4 使用CodeIgniter的Controller hello.php
01 <?php 02 class Hello extends Controller 03 { 04 function index() // 方法index() 05 { 06 echo 'Hello World!'; 07 } 08 } 09 ?>
把它保存在application/controllers/目录下,通过浏览器访问地址http://localhost/ch20/index.php/hello,可以看到如图20-4所示的执行结果。
注意 在CodeIgniter中,类名首字母必须大写。
例如如下代码写法就是不正确的。
<?php class hello extends Controller { //do something } ?>
【代码解析】代码20-4定义了一个Hello类,它继承自Controller类。Controller类是CodeIgniter控制器基类,所有控制器都从这个类派生。这个例子中用到的方法名是index()。如果URI的第二部分为空,会默认载入“index”方法,也就是说,也可以将地址写成http://localhost/ch20/index.php/hello/index来访问hello.php。
由此可知,URI的第二部分决定调用控制器中的哪个方法,代码20-5演示了在Hello控制器中加入了其他方法。
代码20-5 为Controller添加方法hello.php
01 <?php 02 class Hello extends Controller 03 { 04 function index() // 方法index() 05 { 06 echo 'Hello World!'; 07 } 08 09 function saylucky() // 添加方法saylucky() 10 { 11 echo 'It's time to say "Good Luck"!'; 12 } 13 } 14 ?>
【代码解析】 代码第09~13行添加了一个方法saylucky(),此时通过地址http://localhost/ch20/index.php/hello/saylucky访问hello.php可以看到如图20-5所示的效果。
图20-4 Controller的使用
图20-5 为Hello控制器添加方法
如果URI超过两个部分,那么超过的部分将被作为参数传递给相关方法。例如地址www.mysite.com/index.php/products/shoes/sandals/123,URI中的sandals和123将被当作参数传递给products类的方法shoes。代码20-6演示了这种用法,仍然以hello.php为例。
代码20-6 向Controller的方法传递参数hello.php
01 <?php 02 class Hello extends Controller 03 { 04 function index() // 方法index() 05 { 06 echo 'Hello World!'; 07 } 08 09 function saylucky() // 方法saylucky() 10 { 11 echo 'It's time to say "Good Luck"!'; 12 } 13 14 function sayhello($name) // 添加带参数的方法sayhello() 15 { 16 echo "Hello, $name !"; 17 } 18 } 19 ?>
【代码解析】第14~17行创建的sayhello()方法带一个参数,假设为方法sayhello()传递参数“michael”,通过地址http://localhost/ch20/index.php/hello/sayhello/michael访问hello.php,可以看到如图20-6所示的结果。
图20-6 向方法传递参数
20.5.4 CodeIgniter的Model
在CodeIgniter中,Model是专门用来和数据库打交道的PHP类。通常在Model类里包含插入、更新、删除数据的方法。CodeIgniter中的Model类文件存放在application/models/目录下,可以在里面建立子目录。最基本的Model定义代码如下。
class Model_name extends Model { function Model_name() { parent::Model(); } }
其中,Model_name是模型类的名字,类名的首字母必须大写,并且确保自定义的Model类继承了基本Model类。Model类的文件名应该是Model类名的小写版,比如一个Model类是的代码如下。
class User extends Model { function User_model() { parent::Model(); } }
那么该Model类对应的文件名是application/models/user.php。Model通过Controller载入,代码如下。
$this->load->model('Model_name');
其中,Model_name是要载入的Model类的名字。模型载入后,就可以通过如下代码所示的方法使用。
$this->load->model('Model_name'); $this->Model_name->function();
20.5.5 CodeIgniter的View
在CodeIgniter中,从不直接调用视图,视图必须被一个控制器来调用。
(1)使用文本编辑器创建一个名为helloview.php的文件,如代码20-7所示。
代码20-7 视图文件helloview.php
01 <html> 02 <head> 03 <title>Welcome - helloview.php</title> 04 </head> 05 <body> 06 <h1>Hello everyone!</h1> 07 </body> 08 </html>
【代码解析】 这是一段简单的HTML代码,只用标题输出一句话。
(2)将该代码保存到application/views/目录下。然后使用某个方法载入该视图文件。这个方法的用法如下。
$this->load->view('name')
(3)这行代码中,name是需要载入的视图文件的名字,文件的后缀名没有必要写出。接下来,在hello控制器的文件hello.php中写入这段用来载入视图的代码,此时完整的hello.php如代码20-8所示。
代码20-8 在Controller中载入视图hello.php
01 <?php 02 class Hello extends Controller 03 { 04 function index() // 方法index() 05 { 06 $this->load->view('helloview'); 07 } 08 09 function saylucky() // 方法saylucky() 10 { 11 echo 'It\'s time to say "Good Luck"!'; 12 } 13 14 function sayhello($name) // 带参数的sayhello() 方法 15 { 16 echo "Hello, $name !"; 17 } 18 } 19 ?>
【代码解析】上述代码创建了3个方法,其中第3个方法带一个参数$name。最重要的是第06行代码,载入前面创建好的helloview视图。
(4)此时再通过地址http://localhost/ch20/index.php/hello浏览hello.php,将看到如图20-7所示的执行结果。
(5)通过这段代码,读者可以了解如何载入一个视图。但视图中经常需要动态数据的内容,下面就介绍如何处理含有动态数据的视图。动态数据通过控制器以一个数组或对象的形式传入视图,这个数组或对象作为视图载入方法的第2个参数,如代码20-9所示。
代码20-9 向视图中添加动态数据hello.php
01 <?php 02 class Hello extends Controller 03 { 04 function index() // 方法index() 05 { 06 $data['title'] = "New Title - Hello.php"; 07 $data['heading'] = " 大家好,欢迎使用CodeIgniter 框架!"; 08 $this->load->view('helloview1',$data); 09 } 10 11 function saylucky() // 方法saylucky() 12 { 13 echo 'It\'s time to say "Good Luck"!'; 14 } 15 16 function sayhello($name) // 带参数的sayhello() 方法 17 { 18 echo "Hello, $name !"; 19 } 20 } 21 ?>
【代码解析】第06、第07两行定义了数组$data的两个元素,这两个元素分别是页面的标题和页面的文本内容。代码第08行向载入视图的方法view()传入第2个参数,该参数即代码前两行定义的数组。
(6)此时访问hello.php会看到如图20-8所示的执行结果,可以看出,浏览器上的页面标题和页面的heading文字都更换成了动态数据内容。
图20-7 在Controller中载入视图
图20-8 向视图添加动态数据
(7)最后还需要修改helloview.php,在其中添加输出数据的PHP代码,修改后按helloview1.php保存在application/views/目录下,修改后的代码如下。
01 <html> 02 <head> 03 <title><?php echo $title; ?></title> 04 </head> 05 <body> 06 <h1><?php echo $heading; ?></h1> 07 </body> 08 </html>
【代码解析】第03行和第06行是有输出数据的PHP代码。
至此,已经向读者介绍了CodeIgniter最简单的用法,离实际应用开发还很远,读者需要通过CodeIgniter提供的手册进一步学习,理解CodeIgniter框架。
共有条评论 网友评论