• 开奖现场/开奖现场官方网站》》》》》》

  • 发布时间:2016-01-19 14:15 | 作者:yc | 来源:互联网 | 浏览:1200 次
  • 开奖现场/开奖现场官方网站》》》》》》除此之外,此要领颠末对繁杂度的简化,使法度榜样构造愈加直不雅

    一、啥是MVC

    MVC要领(Model-View-Controller)是软件工程中的一种软件架构要领,把软件体系分为三个根本有些:模型(Model)、视图(View)和操控器(Controller)

    MVC要领的意图是完成一种动态的法度榜样筹划,使后续对法度榜样的修正和拓宽简化,而且使法度榜样某一有些的重复运用成为大概软件体系颠末对本身根本部份分袂的一路也付与了各个根本有些应有的功能专业职员能够颠末本身的特长分组:

    (操控器Controller)- 担负转发请求,对请求进行处置惩罚

    (视图View) – 界面筹划职员进行图形界面筹划

    (模型Model) – 法度榜样员编写法度榜样应有的功能(完成算法等等)、数据库专家进行数据解决和数据库筹划(能够完成具体的功能)

    650) this.width=650;" class="box" src="/html/uploads/allimg/160119/1415063G5-0.png" alt="mvc" width="321" height="151" style="margin:0px;padding:5px;border:0px;line-height:1;font-family:inherit;" />

    模型(Model) “数据模型”(Model)用于封装与利用法度榜样的营业逻辑有关的数据以及对数据的处置惩罚法子“模型”有对数据直接拜访的权利,例如对数据库的拜访“模型”不依附“视图”和“操控器”,也等于说,模型不关心它会被如何显现或是如何被操作可是模型中数据的篡改平日会颠末一种改写机制被宣布为了完成这种机制,那些用于监督此模型的视图有需要事前在此模型上注册,然后,视图能够懂得在数据模型上发生发火的篡改

    视图(View) 视图层能够完成数据故意图的显现(理论上,这不是必需的)在视图中平日没有法度榜样上的逻辑为了完成视图上的改写功能,视图需求拜访它监督的数据模型(Model),因而该当事前在被它监督的数据那里注册

    操控器(Controller) 操控器起到纷歧样层面间的安排效果,用于操控利用法度榜样的流程它处置惩罚工作并作出呼应“工作”包孕用户的行动和数据模型上的篡改

    二、为啥要自个开拓MVC构造

    收集上有很多优良的MVC构造可供运用,本教程并不是为了开拓一个整个的、最终的MVC构造办理规划,而是将它看作是一个极好的从内部进修PHP的机会,在此历程中,你将进修面向工具编程和筹划要领,并进修到洞开中的一些把稳事变

    更重要的是,你能够彻底操控你的构造,并将你的主见融入到你开拓的构造中只管纷歧定是做好的,可是你能够依照你的法子去开拓功能和模块

    三、起头开拓自个的MVC构造

    在起头开拓前,让咱们先来把项目树立好,假定咱们树立的项目为todo,那么接下来的第一步等于把目录构造先设置好

    650) this.width=650;" class="box" src="/html/uploads/allimg/160119/14150AU7-1.png" alt="todo" width="217" height="264" style="margin:0px;padding:5px;border:0px;line-height:1;font-family:inherit;" />

    只管在这个教程中不会运用到上面的统统的目录,可是为了往后法度榜样的可拓宽性,在一路头就把法度榜样目录设置好使十分需要的下面就具体说说每个目录的效果:

    application – 寄存法度榜样代码

    config – 寄存法度榜样设置设备摆设或数据库设置设备摆设

    db – 用来寄存数据库备份内容

    library – 寄存构造代码

    public – 寄存静态文件

    scripts – 寄存敕令行器械

    tmp – 寄存暂时数据

    在目录设置好往后,咱们接下来就要来顶一下一些代码的标准:

    MySQL的表名需小写并选用复数要领,如items,cars

    模块名(Models)需首字母大年夜写,并选用奇数要领,如Item,Car

    操控器(Controllers)需首字母大年夜写,选用复数要领并在名称中增添“Controller”,如ItemsController, CarsController

    视图(Views)选用复数要领,并在后边增添行动作为文件,如:items/view.php, cars/buy.php

    上述的一些规矩是为了能在法度榜样钟异常好的进行互相的调用接下来就起头真实的编码了

    第一步将统统的的请求都重定向到public目录下,办理规划是在todo文件下增添一个.htaccesss文件,文件内容为:

    RewriteEngine on

    RewriteRule^$public/[L]

    RewriteRule(.*) public/$1[L]

    在咱们把统统的请求都重定向到public目录下往后,咱们就需求将统统的数据请求都再重定向到public下的index.php文件,于是就需求在public文件夹下也新建一个.htaccess文件,文件内容为:

    RewriteEngine On

    #要是文件存在就直接拜访目录不进行RewriteRule

    RewriteCond %{REQUEST_FILENAME} !-f

    #要是目录存在就直接拜访目录不进行RewriteRule

    RewriteCond %{REQUEST_FILENAME} !-d

    #将统统其余URL重写到 index.php/URL

    RewriteRule ^(.*)$ index.php?url=$1 [PT,L]

    这么做的重要身分有:

    能够使法度榜样有一个单一的入口,将统统除静态法度榜样以外的法度榜样都重定向到index.php上;

    能够用来天生利于SEO的URL,想要异常好的设置设备摆设URL,后期大概会需求URL路由,这儿先不做先容了

    做完上面的操作,就该当知道咱们需求做啥了,没错!在public目录下增添index.php文件,文件内容为:

    把稳上面的PHP代码中,并没有增添PHP完毕符号”?>”,这么做的重要身分是:关于只包孕PHP代码的文件,完毕象征(“?>”)最佳不存在,PHP本身并不需求完毕符号,不增添完毕符号能够很大年夜程度上避免结尾被增添额定的写入内容,让法度榜样愈加安然

    在index.php中,咱们对library文件夹下的bootstrap.php提议了请求,那么bootstrap.php这个发动文件中到底会包孕哪些内容呢?

    以上文件都能够直接在index.php文件中引证,咱们这么做的身分是为了在后期解决和拓宽中愈加的便利,以是把需求在一路头的时分就加载运转的法度榜样同等放到一个独自的文件中引证

    先来看看config文件下的config .php文件,该文件的重要效果是设置一些法度榜样的设置设备摆设项及数据库毗连等,重要内容为:

    该当说config.php涉及到的内容并不多,不过是一些根底数据的一些设置,再来看看library下的共用文件shared.php该当如何写

    $var) {

    if ($var === $GLOBALS[$key]) {

    unset($GLOBALS[$ke凯发娱乐k8y]);

    }

    }

    }

    }

    }

    /* 主请求法子,重要意图拆分URL请求 */

    function callHook() {

    global $url;

    $urlArray = array();

    $urlArray = explode("/",$url);

    $controller = $urlArray[0];

    array_shift($urlArray);

    $action = $urlArray[0];

    开奖现场/开奖现场官方网站》》》》》》

    array_shift($urlArray);

    $queryString = $urlArray;

    $controllerName = $controller;

    $controller = ucwords($controller);

    $model = rtrim($controller, 's');

    $controller .= 'Controller';

    $dispatch = new $controller($model,$controllerName,$action);

    if ((int)method_exists($controller, $action)) {

    call_user_func_array(array($dispatch,$action),$queryString);

    } else {

    /* 天生差错代码 */

    }

    }

    /* 主动加载操控器和模型 */

    function __autoload($className) {

    if (file_exists(ROOT . DS . 'library' . DS . strtolower($className) . '.class.php')) {

    require_once(ROOT . DS . 'library' . DS . strtolower($className) . '.class.php');

    } else if (file_exists(ROOT . DS . 'application' . DS . 'controllers' . DS . strtolower($className) . '.php')) {

    require_once(ROOT . DS . 'application' . DS . 'controllers' . DS . strtolower($className) . '.php');

    } else if (file_exists(ROOT . DS . 'application' . DS . 'models' . DS . strtolower($className) . '.php')) {

    require_once(ROOT . DS . 'application' . DS . 'models' . DS . strtolower($className) . '.php');

    } else {

    /* 天生差错代码 */

    }

    }

    setReporting();

    removeMagicQuotes();

    unregisterGlobals();

    callHook();

    接下来的操作等于在library中树立法度榜样所需求的基类,包孕操控器、模型和视图的基类

    新建操控器基类为controller.class.php,操控器的重要功能等于总调整,具体具体内容如下:

    _controller = $controller;

    $this->_action = $action;

    $this->_model = $model;

    $this->$model =& new $model;

    $this->_template =& new Template($controller,$action);

    }

    function set($name,$value) {

    $this->_template->set($name,$value);

    }

    function __destruct() {

    $this->_template->render();

    }

    }

    新建操控器基类为model.class.php,斟酌到模型需求对数据库进行处置惩罚,以是能够新建一个数据库基类sqlquery.class.php,模型去一连sqlquery.class.php

    新建sqlquery.class.php,代码如下:

    _dbHandle = @mysql_connect($address, $account, $pwd);

    if ($this->_dbHandle != 0) {

    if (mysql_select_db($name, $this->_dbHandle)) {

    return 1;

    }else {

    return 0;

    }

    }else {

    return 0;

    }

    }

    /** 中止数据库毗连 **/

    function disconnect() {

    if (@mysql_close($this->_dbHandle) != 0) {

    return 1;

    } else {

    return 0;

    }

    }

    /** 查询统统数据表内容 **/

    function selectAll() {

    $query = 'select * from `'.$this->_table.'`';

    return $this->query($query);

    }

    /** 查询数据表指定列内容 **/

    function select($id) {

    $query = 'select * from `'.$this->_table.'` where `id` = \''.mysql_real_escape_string($id).'\'';

    return $this->query($query, 1);

    }

    /** 自定义SQL查询句子 **/

    function query($query, $singleResult = 0) {

    $this->_result = mysql_query($query, $this->_dbHandle);

    if (preg_match("/select/i",$query)) {

    $result = array();

    $table = array();

    $field = array();

    $tempResults = array();

    $numOfFields = mysql_num_fields($this->_result);

    for ($i = 0; $i _result, $i));

    array_push($field,mysql_field_name($this->_result, $i));

    }

    while ($row = mysql_fetch_row($this->_result)) {

    for ($i = 0;$i _result);

    return $tempResults;

    }

    array_push($result,$tempResults);

    }

    mysql_free_result($this->_result);

    return($result);

    }

    }

    /** 回来成果集行数 **/

    function getNumRows() {

    return mysql_num_rows($this->_result);

    }

    /** 释放成果集内存 **/

    function freeResult() {

    mysql_free_result($this->_result);

    }

    /** 回来MySQL操作差错信息 **/

    function getError() {

    return mysql_error($this->_dbHandle);

    }

    }

    新建model.class.php,代码如下:

    connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);

    $this->_model = get_class($this);

    $this->_table = strtolower($this->_model)."s";

    }

    functwww.qy876comion __destruct() {

    }

    }

    新建视图基类为template.class.php,具体代码如下:

    _controller = $controller;

    $this->_action =$action;

    }

    /* 设置变量 */

    function set($name,$value) {

    $this->variables[$name] = $value;

    }

    /* 显现模板 */

    function render() {

    extract($this->variables);

    if (file_exists(ROOT.DS. 'application' .DS. 'views' .DS. $this->_controller .DS. 'header.php')) {

    include(ROOT.DS. 'application' .DS. 'views' .DS. $this->_controller .DS. 'header.php');

    } else {

    include(ROOT.DS. 'application' .DS. 'views' .DS. 'header.php');

    }

    include (ROOT.DS. 'application' .DS. 'views' .DS. $this->_controller .DS. $this->_action . '.php');

    if (file_exists(ROOT.DS. 'application' .DS. 'views' .DS. $this->_controller .DS. 'footer.php')) {

    include (ROOT.DS. 'application' .DS. 'views' .DS. $this->_controller .DS. 'footer.php');

    } else {

    include (ROOT.DS. 'application' .DS. 'views' .DS. 'footer.php');

    }

    }

    }

    做完了以上这么多操作,根本上整个MVC构造现已出来了,下面就该制造咱们的站点了咱们要做的站点原先很简单,一个ToDo法度榜样

    首先是在咱们的/application/controller/ 目录下面新建一个站点操控器类为ItemsController,命名为itemscontroller.php,内容为:

    set('title',$name.' - My Todo List App');

    $this->set('todo',$this->Item->select($id));

    }

    function viewall() {

    $this->set('title','All Items - My Todo List App');

    $this->set('todo',$this->Item->selectAll());

    }

    function add() {

    $todo = $_POST['todo'];

    $this->set('title','Success - My Todo List App');

    $this->set('todo',$this->Item->query('insert into items (item_name) values (\''.mysql_real_escape_string($todo).'\')'));

    }

    function delete($id) {

    $this->set('title','Success - My Todo List App');

    $this->set('todo',$this->Item->query('delete from items where id = \''.mysql_real_escape_string($id).'\''));

    }

    }

    接下来等于先建站点的模型,在咱们的/application/model/ 目录下面先建一个站点模型类为Item,内容直接一连Model,代码如下:

    终极一步是设置咱们站点的视图有些,咱们如今/application/views/目录下新建一个items的文件夹,再在items文件夹下树立与操控看重Action一样的文件,分手为view.php,viewall.php,add.php,delete.php,斟酌到这么页面中大概需求共用页首和页尾,以是再新建两个文件,命名为header.php,footer.php,每个文件的代码如下:

    view.php文件:反省单条待处置惩罚营业

    ">Delete this item

    viewall.php文件:反省统统待处置惩罚营业

    /">

    add.php文件:增添待处置惩罚营业

    Todo successfully added. Click here to go back.

    delete.php文件:删去营业

    Todo successfully deleted. Click here to go back.

    header.php:页首文件

    My Todo-List App

    footer.php:页尾文件

    当然还有一个必弗成少的操作等于在数据中中树立一张表,具体代码如下:

    CREATE TABLE IF NOT EXISTS `items` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `item_name` varchar(255) NOT NULL,

    PRIMARY KEY (`id`)

    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;

    至此一个运用MVC开拓的网站就开拓完成了,你如今能够颠末拜访http://localhost/todo/items/viewall 反省新建的站点

    转发地址:http://nonfu.me/p/5284.html

  • 相关内容

友情链接: