电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

理解PHP中的MVC編程之控制器

瀏覽:2日期:2024-02-05 17:53:41

簡單來講,控制器的作用就是接受請求。它使用獲取的方法,在這里是通過URI,載入一個功能模塊來刷新或者提交一個表述層。控制器將使用$_GET自動全局變量來判斷載入哪一個模塊。

一個請求的例子,看起來像這樣:

http://example.com/index.php?module=login

這看起來很簡單,但是在實現(xiàn)的過程中卻不是。這里是幾個控制器能識別的argument部分:

module定義了使用哪一個模塊,如users模塊 class定義了使用哪一個功能類,如你想讓用戶login還是logout event定義了使用哪一個具體事件

這樣一個更復(fù)雜的例子可以解釋上面的各個argument最終組成的請求URL:

http://example.com/index.php?module=users&class=login

這段請求告訴控制器應(yīng)該載入users模塊,然后是login類,最后因為沒有定義具體事件,所以運行l(wèi)ogin::__default()默認(rèn)事件。

以下是具體代碼部分:

<?php  /*** index.php** @author Joe Stump <joe@joestump.net>* @copyright Joe Stump <joe@joestump.net>* @license http://www.opensource.org/licenses/gpl-license.php* @package Framework */

 require_once('config.php');

 // {{{ __autoload($class) /*** __autoload** Autoload is ran by PHP when it can't find a class it is trying to load.* By naming our classes intelligently we should be able to load most classes* dynamically.** @author Joe Stump <joe@joestump.net>* @param string $class Class name we're trying to load* @return void* @package Framework */

 function __autoload($class) {$file = str_replace('_','/',substr($class,2)).'.php'; require_once(FR_BASE_PATH.'/includes/'.$file); } // }}}

 if (isset($_GET['module'])) {$module = $_GET['module'];if (isset($_GET['event'])) { $event = $_GET['event'];} else { $event = '__default';}

 if (isset($_GET['class'])) {$class = $_GET['class']; } else {$class = $module; }

 $classFile = FR_BASE_PATH.'/modules/'.$module.'/'.$class.'.php'; if (file_exists($classFile)) {require_once($classFile);if (class_exists($class)) { try {$instance = new $class();if (!FR_Module::isValid($instance)) { die('Requested module is not a valid framework module!');}

$instance->moduleName = $module;if ($instance->authenticate()) { try {$result = $instance->$event();if (!PEAR::isError($result)) { $presenter = FR_Presenter::factory($instance->presenter,$instance);

if (!PEAR::isError($presenter)) { $presenter->display();} else { die($presenter->getMessage());} }} catch (Exception $error) { die($error->getMessage());} } else {die('You do not have access to the requested page!'); }} catch (Exception $error) {  die($error->getMessage()); } } else {die('An valid module for your request was not found');  } } else {die('Could not find: $classFile');  } } else {die('A valid module was not specified');}

?>;

接下來是以上代碼具體的注釋:

載入“config.php”

定義__autoload()函數(shù)。這是PHP5里面的一個新函數(shù),方便動態(tài)地載入各個類。

如果一個argument被定義,那么載入相關(guān)的模塊、類和具體事件

接下來就是一些判斷以及錯誤的具體操作

最后一切無誤后就載入表述層

【友好URL】

如果你覺得上面例子講到的請求URL讓你覺得不舒服的話,那么就用mod_rewrite來實現(xiàn)友好URL吧。接下來是作者給這個框架寫的實際重寫標(biāo)準(zhǔn)代碼:

RewriteEngine On

# Change the URI here to whatever you want your homepage to be

RewriteRule ^/$ /index.php?module=welcome [L,QSA]

# Changes /index.php?module=welcome to /welcome

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f

RewriteRule ^/([^/]*)$ /index.php?module=$1 [L,QSA]

# Changes /index.php?module=users&class=login to /users/login

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f

RewriteRule ^/([^/]*)/([^/]*)$ /index.php?module=$1&class=$2 [L,QSA]

# Changes /index.php?module=users&class=login&event=foo

# to /users/login/foo.html

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f

RewriteRule ^/([^/]*)/([^/]*)/([^/]*).html$

/index.php?module=$1&class=$2&event=$3 [L,QSA]

Extending the Controller

【擴(kuò)展控制器】

擁有一個集中控制器的一點好處就是你加入一些功能后,馬上就能通過控制器體現(xiàn)出來。以下是幾個可以擴(kuò)展一下這個控制器的點子,使這個框架的整體能力更加強(qiáng)大: 你可以使用PHP5里一個新東西SoapServer來自動檢測一個請求是否為SOAP

你可以使用控制器來過濾所有的自動全局變量如$_GET和$_POST以防止惡意HTML代碼等

你可以使用控制器即時地轉(zhuǎn)換表述層,比如從默認(rèn)的方式轉(zhuǎn)到PDF方式

你可以直接在控制器中加入緩存機(jī)制,這樣的好處是應(yīng)用程序整體都能使用到緩存以提高效率

當(dāng)然,需要注意一點的是,你在控制器中所增加的功能將體現(xiàn)在程序全局。如你想過濾所有的自動全局變量,但是很多應(yīng)用程序的管理員需要使用到一些HTML代碼,反而成為一件棘手的事情(譯者注:本人的想法是可以加一個if條件語句,在加載特定模塊時不應(yīng)用過濾功能即可)。

標(biāo)簽: PHP
主站蜘蛛池模板: 工业淬火油烟净化器,北京油烟净化器厂家,热处理油烟净化器-北京众鑫百科 | 不锈钢管件(不锈钢弯头,不锈钢三通,不锈钢大小头),不锈钢法兰「厂家」-浙江志通管阀 | 胶辊硫化罐_胶鞋硫化罐_硫化罐厂家-山东鑫泰鑫智能装备有限公司 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 首页|专注深圳注册公司,代理记账报税,注册商标代理,工商变更,企业400电话等企业一站式服务-慧用心 | 合肥卓创建筑装饰,专业办公室装饰、商业空间装修与设计。 | 污泥烘干机-低温干化机-工业污泥烘干设备厂家-焦作市真节能环保设备科技有限公司 | 飞扬动力官网-广告公司管理软件,广告公司管理系统,喷绘写真条幅制作管理软件,广告公司ERP系统 | SOUNDWELL 编码器|电位器|旋转编码器|可调电位器|编码开关厂家-广东升威电子制品有限公司 | 衬氟止回阀_衬氟闸阀_衬氟三通球阀_衬四氟阀门_衬氟阀门厂-浙江利尔多阀门有限公司 | 安徽合肥项目申报咨询公司_安徽合肥高新企业项目申报_安徽省科技项目申报代理 | 银川美容培训-美睫美甲培训-彩妆纹绣培训-新娘化妆-学化妆-宁夏倍莱妮职业技能培训学校有限公司 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 网站优化公司_SEO优化_北京关键词百度快速排名-智恒博网络 | 新疆乌鲁木齐网站建设-乌鲁木齐网站制作设计-新疆远璨网络 | 环保袋,无纺布袋,无纺布打孔袋,保温袋,环保袋定制,环保袋厂家,环雅包装-十七年环保袋定制厂家 | 沈阳缠绕包装机厂家直销-沈阳海鹞托盘缠绕包装机价格 | 自动部分收集器,进口无油隔膜真空泵,SPME固相微萃取头-上海楚定分析仪器有限公司 | 断桥铝破碎机_发动机破碎机_杂铝破碎机厂家价格-皓星机械 | T恤衫定做,企业文化衫制作订做,广告T恤POLO衫定制厂家[源头工厂]-【汉诚T恤定制网】 | 湖南教师资格网-湖南教师资格证考试网 | 福建成考网-福建成人高考网| 包装机传感器-搅拌站传感器-山东称重传感器厂家-济南泰钦电气 | 粉末包装机,拆包机厂家,价格-上海强牛包装机械设备有限公司 | 保温杯,儿童婴童奶瓶,运动水壶「广告礼品杯定制厂家」超朗保温杯壶 | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 热镀锌槽钢|角钢|工字钢|圆钢|H型钢|扁钢|花纹板-天津千百顺钢铁贸易有限公司 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 头条搜索极速版下载安装免费新版,头条搜索极速版邀请码怎么填写? - 欧远全 | 物联网卡_物联网卡购买平台_移动物联网卡办理_移动联通电信流量卡通信模组采购平台? | 橡胶膜片,夹布膜片,橡胶隔膜密封,泵阀设备密封膜片-衡水汉丰橡塑科技公司网站 | 深圳富泰鑫五金_五金冲压件加工_五金配件加工_精密零件加工厂 | 贵阳用友软件,贵州财务软件,贵阳ERP软件_贵州优智信息技术有限公司 | 莱州网络公司|莱州网站建设|莱州网站优化|莱州阿里巴巴-莱州唯佳网络科技有限公司 | 开锐教育-学历提升-职称评定-职业资格培训-积分入户 | 电缆接头_防水接头_电缆防水接头 - 乐清市新豪电气有限公司 | MVR蒸发器厂家-多效蒸发器-工业废水蒸发器厂家-康景辉集团官网 | 电车线(用于供电给电车的输电线路)-百科| 机床主轴维修|刀塔维修|C轴维修-常州翔高精密机械有限公司 | 中国玩具展_玩具展|幼教用品展|幼教展|幼教装备展 | 青岛代理记账_青岛李沧代理记账公司_青岛崂山代理记账一个月多少钱_青岛德辉财税事务所官网 | 小小作文网_中小学优秀作文范文大全| 考试试题_试卷及答案_诗词单词成语 - 优易学 |