CodeIgniter 中国开发者社区诚征热爱 CI 的版主

查看完整版本: CodeIgniter 的基本架构

Hex 2007-10-15 13:21

CodeIgniter 的基本架构

[b]作者[/b]: tzangms

  先来介绍一下 CodeIgniter 的基本架构好了, 所以先来说明一下 CI 的页面是怎么做的。由于使用 MVC 架构, 所以最主要的就是 Controller, 程式透过 Controller 来呼叫 Model 存取资料库, 然后在指定 View 输出, 这样一来, Controller 就可以变得很简单。以制作 Blog 为例, Blog 的首页通常都会显示最新的 10 篇文章, 就以这个简单的范例来说明。不过在这里先只讨论 Controller 部份。
  基本上, 每个 Controller 都是一个 Class, 在每个 Class 里面的 function 都是一个页面, 嗯, 这个概念很重要! 先来看看下面这一段, 应该就会比较清楚。
[code=PHP]<?php
class Blog extends Controller{
    function index(){
        $this->load->model('blog_model');
        $data = $this->blog_model->get_lastest_entries();

        $this->load->view('blog', $data);
    }

    function post($id){
        echo "这里是第 $id 篇文章";
    }
}
?>[/code]
在上面这段程式码, 可以看到是一个叫做 Blog 的 Class, 里面包含了 index 以及 post 两个 function。先来说明比较简单的 post 好了, 在先前有提到, 在 Class 中的 function 其实就是一个页面, 不像以往, 一个 php 档案就是一个页面。

接着来看看要如何存取 post 这个页面, 首先看到下面这个网址

    http://domain/blog/post/26

这个网址在 domain 后面的部份, 一开始接的是 “blog”, 没错, 指的就是刚才上面写的 Blog Class, 接着是 “post” 就是在 Class 中看到的 post function, 再后面的 “26〃 就是要传给 post function 的 $id 变数, 也就是第 26 篇文章, 所以只要输入上面的网址, 就可以执行 Blog class 中的 post function, 而输出的结果就跟程式中看到的一样, 会直接输出一行文字, 如下:

    这里是第 26 篇文章

看到这边大概就知道 CI 的 Controller 是怎么运作的吧? 好, 接着再来看看 index 这个 function, 存取 index 页面的网址如下

    http://domain/blog/index

或更简短

    http://domain/blog

只要输入上面这个网址就会显示出 index 这个 function 所产生的页面, 也就是显示最新的 10 篇 blog 文章。另外, 由于 index 是 CI 预设的首页, 所以存取这个页面的网址可以比 post 更简短, 不过这个 index function 未免也太简洁了吧!? 没错, 使用 CI 就是那么简洁 :D

接下来来说明一下 index 里的程式码, 可以看到 index function 里总共只有 3 行, 先来看看第一行:

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

在这里大家先知道, 这里是在载入一个叫做 blog_model 的 Model, 而 Model 主要的工作就是在存取资料库。接下来第二行如下:

$data = $this->blog_model->get_lastest_entries();

在这里就先想像一下 blog_model 中, 已经写好一个叫做 get_latest_entries 的 function, 会取出最新的 10 篇文章然后 return。而在上面可以看到, 最后会将取出的资料传给 $data 这个变数, 接着在最后一行, 将 $data 一起输出给 View, 这样一来就完成了 Blog 首页啦!! 当然 View 的部份也就不先说明了。不过还是列一下如和载入要显示的 View, 并先前透过 get_latest_entries 所取出的资料一起透过 View 输出。

$this->load->view('blog', $data);

基本上 Controller 就是长得这样, 在一个 Controller (Class) 中包含许多页面(function), 这么一来, 把相关的页面写在同一支 Controller 中, 是不是比较好维护呢? 另外使用 MVC 架构, Controller 看起来也会简洁许多。

guangzhou 2007-10-16 00:24

谢谢分享这么好的说明。

Hex 2007-10-16 09:42

呵呵,希望常来 CI 粉丝的家,呵呵。

kele_87 2007-10-16 22:11

其实我的ZF改进版权是很像的..
不知这个CI对URI的处理是不是很灵活了?
比如一个URI有多个参数
cid=1&pn=4&itemtype=3&by=desc...........
这等是怎么处理的??

Hex 2007-10-17 09:19

CI 的 URL 一般是分段处理的,/index.php/控制器类/方法/参数1/参数2/参数3/....
一般不使用 URL 参数,如果使用也是可以定义的,不过我觉得对于 SEO 效果不如分段好。

sam 2007-10-31 16:18

很经典呀

5楼说“一般不使用 URL 参数,如果使用也是可以定义的”,要使用的话怎么定义?

Hex 2007-11-1 10:37

在 config.php 里配置以后,可以使用 ?xxx=xxx&xxx=xxx 这种参数。

姜运涛 2007-11-7 14:56

直接用$this->uri->segment(n)就行了

Hex 2007-11-7 17:11

呵呵,楼上的他意思是要用普通的 URL 参数吧,不是分段这种,呵呵 ~~

jgcao 2007-11-11 17:02

[quote]原帖由 [i]Hex[/i] 于 2007-11-1 10:37 发表 [url=http://codeigniter.org.cn/forums/redirect.php?goto=findpost&pid=82&ptid=2][img]http://codeigniter.org.cn/forums/images/common/back.gif[/img][/url]
在 config.php 里配置以后,可以使用 ?xxx=xxx&xxx=xxx 这种参数。 [/quote]

请问一下如何设置,具体参数是什么?谢谢先!!

Hex 2007-11-12 09:43

[code=PHP]/*
|--------------------------------------------------------------------------
| Enable Query Strings
|--------------------------------------------------------------------------
|
| By default CodeIgniter uses search-engine friendly segment based URLs:
| [url]www.your-site.com/who/what/where/[/url]
|
| You can optionally enable standard query string based URLs:
| [url]www.your-site.com?who=me&what=something&where=here[/url]
|
| Options are: TRUE or FALSE (boolean)
|
| The two other items let you set the query string "words" that will
| invoke your controllers and its functions:
| [url]www.your-site.com/index.php?c=controller&m=function[/url]
|
| Please note that some of the helpers won't work as expected when
| this feature is enabled, since CodeIgniter is designed primarily to
| use segment based URLs.
|
*/
$config['enable_query_strings'] = FALSE;
$config['controller_trigger'] = 'c';
$config['function_trigger'] = 'm';[/code]
在 config.php 里设置,$config['enable_query_strings'] = TRUE; 就可以使用 URL 参数了,下面两个选项是控制器用c=xxxx,控制器方法用m=xxxx,上面的注释说的也很清楚。

sam 2007-12-15 09:14

恩。。觉得两种url传参数的方式都不错。。。。:)

特蓝克斯 2008-3-7 09:16

建议还是适用分段传递参数的方法,这样更好,适合SEO的胃口。

xhq6632 2008-3-24 10:14

谢谢分享,收到了,继续加油

fumaoyue 2008-4-12 15:09

得考虑以后的REST。

wnpers 2008-5-13 10:40

嘿嘿 不错哦                  :lol

NightCreator 2008-5-28 21:39

跟JAVA的MVC实现起来还是挺像的,呵呵~

NightCreator 2008-5-28 21:42

对CI的事务机制的实现更感觉兴趣,有空一定会看一下:loveliness:

jerry051 2008-6-11 22:02

总数怎么能用$id啊?

既然数据是存放在数据库中,总会有GRUD的操作吧?从中间删掉几条记录,你取的$id还能是总数吗?

webyjh 2008-7-15 15:14

感谢hex提供这么详细的教程

ifour333 2008-7-15 16:25

看了 Hex 的这篇文章 感觉 Controller  就像一个机器手 从左边拿流水线上做好的产品 放到 右边的成列柜上
不知道我的比喻是不是让更多人了解了 MVC模式那?

蚂蚁 2008-7-31 09:56

学习~~~~~~~~~~~~~~

degoogle 2008-8-19 09:41

回复 3楼 的帖子

学习,在学习,努力,在努力

zgs522 2008-8-28 10:18

例子都没有,学习起来难

ttdemon 2008-9-5 15:05

:lol 新手...越少代码..越好明白..:handshake
想看更多的实例..讲解

keer2345 2008-9-26 23:37

一般人我不回复一般人我不回复

ttl_web 2008-9-29 15:59

已下载,
正在学习中。。。。
谢谢

zhangbo 2008-10-30 15:23

看完了 感谢楼主

:lol 看完了 受益匪浅 感谢楼主
现在对CI很感兴趣了:lol

原味的夏天 2008-10-31 16:20

:lol :lol :lol :lol
页: [1]
查看完整版本: CodeIgniter 的基本架构