设为首页收藏本站
查看: 106|回复: 0

[PHP] 使用CodeIgniter框架快速开发PHP应用(三)

[复制链接]

论坛元老

Rank: 6Rank: 6

积分
34274
主题
17031
UID
1347
M币
67
贡献
17176

  • 发表于 2013-12-27 11:07:00 | 显示全部楼层 |阅读模式
    分析网站结构

    既然我们已经安装 CI ,我们开始了解它如何工作。

    读者已经知道 CI 实现了MVC式样。 通过对目录和文件的内容进行分类, 而不是让代码大块大块地纠集在一起。

    这一章,我们将会对 MVC 理论做个简短的介绍, 然后再介绍 CI 的MVC实现方式。特别地,要了解那些目录和文件如何互相交换信息?网站结构是怎样的?以及CI是如何自如地动作于其中的?

    这一章将会介绍:

    。MVC 如何架构一个动态网站

    。CI如何接收和分析request以及如何调配指定的代码来reponse

    。这些指定的代码如何编制

    。CodeIgniter 语法

    。CI提供的各种类和函数,你自己编写的类和函数

    。如控向controllers传递URL参数

    。如何编写运行良好的视图并把动态内容传递给它们。

    。如何返回信息给上网者

    。文件和类如何传递信息和互相调用

    。助手类文件有什么用?

    。有助于网站设计的一些特别提示


    MVC-到底有什么用?

    MVC,在本文领域内,指的是一个动态网站的组织方法。 设计模式是1979年由挪威人,Trygve Reenskaug首次提出来的,这里是一些概要:

    。模型是包含数据的对象,他们与数据库交互,对这些数据进行存取,使其在不同的阶段包含不同的值,不同的值代表了不同的状态,具有特定的含意。

    。视图显示模型的状态,他们负责向使用者显示数据。(虽然他们通常是 HMTL 视图, 但是,他们可能是任何形式的接口。 比如PDA屏幕或WAP手机屏幕)

    。控制器用来改变模型的状态,他们操作模型,提供动态的数据给视图。

    CI框架包含模型、视图和控制器的子目录。 他们里面的每个文件都有.php文件后缀, 包含有特定命名约定的类。

    CI 帮助你遵循MVC的约定, 使你更有效地组织代码。 CI允许你有最大的灵活性,你可以获得 MVC 结构的所有好处。

    当你编程的時候,试着始终用 MVC 来思考问题。尽可能确保你的 '视图' 聚焦于显示,  '控制器'纯粹地用来控制数据流。 把应用逻辑保留在数据模型和数据库中。

    这样,如果你决定开发新的视图,你不必在任何一个控制器或模型中修改代码。 如果你需要更新 '商业规则' ,你只需要在模型中修改代码。

    另一方面,你必须认识到,MVC只是用来帮助你的一种设计方式,而不是用来约束你的。MVC可以有不同的实现方式。CI 论坛包含许多如何 '正确合理'地实现 MVC 的方式。 ( 我应该在控制器部分实现数据库查询功能吗?我能直接从视图发送数据到模型层吗?或者我必须通过控制器来访问?)

    与其寻找理论上的正确方式,不如遵循二项有用的原则。 这些在 CI 用户手册上有相关描述:

    。松藕合: 类之间尽可能不要彼此依赖。

    。组件智能化: 智能化是组件独立实现特定目标的能力。在 CI框架中,每个类和它内部的函数高度地自治。

    这些是Rick开发CI要实现的目标, 他们也会成为你开发你自己的网站时的目标。实现这些目标之后,你代码中使用这些类时就不需要担心有什么副作用了。

    CI做到了这一点,我的经验是那助手类和类库中的其它类使用用起来十分容易,工作起来效果也不错。

    因此, 如果你的控制器直接操作数据库, 或你的在模型层调用视图, CI 代码将会以适当的方式工作-通常没有技术上的问题-但是从MVC理论来看这样似乎是 '不正确的'. 不要烦恼,如果非要这样做,做吧!

    CI 的网站结构: 控制器和视图

    你的整个 CI 网站是动态的。 就是, 可能找不到制作 '静态' 网页的简单的 HTML 代码。 (如果需要你可以添加,但是他们将会在 CI 结构之外.) 那么, 你的网站文件到底在哪里?

    当我们安装 CI 的时候,我们注意到应用目录包括名为models、views和controllers的子目录。 每个 CI 框架应用都包含这三大类型。

    让我们看看内部细节。

    再次强调我们并不处理静态网页和对应的URL,我们将会给你看CI如何分析URL请求和如何响应它。 首先,考虑一个正常的英特网请求。用户建立一个连接到你的网站: www.example.com,

    然后经过端口发出一个如下的HTTP request:

    GET /folder/file.html HTTP/1.0

    GET是请求的类型, HTTP/1.0 指定 HTTP 协议的版本, 中间是相对路径和文件名。但是在你的网站上,找不到简单的静态 HTML 文件。取代它的,所有的收入请求被 index.php 文件拦截并进行处理。

    如果使用者正在以正确的URL在你的网站上位置上请求页面-一般是通过点击你网页上的超级链接-request一般看起来象这样:

    GET /index.php/tests/showall HTTP/1.0

    如果使用者不知道精确的URL, CI 会设定一个默认页面(我们一会儿就告诉你怎么做.)

    CI的处理步骤是:

    +--------------------------------+
    | internet request comes in:     |
    | "GET http://127.0.0.1"         |
    +--------------------------------+
                     |
                     v
    +--------------------------------+
    | Router:decides which controller|
    | should handle this request     |
    +--------------------------------+
                     |
                     v
    +--------------------------------+        +-------------------+
    | Controller: analyzes the       | -----> |                   |
    | request and responds:maybe     |        |Model:provides data|
    | by getting data from the model | >----- |                   |
    +--------------------------------+        +-------------------+
                     |
                     v
    +--------------------------------+
    | View:formats the response      |
    | (in this case as an HTML page) |
    +--------------------------------+
                     |
                     v
    +--------------------------------+
    | Page is served up to enquirer  |
    +--------------------------------+

             
    一个从英特网到你的网站根目录的请求被 index.php 文件拦截,作用就象一个“站由器”。 换句话说, 它调用一个 '控制器', 然后返回一个'视图'.

    “路由器”怎么知道调用哪一个控制器? 就象我们已经见到的,有时候request本身包含的信息会告诉它调用哪个控制器。 举例来说,如果请求说:

    GET http://127.0.0.1/index.php/welcome/index

    并且如果你有一个控制器叫做welcome,这就是被调用的控制器。

    welcome控制器

    所以, 让我们看welcome控制器。 它被存放在如下路径:

    system/application/controllers/welcome.php

    它的内容是这样的:

       PHP复制代码
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    在我站开通SVIP可同时获得17个站点VIP资源 立即登录 立即注册
    快速回复 返回顶部 返回列表