原生php

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Symfony2VS原生php为什么说Symfony2超过一些框架和自己写原生php?如果你从来没有使用过一个php框架,也不了解MVC,或者对关于Symfony2好处的传言感到好奇,那本章正是为你准备的。我们并不会灌输为什么Symfony2可以帮助你更快更好地开发代码,而是让你自己做这个判断。本章将让你用纯PHP写一个简单的应用程序,然后将其重构,使之更有条理。你将会穿越时间,了解为什么网站开发在过去几年中会演变成现在这样。然后你将体会到为什么Symfony2可以让开发工作不再繁琐,让你真正掌控你的代码。用原生php实现一个简单的博客首先,用原生PHP来实现一个博客程序。博客程序至少应有一个页面用来显示数据库里所保存的文章。代码非常简单:?php//index.php$link=mysql_connect('localhost','myuser','mypassword');mysql_select_db('blog_db',$link);$result=mysql_query('SELECTid,titleFROMpost',$link);?!DOCTYPEhtmlhtmlheadtitleListofPosts/title/headbodyh1ListofPosts/h1ul?phpwhile($row=mysql_fetch_assoc($result)):?liahref=/show.php?id=?phpecho$row['id']??phpecho$row['title']?/a/li?phpendwhile;?/ul/body/html?phpmysql_close($link);??php//index.php$link=mysql_connect('localhost','myuser','mypassword');mysql_select_db('blog_db',$link);$result=mysql_query('SELECTid,titleFROMpost',$link);?!DOCTYPEhtmlhtmlheadtitleListofPosts/title/headbodyh1ListofPosts/h1ul?phpwhile($row=mysql_fetch_assoc($result)):?liahref=/show.php?id=?phpecho$row['id']??phpecho$row['title']?/a/li?phpendwhile;?/ul/body/html?phpmysql_close($link);?虽然代码写起来很快,运行速度也不慢,但随着你的程序规模越来越大,维护这种风格的代码将变得越来越麻烦。可能遇到的问题包括:没有错误检查:如果数据库连接没有创建成功呢?代码结构差:随着代码的增多,文件将越来越大,变得不便维护。想象一下,要增加对表单的处理,代码应该写在什么位置?又如何验证数据?或者你需要发送邮件?难以重用代码:如果所有的代码都是在一个文件里,如果你需要增加一个别的页面,那该如何重用你已经写好的代码逻辑呢?另外一个没有指出的问题是,例子里的代码只能用来连接MySQL数据库。而Symfony2整合了Doctrine,从而可以实现数据库操作的抽象,以及表字段的映射。抽离表现层将包含了HTML的“表现层”代码单独保存为一个文件,然后在主“逻辑”文件里引用,可以实现与前面相同的效果:?php//index.php$link=mysql_connect('localhost','myuser','mypassword');mysql_select_db('blog_db',$link);$result=mysql_query('SELECTid,titleFROMpost',$link);$posts=array();while($row=mysql_fetch_assoc($result)){$posts[]=$row;}mysql_close($link);//去包含HTML的代码require'templates/list.php';?php//index.php$link=mysql_connect('localhost','myuser','mypassword');mysql_select_db('blog_db',$link);$result=mysql_query('SELECTid,titleFROMpost',$link);$posts=array();while($row=mysql_fetch_assoc($result)){$posts[]=$row;}mysql_close($link);//去包含HTML的代码require'templates/list.php';现在HTML代码都保存在一个独立的文件(templates/list.php)中,文件里嵌套的是模板风格的PHP代码:htmlheadtitle文章列表/title/headbodyh1文章列表/h1ul?phpforeach($postsas$post):?liahref=/read?id=?phpecho$post['id']??phpecho$post['title']?/a/li?phpendforeach;?/ul/body/htmlhtmlheadtitle文章列表/title/headbodyh1文章列表/h1ul?phpforeach($postsas$post):?liahref=/read?id=?phpecho$post['id']??phpecho$post['title']?/a/li?phpendforeach;?/ul/body/html根据惯例,例子中的index.php文件包含了应用程序中所有的“逻辑”,被称为“控制器”。控制器这个术语,无论你使用的是框架还是语言,你都将会经常听到,简单来说它就是指你处理用户输入和准备响应的代码。在上面的例子里,我们的控制器从数据库里读取数据,然后调用一个模板文件来呈现这些数据。通过分离控制器的代码,你将可以轻松地修改模板文件,比如以另外的格式(如创建一个对应JSON格式的list.json.php模板)来输出博客文章。应用程序(域)逻辑分离到目前为止,应用程序只有一页。但是,如果第二个页面需要使用相同的数据库连接或者需要相同的博客文章数组呢?重构整个程序,从应用程序中将核心行为和数据访问功能分离出来放入新的model.php文件中。?php//model.phpfunctionopen_database_connection(){$link=mysql_connect('localhost','myuser','mypassword');mysql_select_db('blog_db',$link);return$link;}functionclose_database_connection($link){mysql_close($link);}functionget_all_posts(){$link=open_database_connection();$result=mysql_query('SELECTid,titleFROMpost',$link);$posts=array();while($row=mysql_fetch_assoc($result)){$posts[]=$row;}close_database_connection($link);return$posts;}?php//model.phpfunctionopen_database_connection(){$link=mysql_connect('localhost','myuser','mypassword');mysql_select_db('blog_db',$link);return$link;}functionclose_database_connection($link){mysql_close($link);}functionget_all_posts(){$link=open_database_connection();$result=mysql_query('SELECTid,titleFROMpost',$link);$posts=array();while($row=mysql_fetch_assoc($result)){$posts[]=$row;}close_database_connection($link);return$posts;}使用model.php来命名是因为应用程序逻辑和数据访问传统上被称为“Model”层。在一个代码组织良好的应用程序中,大多数代表“业务逻辑”的代码都在“Model”层中(而非控制器中)。而不象本例中模型(Model)只关注数据库访问。现在的控制器(index.php)变得十分简单:?phprequire_once'model.php';$posts=get_all_posts();require'templates/list.php';?phprequire_once'model.php';$posts=get_all_posts();require'templates/list.php';现在控制器的唯一任务就是从应用程序的“Model”层中得到数据,然后调用一个模板来呈现这些数据。这是一个最简单的MVC模式。布局分离现在应用程序已经明显被重构成三个有着不同优势的部分,并且在不同的页面中有机会重用几乎所有的东西。在代码中唯一不能被重用的就只有布局了,因此创建一个新的layout.php文件来修复这个问题。!--templates/layout.php--htmlheadtitle?phpecho$title?/title/headbody?phpecho$content?/body/html!--templates/layout.php--htmlheadtitle?phpecho$title?/title/headbody?phpecho$content?/body/html现在模板文件(templates/list.php)可以简单地从layout.php文件中“扩展”出来。?php$title='ListofPosts'??phpob_start()?h1ListofPosts/h1ul?phpforeach($postsas$post):?liahref=/read?id=?phpecho$post['id']??phpecho$post['title']?/a/li?phpendforeach;?/ul?php$content=ob_get_clean()??phpinclude'layout.php'??php$title='ListofPosts'??phpob_start()?h1ListofPosts/h1ul?phpforeach($postsas$post):?liahref=/read?id=?phpecho$post['id']??phpecho$post['title']?/a/li?phpendforeach;?/ul?php$content=ob_get_clean(

1 / 22
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功