PHP框架如何促成MVC情势以至单后生可畏入口

MVC的组成部分:

这里不详细讲解何为MVC模式,只是简单介绍,关于MVC的具体信息可以去网络上找寻,MVC模式在我理解来它将一个项目分解成三部分,分别是Model(模型),View(视图),Controller(控制器),这三个单词的缩写组合即为MVC.MVC是一种普遍的软件敏捷开发模式,在许多领域特别是桌面编程领域早已经得到了广泛的应用,然而在像php一样的脚本语言中比较难以实现,特别是几年前在脚本语言中很难看到MVC的实现,但是今年随着众多框架的涌现,MVC在各个框架中得到了初步实现,其他框架中的实现方式暂且不提,这里只是介绍codeigniter是如何实现MVC的.

 

以下内容从兄弟连的CI教学视频中摘抄:

模型
代表你的数据结构。通常来说,你的模型类将包含取出、插入、更新你的数据库资料这些功能。
视图 是展示给用户的信息。一个视图通常是一个网页。 控制器
是模型、视图以及其他任何处理 HTTP
请求所必须的资源之间的中介,并生成网页。 举例
比如一批统计数据你可以分别用柱状图、饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。

  关于单一入口

ci下载的开发包:

CI的特点: 简单:CodeIgniter是经过 Apache/BSD-style
开源许可授权的,只要你愿意就可以使用它。阅读 许可协议
可获得更多的信息()
免费:CodeIgniter是真正的轻量级。我们的核心系统只需要一些非常小的库,这与那些需要更多资源的框架完全相反
MVC:CodeIgniter使用了模型-
控制器的方法,这样可以更好地使表现层和逻辑层分离。 特别注意:

  单一入口指在一个网站(应用程序)中,所有的请求都是指向一个脚本文件的,例如CI中的http:\localhostindex.php,所有对应用程序的访问都是必须通过这个入口,正是单一入口才使得MVC模式得以实现,因为当你访问index.php的时候,应用程序会做大量的初始化工作,调用大量的基础类库,并根据index.php后面的参数加载控制器,然后加载试图,模型等内容信息.

 

 

每个控制器都是一个 类Class, 在每个 Class 里面的 function 都是一个页面,
嗯, 这个概念很重要! 入口方法:

  ci的所有文件加载都要经过控制器调用,因为控制器是CI中的超类,也就是其他的类都依附于它,所以用单一入口方式访问CI应用程序的时候,需要在index.php的后面加上控制器名和控制器中的方法名,如果你对于此没有任何概念或者无法理解,可以去CI的官方网站下载它的官方文档,然后详细了解它的工作方式

图片 1


入口——>控制器——>方法——>参数 localhost/index.php/welcome/index
控制器: 1、到底什么是控制器 简而言之,一个控制器就是一个类文件
用户通过URL访问的就是某个控制器类中的具体成员方法
并由这个方法中的代码去做某些操作

  CI的官方文档非常详尽易懂,这里描述的是文档上所不存在的基本原理部分.

 

 

2、如何创建控制器 a.创建文件夹applicationcontrollers
b.类名必须以大写字母开头 c.继承核心的控制器类CI_Controller

  开始

phpstudy的部署:

Codeigniter框架

3、创建方法 a.就是创建一个成员方法function() b.默认访问的是index方法

  或许应该先讲解CI的控制器是如何工作的,CI中的一个控制器就是用户编写的一个类,它继承自系统的Controller类,例如假设我们要构建一个可以通过http:\localhostindex.phpcontrolfuncm1m2访问的页面,我们需要做哪些工作呢,首先我们要在systemapplicationcontrollers文件夹下新建一个文件contro.php文件,这个文件即是我们要访问的控制器类所在文件,在此文件中创建以下内容:

phpstudy的根目录是:D:WWW

 

4、URL如何传递参数给方法 方法段后的按次序传入方法中的形式参数

  1 class Controller extends Controller 2 3
nController()45parent::Controller(); 6 7 8 n
func($m1,$m2)910$this->load->model(“MSomemodel”,””,TRUE);11$data[“data1”]=$this->MSomemodel->getvalue();12$this->load->view(“welcome”,$data);131415

新建目录 cms 


配置CI:

  这并不是一个控制器的基本组成部分,而是包含了model和view的一个控制器例子,

把ci开发包的application   system index.php  license.txt
copy到cms目录下面;

 

1.在CI官网下载最新版的CI框架,目前最新版的是2.13版本
2.解压之后,有三个文件夹: application
开发要用到的配置文件,Model,VIew,Control 的等文件…… system CI框架源码
user_guide 用户手册 index.php CI的接口文件 3.根目录建立一个文件夹ci,把
application ,system和index.php复制到 ci下,这个文件夹,自己可以随便写
4.然后访问: localhost/ci 实际访问路径——>
localhost/ci/index.php/welcome/index

  首先注意控制器的类名应该是首字母大写的,然后在类的构造函数里应该调用父类的构造函数,之后则是func()方法,也就是url后面所带参数的第二个部分,这个方法带有两个参数,这两个参数的值就是url的第三部分和第四部分的值,也就是单一入口的访问方式实际是:http:\localhostindex.php控制器名方法名方法的参数1方法的参数2……

运行phpstudy,php版本选择5.4以上,因为在readme.rst中阅读到,php的版本最好是在5.4以及以上最佳;

                                                                           
讲师:邹义良

这样就可以用了,具体使用说明如下:

  在控制器类中每个方法代表一个页面,也就是可以将很多类似的操作放到一个控制器中,实现对操作的统一

 

                                                                   
微博:weibo.com/it266

1.上边讲到它访问的入口方法 入口——>控制器——>方法——>参数

  在上述的例子中的func()方法中的其他部分分别加载了model和view,加载model的时候加载的是在models文件夹中的msomemodel.php文件中的MSomemodel类,这个类负责应用程序的模型部分,也就是负责数据的交换,例如数据库的存储.

*******************
Server Requirements
*******************

 

2.主要就是application下的controllers文件夹下的welcome.php文件访问了views下的welcome_message.php文件

  然后我们通过$data=$this->MSomemodel->getvalue()执行了model中的一个方法,并从这个方法返回了数据,然后赋值给$data[“data1”],$data是一个关联数组,我们通过这个数组向view视图文件传值,而不是使用常见的模板模式,这种方法更好地分离了MVC各个部分的处理,同时在性能方面有其独特的一面.

PHP version 5.4 or newer is recommended.


3.它是怎么访问的呢? 在config文件夹下有个路由文件routes.php
配置了路由路径文件welcome 因此可以看到Welcome to Codelgniter!

  之后我们通过将$data数组传给views文件夹中的welcome.php文件,这个文件是常规的php和html混写的脚本,在这个脚本中可以利用传过来的$data数组输出信息,但是注意在view文件中输出信息的时候不必使用$data[“data1”],而只需要echo$data1;即可.

It should work on 5.2.4 as well, but we strongly advise you NOT to run
such old versions of PHP, because of potential security and
performance
issues, as well as missing features.

主要内容

4.在models 里建立业务逻辑文件,在views里建立视图文件

  基本的工作方式就是这样的,下面从代码级别来分析实现

 

 

复制代码
代码如下:/*注意的是,类名不能与方法名相同,否则会报错,像这样的Index,下边有一个index
方法,就会出错*/ class Index extends CI_Controller{ function index(){

  代码分析

打开phpstudy首页,

    CI简介

}}

  在CI中将Controller类作为超类来处理,也就是所有加载MVC实现模式的进程都从Controller类开始,所以我们忽略CI在加载到这个类的时刻前面的执行过程,而直接从Controller类所在的文件开始分析.

图片 2.png)

 

  Controller类所在的文件位于system/libraries/Controller.php文件中.

 

    深入MVC设计模式

  在这个类中首先加载了所有必须的基础类,包括:”Config”,”Input”,
“Benchmark”,”URI”,”Output”,
“Language”,”Router”类.之后加载Roader类并执行了它的_ci_autoloader()方法,这个类是MVC模式的核心,控制器中所有其他内容的加载都是通过它实现的,下面对其代码进行分析:

然后进入选择cms这个项目

 

  首先来看_ci_autoloader()方法,这个函数实现了自动加载某些类库或者类,如果在你的应用程序中总是要用到某些类,但是你又不确保在CI中是否已经自动加载了这些类的话,你可以在config/autoload.php文件中设定要自动加载的library或者helper或者plugin的数组.具体请参考手册.

图片 3.png)

    CI中的控制器与视图

  首先看看CI是如何加载libraries的,这个方法允许你在你的控制器的任何地方(通常是构造函数里)使用$this->load->library(“name”);来加载某个类,这个类可以是用户自定义的类也可以是系统的类库,用户自定义的类需要遵循CI的约定,具体信息见手册中的”创建你自己的类库”部分.library()方法以一个字符串或者一个类库名称的数组作为第一个参数,之后的处理将遍历然后加载所有的类,你可以通过第二个参数向要加载的类的构造函数传递参数,第三个参数允许你定义返回的对象的名称,后面的两个参数通常不使用,这个方法在简单判断了参数是否为空之后调用了方法_ci_load_class($class,$ms=
NULL,
$t_name=NULL),这是一个非常复杂的函数,这个类加载第一个参数所指定的类,在这个类中进行了复杂的路径判断之后找到了所需要的类文件之后,调用了方法_ci_init_class($class,””,$ms,$t_name);这个类用来实例化一个类,如果在加载这个类的语句中包含了上述的第三个参数,则返回一个实例,以这个参数作为实例名,如果没有设置第三个参数,则返回一个以类名命名的实例名,这也是为什么前面的例子中在加载了model之后,直接将model类名作为一个对象使用的原因.

看说明,这个页面是在显示的
application/view/welcome_message.php这个页面的内容,然后是被控制器
application/controllers/Welcome.php控制的;

 

  之后我们来看CI是如何加载模型的,这个方法允许你在控制器中使用$this->load->model($modelname,$name,$db_conn)加载模型,这三个参数分别是加载的模型的名称,加载后实例化的对象名称,是否自动连接数据库.后面两个参数可以省略,你可以讲多个模型一次载入,只需要将第一个参数设置成数组即可,这个方法首先将传过来的第一个参数以””分解成数组,这种机制允许你在模型中创建多层文件夹,更加合理地安排代码的分组,之后程序取出数组的最后一个元素作为要加载的类的名称,并根据路径寻找此类,之后包含此文件,并实例化此类,如果设置了第二个参数,则实例化到$name的对象中,否则默认以类名作为对象名进行实例化.

为了验证,我修改一下welcome_message.php,加上一个图片,改变一些文字;

    CI中的超级对象

  再来看CI是如何加载视图的,view($view, $vars = array(),
$return=FALSE)方法的第一个参数是要加载的视图名称,第二个参数是要传给视图的变量值,第三个参数指定是否返回输出缓冲区的数据.这个方法将所有数组作为一个数组参数调用了_ci_load($_ci_data)方法,这个方法将传过来的变量数组通过extract()函数解析成符号表(也就是将键名当作变量名,值作为变量的值),并将这些变量缓存起来,以便可以再不同的视图中能够互相交流变量,也就是这个方法允许调用多次,为了在每次调用时都能自动加载已经传给前面视图的变量,将所有传给视图的变量都缓存在类的一个属性中,这样每次调用方法的时候都会获取所有的变量.之后加载这个视图文件,然后将其作为输出缓冲的一部分赋给全局变量$OUT,这个变量用来控制缓冲输出,这样做可以提高效率以及可以使调试的时间更准确.

 

 

  其他的加载方法和上述的方法原理基本相同,只是根据情况有少许改变,CI在实现MVC模式的方法中将所有的文件都包含在控制器中,我们在包含了这些文件后,可以再控制器中自由使用这些对象和数据,然后最后通过缓冲输出类来输出所有的数据,虽然Loader这个类的结构看起来很复杂,但是其实它的实现时很简单的,其内部的代码原理基本相同,而且清晰明了,仔细看的话不难理解.

先看效果:

    数据库访问

图片 4.png)

 

 

    AR模型

注意的地方:

 

页面渲染耗时{elapsed_time}秒 CI版本 <?php
echo
 CI_VERSION ?>  环境 <?php
echo
 ENVIRONMENT ?>

    如何扩展CI的控制器

 

 

变量意义 变量名称
渲染时间 {elapsed_time}
ci的版本 CI_VERSION
环境名称 ENVIRONMENT

    模型

 

    url相关函数

controller/welcome.php

    设置路由

$this ->load-> view(‘welcome_message’ );

    分页

 

    文件上传

加载视图,视图名称是welcome_message,视图的位置是application/view目录下

    Session

 

    验证码

控制器:代理完成某项任务的php类,充当MVC架构程序的粘合剂;

    表单验证

url:]

 

 

 

新建一个控制器


图片 5

CI是什么?

 

    CodeIgniter是一个轻量级但功能强大的PHP框架

namespace:

    基于MVC设计模式,提供了一套丰富的类库

kind:

    简单易学,高效实用

file extension:

 

 

官方网站

namespace any8 ;

class Pages extends CI_Controller{

    public function view ($page = ‘home’){ 
    
    }

}

    www.codeigniter.com

 

 

CI_Controller这个类对应于system/core/Controller.php,又叫超级对象,可以使用$this来调用它的变量,方法,一些其它的操作;

中文网站

 

    http://codeigniter.org.cn

public
function 
view ( $page = ‘home’ ){

 

    if ( !
file_exists( APPPATH. ‘views/pages/’ .$page . ‘.php’)) 
    {
        //
页面不存在 
        show_404 () ;
    }

下载当前最新版本

    $data [ ‘title’] = ucfirst( $page ); //
将title中的第一个字符大写 

    CodeIgniter_2.1.4.zip

    $this -> load-> view (‘templates/head’ , $data) ;
    $this -> load-> view (‘pages/’ . $page, $data ); 
    $this -> load-> view (‘templates/foot’ , $data) ;

    (截止2015.7.1最新版为3.0.0——笔者注)

}

 

 

有什么特点?

 

    你想要一个小巧的框架

注意的地方:   

    你需要出色的性能

发表评论

电子邮件地址不会被公开。 必填项已用*标注