CodeIgniter 基本概念


控制器是一个简单的类文件。顾名思义,它通过 URI 控制整个应用程序。

创建控制器

首先,进入application/controllers文件夹,你会在那里看到两个文件,index.htmlWelcome.php

保持这些文件原样,在同一路径下创建一个名为“Test.php”的新文件,在该文件中写入以下代码:

<?php 
    class Test extends CI_Controller {
  
        public function index() {
            echo "Hello World!";
        }
    }
?>

Test类继承了一个内置的名为CI_Controller的类,只要你想制作你自己的控制器类,就必须扩展这个类。

调用控制器

在浏览器中访问以下URI地址,即可调用上面的控制器:

http://www.your-domain.com/index.php/test

注意上述URI中index.php之后的 "test "一词,这表明控制器的类名,因为我们给控制器起的名字是 "Test",所以我们在index.php后面写 "test",类名必须以大写字母开始,但当我们通过URI调用控制器时,我们需要写小写字母。调用控制器的一般语法如下:

http://www.your-domain.com/index.php/controller/method-name

创建和调用构造函数方法

让我们修改上面的类并创建另一个名为“hello”的方法。

<?php 
    class Test extends CI_Controller {
	
        public function index() {
            echo "This is default function.";
        }
  
        public function hello() {
            echo "This is hello function.";
        }
    }
?>

我们可以通过以下三种方式执行上述控制器:

  • http://www.your-domain.com/index.php/test

  • http://www.your-domain.com/index.php/test/index

  • http://www.your-domain.com/index.php/test/hello

在浏览器中访问第一个 URI 后,我们得到如下图所示的输出。如你所见,我们得到了方法的输出“index”,即使我们没有将方法的名称传递给 URI。我们在 URI 中仅使用了控制器名称。在这种情况下,CodeIgniter 调用默认方法“index”。

Index output

在浏览器中访问第二个 URI,我们得到与上图相同的输出。在这里,我们在 URI 中的控制器名称之后传递了方法名称,由于该方法的名称是“index”,我们得到了相同的输出。

在浏览器中访问第三个 URI,我们得到如下图所示的输出。如你所见,我们正在获取方法的输出“hello“,因为我们已经通过了”hello” 作为方法名称,在控制器名称之后“test”在 URI 中。

Hello Output

要记住的要点

  • 控制器类的名称必须以大写字母开头;

  • 控制器必须用小写字母调用;

  • 不要使用与父类相同的方法名称,因为它会覆盖父类的功能。

视图(Views)


这可以是简单或复杂的网页,可由控制器调用。网页可能包含页眉、页脚、侧边栏等。不能直接调用视图。让我们创建一个简单的视图。在下创建一个新文件application/views与名字“test.php”并将下面给定的代码复制到该文件中。

<!DOCTYPE html> 
<html lang = "en"> 

    <head>
        <meta charset = "utf-8">
        <title>CodeIgniter View 例子</title>
    </head>
	
    <body>
        CodeIgniter View 例子
    </body>
	
</html>

更改代码application/controllers/test.php文件如下所示。

加载视图

可以通过以下语法加载视图:

$this->load->view('name');

其中 name 是正在呈现的视图文件,如果你将视图文件保存在某个目录中,那么你可以使用以下语法:

$this->load->view('directory-name/name');

没有必要将扩展名指定为 php,除非使用了 .php 以外的内容。

index()方法正在调用view方法,并将 "test "作为参数传给view()方法,因为我们已经将HTML代码保存在application/views/test.php下的 "test.php"文件中。

<?php 
    class Test extends CI_Controller {
	
        public function index() {
            $this->load->view('test');
        }
    }
?>

下面是上面代码的输出:

Test output

下面的流程图说明了一切是如何工作的:

Flow Chart

模型(Models)


模型类旨在处理数据库中的信息,例如,如果你在应用程序中使用 CodeIgniter 管理用户,那么你必须有模型类,其中包含插入、删除、更新和检索用户数据的函数。

创建模型类

模型类保存在application/models目录,以下代码展示了如何在 CodeIgniter 中创建模型类:

<?php 
    Class Model_name extends CI_Model {
	
        Public function __construct() {
            parent::__construct();
        }
    }
?>

其中 Model_name 是你要提供的模型类的名称,每个模型类都必须继承 CodeIgniter 的 CI_Model 类,模型类的第一个字母必须是大写字母。以下是用户模型类的代码。

<?php 
    Class User_model extends CI_Model {
	
        Public function __construct() {
            parent::__construct();
        }
		
    }
?>

上述模型类必须保存为User_model.php,类名和文件名必须相同。

加载模型

模型可以在控制器中调用,以下代码可用于加载任何模型。

$this->load->model('model_name');

其中model_name 是要加载的模型的名称,加载模型后,你可以简单地调用其方法,如下所示。

$this->model_name->method();

自动加载模型

在某些情况下,你可能需要在整个应用程序中使用某个模型类。在这种情况下,我们最好自动加载它。

/*
| ---------------------------------------------------------------
|  Auto-Load Models
| ---------------------------------------------------------------
| Prototype:
|
|   $autoload['model'] = array('first_model', 'second_model');
|
| You can also supply an alternative model name to be assigned
| in the controller:
|  
|   $autoload['model'] = array('first_model' => 'first');
*/
$autoload['model'] = array();

如上图所示,在要自动加载的数组中传入模型的名称,它会自动加载,而系统处于初始化状态并且可以在整个应用程序中访问。

助手(Helpers)


顾名思义,它将帮助你构建系统,它被分成小功能以提供不同的功能。

助手通常保存在你的 system/helpers 或者 application/helpers 目录,自定义助手保存在 application/helpers 目录和系统的助手保存在 system/helpers 目录。 无论是自定义的还是系统的助手,在使用之前都必须加载。

序号助手和描述
1

Array Helper

Array Helper 文件包含有助于处理数组的函数。

2

CAPTCHA Helper 

CAPTCHA Helper 文件包含有助于创建图形验证码(CAPTCHA )的功能。

3

Cookie Helper

Cookie Helper 文件包含有助于处理 cookie 的函数。

4

Date Helper

Date Helper 文件包含帮助你处理日期的函数。

5

Directory Helper

Directory Helper 文件包含有助于处理目录的函数。

6

Download Helper

Download Helper 可让你将数据下载到本地。

7

Email Helper

Email Helper提供了一些处理电子邮件的辅助功能。如需更强大的电子邮件解决方案,请参阅 CodeIgniter 的电子邮件类。

8

File Helper

File Helper 文件包含有助于处理文件的函数。

9

Form Helper

Form Helper 文件包含帮助处理表单的函数。

10

HTML 助手

HTML Helper 文件包含有助于处理 HTML 的函数。

11

Inflector Helper

Inflector Helper 文件包含允许你将单词更改为复数、单数、驼峰式大小写等的功能。

12

Language Helper

Language Helper 文件包含有助于处理多语言的函数。

13

Number Helper

Number Helper 文件包含帮助你处理数字数据的函数。

14

Path Helper

Path Helper 文件包含允许你使用服务器上的文件路径的函数。

15

Security Helper

Security Helper 文件包含与安全相关的功能。

16

Smiley Helper

Smiley Helper 文件包含可让你管理笑脸(表情符号)的功能。

17

String Helper

String Helper 文件包含有助于处理字符串的函数。

18

Text Helper

Text Helper 文件包含有助于处理文本的函数。

19

Typography Helper

Typography Helper 文件包含以语义相关的方式帮助你格式化文本的函数。

20

URL Helper

URL Helper 文件包含有助于处理 URL 的函数。

21

XML Helper

XML Helper 文件包含有助于处理 XML 数据的函数。

加载助手

可以如下图加载一个助手:

$this->load->helper('name');

其中 name 是助手的名称。例如,如果你想加载 URL Helper,那么它可以加载为:

$this->load->helper('url');

路由(Routing)


CodeIgniter 具有用户友好的 URI 路由系统,让你可以轻松地重新路由 URL,通常URL 字符串与其对应的控制器类/方法之间存在一对一的关系,URI 中的段通常遵循以下模式:

your-domain.com/class/method/id/
  • 第一段表示应该被调用的控制器类。

  • 第二段表示应该调用的类函数或方法。

  • 第三段,以及任何其他段,表示 ID 和将传递给控制器的任何变量。

在某些情况下,你可能希望更改此默认路由机制。 CodeIgniter 提供了工具,你可以通过它来设置自己的路由规则。

自定义路由规则

有一个特定的文件可以处理所有这些。该文件位于 application/config/routes.php。你将找到一个名为 $route 的数组,你可以在其中自定义路由规则。 $route 数组中的键将决定路由的内容,值将决定路由的位置。 CodeIgniter 中有三个保留的路由。

序号保留路由和说明
1

$route['default_controller']

如果 URI 不包含数据,则此路由指示应加载哪个控制器类,当人们加载你的根 URL 时就是这种情况。鼓励你使用默认路由,否则默认情况下会出现 404 页面。我们可以在此处设置网站主页,以便默认加载。

2

$route['404_override']

这个路由表明,如果请求的控制器没有找到,应该加载哪个控制器类,它将覆盖默认的404错误页面。但它不会影响到show_404()函数,将继续加载application/views/errors/error_404.php中的默认error_404.php文件。

3

$route['translate_uri_dashes']

从布尔值可以明显看出,这并不完全是一个路径。此选项使你能够在控制器和方法 URI 段中用下划线自动替换破折号 ('-'),从而在需要时为你节省额外的路由条目。这是必需的,因为破折号不是有效的类或方法名称字符,如果你尝试使用它,将导致致命错误。

路线可通过使用通配符正则表达式来定制,但请记住,这些自定义路由规则必须在保留规则之后。

通配符

我们可以使用两个通配符,解释如下:

  • (:num): 会匹配一个只包含数字的段。

  • (:any): 匹配包含任意字符的段。

$route['product/:num']='catalog/product_lookup';

在上面的示例中,如果在 URL 的第一段中找到文字词“product”,而在第二段中找到一个数字,则使用“catalog”类和“product_lookup”方法代替。

正则表达式

像通配符一样,我们也可以在$route数组的key使用正则表达式。如果任何URI与正则表达式相匹配,那么它将被路由到设置在$route数组的值部分。

$route['products/([a-z]+)/(\d+)']='$1/id_$2';

在上面的示例中,类似于 products/shoes/123 的 URI 将改为调用“shoes”控制器类和“id_123“ 方法。