一、MVC 框架加载过程简述
1.1、URL 路由文件
application/config/routes.php
default_controller 参数定义当URI中没有传递参数时,会加载的控制器。
$route['default_controller'] = 'home';
1.2、控制器 controller
【控制器】访问方式为http://example.com/controller_name/。
其中 index 方法是默认加载的;其他方法的加载方式,需要在【控制器名】后加【方法名】。
1.3、视图 view
【视图】的页面需要通过【控制器】加载用于页面展示。
加载方式$this->load->view('view_name',$data);
1.4、模型 model
【控制器】通过调用【模型】来进行数据处理。
加载方式$this->load->model('model_name');
1.5、MVC 开发中的注意事项
MVC 框架中的文件名首字母必须大写。
二、Codeigniter 设定自己路由规则
如果我们写的页面比较简单,比如某个控制器中只有一个方法。根据 CodeIgniter 默认的路由规则example.com/class/function/id/,这时候怎么将 function 这个占位的方法名省略掉,使URL更加好看。
Codeigniter 允许我们定义自己的URL路由规则,所以我们就对需要省略 function 方法名的控制器设定特殊的路由规则即可。
2.1、设置自己的路由规则
路由规则定义在 application/config/routes.php 文件中,在这个文件中你会 发现一个名为 $route 的数组,利用它你可以设置你自己的路由规则。 在路由规则中你可以使用通配符或正则表达式。
2.2、通配符
一个典型的使用通配符的路由规则如下:
$route['product/:num'] = 'catalog/product_lookup';
在一个路由规则中,数组的键表示要匹配的 URI ,而数组的值表示要重定向的位置。 上面的例子中,如果 URL 的第一段是字符串 “product” ,第二段是个数字,那么, 将调用 “catalog” 类的 “product_lookup” 方法。
你可以使用纯字符串匹配,或者使用下面两种通配符:
(:num) 匹配只含有数字的一段。
(:any) 匹配含有任意字符的一段。(除了 ‘/’ 字符,因为它是段与段之间的分隔符)
2.3、例子
这里是一些路由的例子:
$route['journals'] = 'blogs';
URL 的第一段是单词 “journals” 时,将重定向到 “blogs” 类。
$route['blog/joe'] = 'blogs/users/34';
URL 包含 blog/joe 的话,将重定向到 “blogs” 类和 “users” 方法。ID 参数设为 “34” 。
$route['product/(:any)'] = 'catalog/product_lookup';
URL 的第一段是 “product” ,第二段是任意字符时,将重定向到 “catalog” 类的 “product_lookup” 方法。
$route['product/(:num)'] = 'catalog/product_lookup_by_id/$1';
URL 的第一段是 “product” ,第二段是数字时,将重定向到 “catalog” 类的 “product_lookup_by_id” 方法,并将第二段的数字作为参数传递给它。
2.4、正则表达式
一个典型的使用正则表达式的路由规则看起来像下面这样:
$route['products/([a-z]+)/(\d+)'] = '$1/id_$2';
上例中,一个类似于 products/shirts/123 这样的 URL 将会重定向到 “shirts” 控制器的 “id_123” 方法。
通配符实际上是正则表达式的别名,:any 会被转换为 [^/]+ , :num 会被转换为 [0-9]+ 。
路由规则将按照它们定义的顺序执行,前面的规则优先级高于后面的规则。
路由规则并不是过滤器!设置一个这样的路由:’foo/bar/(:num)’ , Foo 控制器的 bar 方法还是有可能会通过一个非数字的参数被调用 (如果这个路由也是合法的话)。