首页 > 新闻动态 >  

新闻动态
NEWS

十分钟能学会的框架,MVC+20个常用函数

添加时间:2013-8-12 点击量:

  LazyPHP(以下简称LP)是一个轻框架.

  之所以开辟这么一个框架,是因为其他框架给的太多。在高压力的景象下,ORM和千头万绪的对象树反而将简单的页面恳求处理惩罚错杂化,在调试和机能上带来不和结果。

  LP采取函数式接口封装对象,对内经由过程面向对象实现代码重用,对外则供给简明扼要的操纵函数。开辟者甚至不消懂得面向对象就能很好的应用,这让一些初级法度员很轻易就开辟出强健的应用。

  在数据库等模块的加载上,LP采取LazyLoad体式格式,并用¥GLOBALS实现全局单件,在便利和高效之间找到了一个均衡点。这也是LP框架名字中Lazy的起原。

  LP在新浪多量应用已经将近3年,天天承载的恳求达切切级别。因为LP易读易学,应用LP的开辟者之间沟通很是轻易,而新同事也可以很快融入进来。

  LP3是LP新的版本,最首要的调剂是从头定义了Layout规矩,以应对日益增多的Ajax,Mobile和Rest恳求。同样是因为这个原因,LP3和之前的版本不兼容,我们建议大师在新项目中采取LP3。

  LP3简明教程

  LP是一个轻框架。它只是筹算帮你处理惩罚掉每个Web应用都须要从头开端的那项目组器材,并不筹算成为一个大而全的Lib(我说的真的不是ZendFrameWork)。

  LP只包含一个FrontController+Layout体系+20个常用函数。你只须要花上10分钟懂得这些器材,就能完全得把握LP。

  FRONTCONTROLLER

  FrontController(以下简称FC)翻译过来叫前端把握器,在LP中,所有的动态恳求(不包含静态文件)都邑经过FC。应用FC的益处是可以同一把握全部恳求,举例而言,你只须要在FC中添加几行代码,就可以正确把握哪些controller和action不成以接见。

  LP3的FC你可以算作绩是ROOT/index.php(实际上分发逻辑在_lp/index.php),所有的恳求都在这里处理惩罚。不管你是用户登录还是浏览文章,在LP上用户接见的页面都是index.php。

  FC按照Controller和Action对恳求进行分组,并调用对应的模块来进行处理惩罚。如何定义Controller和Action?最简单的办法是把一个数据表对应到一个Controller,而对这个数据表的相干操纵天然就成为了Action。

  比如,我们会定义一个叫做User的Controller,而把Login,Logout,Detail 作为User的Action。

  我们在接见LP时,把要恳求的Controller和Action经由过程参数c和a传递给FC。

  /index.php?c=user&a=login

  上边这个接告知诉FC去加载名为User的Controller,并调用名为Login的办法。

  在实现上,Controller被放到AROOT.controller目次下,以Class情势存在,而Action就是这个Class的一个办法。

  下边几行伪代码描述了这个其实很简单的过程:

  // FC取得参数

  ¥c = ¥_REQUEST[c] ;

  ¥a = ¥_REQUEST[a] ;

  // controller文件名和Class名

  ¥cont_file = AROOT . ‘controller/’ . ¥c . ‘/’ . ¥a . ‘.class.php’;

  ¥class_name =¥c . ucfirst(¥a) .’Controller’ ;

  // 载入文件

  require_once( ¥cont_file );

  // 调用办法

  ¥o = new ¥class_name;

  call_user_func( array( ¥o , ¥a ) );

  实际上编写应用的过程其实就是络续的添加Controller和Action并把它实现。

  下边是一个Controller Class的样子:

  class defaultController extends appController

  {

  function __construct()

  {

  parent::__construct();

  }

  function index()

  {

  ¥data[title] = ¥data[top_title] = ‘首页’;

  render( ¥data );

  }

  }

  MVC和LAYOUT

  LP是遵守MVC模式的,它的营业逻辑和显示逻辑是完全分别的。Controller处理惩罚了营业逻辑,我们应用模板来处理惩罚显示逻辑。

  LP所有的模板都被放在AROOT.view下边,经由过程在Controller中应用Render函数来衬着模板。

  以下是Render函数的伪代码:

  function render( ¥data = NULL , ¥layout = NULL , ¥style = ‘default’ )

  {

  ¥layout_file = AROOT . ‘view/layout/’ . ¥layout . ‘/’ . ¥style . ‘.tpl.html’;

  @extract( ¥data );

  require( ¥layout_file );

  }

  可以看到,Render接管一个¥data数组,然后将数组中的数据extract出来,如许一个底本是¥data[user]的数据在模板里边就能经由过程¥user接见了。而载入模板项目组更简单,只是直接require。这是因为LP直接应用PHP来做模板的申明引擎。我们推荐大师在模板中采取PHP的短标签语法以对峙高的可读性:

  <?php if( ¥user[level] >= 9 ): ?>

  亲,你是鹳狸猿

  <?php else: ?>

  亲,你是布衣,入夜请闭眼

  <?php endif; ?>

  上边是一个应用短标签的模板的例子。if,foreach都可以如许写。切忌在模板中应用{},这会让你的模板看起来很奇葩。

  为了实现模板的重用,我们引入了Layout体系。

  来看一个经常碰到的例子,网站头部导航和页脚版权项目组的重用。

  最简单和最轻易想到的处理惩罚办法是如许的:将头部保存为header.tpl.html,将页脚保存为footer.tpl.html。然后直接在模板顶用include函数载入即可。

  如许很OK,然则有10个模板要处理惩罚的时辰,你会发明每个模板都要去include header和footer。而在这些模板中,header和footer其实是不变的,变的是中心的项目组。

  于是我们为这些雷同模板建树一个通用的模板文件,叫做sharpA.tpl.html,在sharpA中我们指定好header和footer,然后sharpA按照FC接管到的C和A变量(还记得吧)去加载对应子目次下模板。如许我们只须要创建C和A对应的模板就可以了。下边是一个典范的sharp模板。

  <html>

  <body>

  <div id=”hd” ><?php @include_once( dirname(__FILE__) ) . DS . ‘header.tpl.html’; ?></div>

  <div id=”bd”>

  <div id=”side”>

  <?php

  include( AROOT . ‘view’ . DS . ‘layout’ . DS . g(‘layout’) . DS . ‘side’ . DS . g(‘c’) . DS . g(‘a’) . ‘.tpl.html’ );

  ?>

  </div>

  <div id=”main”>

  <?php

  include( AROOT . ‘view’ . DS . ‘layout’ . DS . g(‘layout’) . DS . ‘main’ . DS . g(‘c’) . DS . g(‘a’) . ‘.tpl.html’ );

  ?>

  </div>

  </div>

  </div>

  <div id=”ft”><?php @include_once( dirname(__FILE__) ) . DS . ‘footer.tpl.html’; ?></div>

  </body>

  </html>

  当一个sharp满足不了需求时,我们可以再创建sharpB.tpl.html。styleB可以选择性的共享sharpA的header和footer,也可以载入本身特定的header。我们把sharpA,sharpB…等通用模板放到一个目次下,叫做一个Layout。

  今朝Layout遵守接见体式格式分为Web,Ajax,Mobile和Rest四种。当你为你的游戏机或者电视机创建一组特定风格的sharp模板时,你可以创建一个名叫TV或者PFP的Layout目次。

  切换Sharp和Layout很是简单,只须要批改Render函数中第二和第三个参数就可以了。在没有指定的景象下,LP3会启用Layout下的default style模板,同时还会按照恳求的体式格式,主动加载Web,Mobile或者Ajax Layout。

  再回过火来说MVC,我们已经懂得了C和V在LP的应用。而M就是按照恳求参数,从数据库或者其他处所取得数据的过程。在LP3之前,数据是直接在Controller中查询数据库取得的。

  function show()

  {

  ¥uid = intval(¥_REQUEST[uid]);

  if( ¥uid < 1 ) return info_page(‘错误的uid’);

  ¥data[user] = get_line( “SELECT FROM `user` WHERE `uid` = ‘” . ¥uid . “‘ LIMIT 1″ );

  render( ¥data );

  }

  这种体式格式将SQL散落在各个Action中,晦气于重用和批改。所以在LP3中,我们采取专门的model文件来放置Controller顶用到的数据操纵函数。还是用上边的例子,我们假设这是一个名为User的Controller的Show Action。那么在LP3中我们推荐的做法如下:

  起首在 AROOT/model目次下创建一个名为user.function.php的文件。

  然后在文件中写入获取用户信息的函数:

  function get_user_info_by_id( ¥uid )

  {

  return get_line( “SELECT `name` ,`email` , `bod` FROM `user` WHERE `uid` = ” . intval(¥uid) . ” LIMIT 1 ” )

  }

  user.function.php将在恳求参数包含?c=user 时主动加载。所以我们可以把show改为下边的样子:

  function show()

  {

  ¥uid = intval(¥_REQUEST[uid]);

  if( ¥uid < 1 ) return info_page(‘错误的uid’);

  ¥data[user] = get_user_info_by_id( ¥uid );

  render( ¥data );

  }

  如许再其他的Action,比如User/settings 中,我们可以经由过程get_user_info_by_id 函数重用代码。经由过程函数封装反复SQL还有一个益处是便利对SQL进行同一处理惩罚,加手工Cache就是一个经常能碰到的需求。

  常用函数

  LP3中的函数首要有3类,迅捷函数,功能函数和数据库函数,一共20个阁下。

  迅捷函数

  迅捷函数是一系列的函数缩写:

  function c( ¥str ) // 读取设备文件中¥str为key的对应的value

  function v( ¥str ) // 取得 ¥_REQUEST[¥str] 的数据,不存在不会报warning

  function z( ¥str ) // strip_tags

  function g( ¥str ) // 取得 ¥GLOBALS[¥str] 的数据

  function t( ¥str ) // trim

  function u( ¥str ) // urlencode

  功能性函数

  function render( ¥data = NULL , ¥layout = NULL , ¥style = ‘default’ ) // Layout

  function info_page( ¥info ) // 体系提示信息

  function ajax_echo( ¥info ) // 输出提示信息,包含永不过期的header

  function uses( ¥file ); // 载入lib目次下的文件

  数据库函数

  function s( ¥str , ¥db = NULL ) // mysql_real_escape_string

  function prepare( ¥sql , ¥array ) // 将数组中的变量次序调换SQL中的?

  function db() // 应用config目次下的数据库设置,创建并返回数据库链接

  function get_data( ¥sql , ¥db = NULL ) // 以二维数组的体式格式返回¥sql对应的成果

  function get_line( ¥sql , ¥db = NULL ) // 以一维数组的体式格式返回¥sql对应的单行成果

  function get_var( ¥sql , ¥db = NULL ) // 以变量的体式格式返回一个数值

  function last_id( ¥db = NULL ) // last id

  function run_sql( ¥sql , ¥db = NULL ) // 运行sql,不返回成果集

  function db_error() // 数据库错误信息

  function db_errno() // 数据库错误编号

  function close_db( ¥db ) // 显式封闭数据库链接

  希罕申明

  此中要具体申明的有两个:

  C(¥KEY)和设备文件

  LP将应用设备信息保存在AROOT/config/app.config.php下,应用¥GLOBALS[config]超全局变量以数组情势保存。应用c(¥key)的体式格式,可以在MVC各个处所获取。

  PREPARE()函数

  这个函数是LP3新引入的,主如果削减SQL注入的题目。应用体式格式如下:

  echo ¥sql = prepare( “SELECT FROM `user` WHERE `name` = ?s AND `uid` = ?i AND `level` = ?s LIMIT 1″ , array( “Easy’” , ‘-1′, ’9.56′ ) );

  输出成果为:

  SELECT FROM `user` WHERE `name` = ‘Easy\” AND `uid` = ‘-1′ AND `level` = ’9.56′ LIMIT 1

  应用prepare函数时要重视:SQL必须应用双引号,【?i】默示整数,【?s】默示整数以外的其他值。prepare会无例外的mysql_real_escape_string,然后在两边加上单引号。

  CSS,JAVASCRIPT和AJAX

  LP3采取YUI3的CSS框架以处理惩罚在不合浏览器上CSS兼容性,此中开辟者用得最多的应当是grid体系,这里是它的具体申明。

  JavaScript库上,LP3开端换为JQuery。这里是JQuery API的参考手册。

  为了便利不熟悉的同窗也能应用好Ajax,LP3本身实现了Ajax传输数据的JS函数。这些函数都放在AROOT/static/script/app.js中。

  ¥(‘#标签ID’).load(‘URL’); // 是由JQuery自身实现的,可以便利的无刷新载入页面。

  send_form_in( ‘FROMID’ ); // 将form表单中的数据经由过程Ajax提交(file类型除外),并将办事器返回的HTML显示在Form表单顶部

  send_form_pop(‘FROMID’); // 将form表单中的数据经由过程Ajax提交(file类型除外),并将办事器返回的HTML显示在浮动图层中

  好了,这里就是关于LP3 的一切了,LP3能让你更快的完成工作。

  我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》

更多请参考:http://www.gjprj.cn/news_jc.asp?id=6

分享到: