用MVC模式设计一个简单的新闻系统

用MVC模式设计一个简单的新闻系统
用MVC模式设计一个简单的新闻系统

刚刚对MVC设计模式有了一点肤浅的了解,在这里以一个最简单的新闻系统的例子说一下我理解的MVC 设计模式,旨在帮助徘徊在MVC设计模式门口的入门者(几天前我就是那个状态)。废话不说了,言归正传。我以下所说得内容都是建立在小恺这篇帖子基础上的

https://www.360docs.net/doc/7116026385.html,/read-htm-tid-11675-keyword-MVC.html

整个框架采用了小恺的框架,这个框架简单易懂,没有那些复杂的功能,只具有简单的核心功能。

如果你读懂了那篇帖子或者大概懂了,那么请继续听我往下说

什么事MVC设计模式呢,我是这样理解的,好比一个KFC餐厅,要开一个KFC餐厅,首先要有会做菜的厨师,这就相当于MVC中的model(模型),有了厨师还不够,还得有服务员,服务员就相当于MVC 中的controller(控制器),除此之外,KFC餐厅还必须有点菜单,还有餐盘,这就相当于MVC中的vie w(视图)。KFC的运作模式是这样的,首先顾客通过点菜单向服务员点取所要的食物,服务员收到点菜单之后自己并不跑去做菜,而是通知后面的厨师,做XX菜,厨师只管做菜,至于是谁要的,厨师不惯,直接拿给服务员就可以了,服务员收到厨师做好的食品之后装盘,拿给顾客。MVC流程于此类似,MODE L层只负责实现一定的功能,并不理会谁需要实现这样的功能,这件事由控制层完成,控制层收到模型层完成的工作之后,通过合适的视图层展示给用户。

-------------例子开始------------

首先我们要把小凯的那几个架构文件拷贝过来

视图层用smarty实现,把smarty也拷贝到core文件夹内,同时创建smarty需要用到的文件夹cache t emplates templates_c 在configs文件夹里创建一个smarty的配置文件smartyConfig.php,如果不会配置smarty请查阅相关的说明

文件夹结构如下

然后我们在数据库中创建一个news表,包含以下字段(id,title,content)

做完这些准备工作,开始正式进入我们写代码的阶段,首先在所有模型的基类core/model.class.php中创建一个构造函数,并在其中写入数据库链接代码,就像所有的厨师都必须会操作烹饪工具一样,我这里是

用PDO写的,具体用哪种方式链接数据库就看你的喜好了,代码如下

复制代码

1.

2.

3.class model extends PDO{

4.

5. public function __construct(){

6. try{

7. global $ST;

8. $dsn = "$ST[DB_CLS]:host=$ST[DB_HOST];dbname=$ST[DB_NAME];

charset=$ST[DB_CHAR];";

9. PDO::__construct($dsn,$ST['DB_USER'],$ST['DB_PWD']);

10. PDO::exec("set names $ST[DB_CHAR]");

11. }catch(PDOException $e){

12. print "Error!: " . $e->getMessage() . "
";

13.die();

14. }

15. }

16.}

17.?>

接下来我们在models文件夹中创建一个news.class.php文件,该文件包含一个继承自model的news类,

写入一个显示所有新闻标题的方法,就像教会厨师做一道菜

复制代码

1.

2.class news extends model{

3. /**

4.* 显示所有新闻

5.* @param avgs 参数

6.*

7.*

8.* @return Array 二维数组

9.*/

10. public function showAllNews(){

11. try{

12. global $ST;

13. $sql = "select ·title·, `id` from `$ST[DB_PRE]news` ";

14. $stmt = $this->query($sql);

15.$res =$stmt->fetchAll();

16. }catch(PDOException $e){

17. print "Error!: " . $e->getMessage() . "
";

18. }

19. return $res;

20. }

21.}

22.?>

该方法返回一个包含所有新闻编号和标题的二维数组

做完这个,在templates文件夹里面创建一个简单的显示页面showall.html

复制代码

1.

2.

3. Allnews

4.

d>

5.

6.{#foreach from=$Array item=Detail#}

7.{#$Detail.titl

e#}

8.{#foreachelse#}

9.对不起,目前没有新闻!

10.{#/foreach#}

11.

12.

这里看不懂的查阅一下相关的smarty资料

接下来该我们的服务员出场了。在controllers文件夹中创建一个show.class.php文件,该文件中包含一个

继承于基类controller显示新闻的show类

复制代码

1.

2.

3.class show extends controller{

4.

5.//显示所有公告

6. public function showAllNews(){

7. $m= $this->loadModel('news'); //创建厨师

8. $allNews = $m->showAllNews();//告诉厨师做什么菜

9. include_once 'configs/smartyConfig.php';//创建同往前台的通道

10. $smarty->assign('Array',$allNews);//食品装盘

11. $smarty->display('showall.html');//拿给客户

12. }

13.}

14.?>

到这里我们的第一个显示所有标题的功能做完了,接下来我们做第二个功能,显示新闻内容,这就要教会厨

师做第二道菜,我们在模型类news中增加一个方法

复制代码

1. /**

2.* 显示新闻所有细节

3.* @param avgs 参数

4.* id:新闻编号,

5.*

6.* @return Array

7.*/

8. public function showDetail($id){

9. try{

10. global $ST;

11. $sql="select * from `$ST[DB_PRE]news` where `id` = ?";

12. $stmt = $this->prepare($sql);

13. $stmt->bindParam(1, $id);

14. $stmt->execute();

15.$res =$stmt->fetch();

16. }catch(PDOException $e){

17. print "Error!: " . $e->getMessage() . "
";

18. }

19. return $res;

20. }

再创建一个前台页面detail.html

复制代码

1.

2.

3.

d>

4.

5.{#$content#}

6.

7.

接下来我们要在show类中增加一个方法

复制代码

1.

2. //显示单一公告

3. public function detail(){

4. $id =$_GET['id'];//获取参数

5. $m= $this->loadModel('news');//创建厨师

6. $news = $m->showDetail($id);//告诉厨师做第二道菜

7. include_once 'configs/smartyConfig.php';

8. $smarty->assign('content',$news['content']);//装盘

9. $smarty->display('detail.html');//拿给顾客

10. }

到这里,显示新闻的两个简单功能做完了,如果你还需要更多的功能,添加相应的方法就行了

接下来是后台管理,这里我只是想演示MVC这种设计模式,所以我只做了一个简单的添加新闻的功能我们需要用到admin.html

代码如下

复制代码

1.

2.

3.

d>

4.

5.{#$ok#}

6.

7.

8.

9.

10.

内容

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

接下来我们j教厨师做第三道菜,在news类中添加一个方法

复制代码

1. //添加新闻

2. public function insertNews($title,$content){

3. try{

4. global $ST;

5. $sql = "INSERT INTO `$ST[DB_PRE]news` (`title`,`content`) VALU

ES ('$title','$content',)";

6. $stmt = $this->prepare($sql);

7. $res = $stmt->execute();

8. }catch(PDOException $e){

9. print "Error!: " . $e->getMessage() . "
";

10. }

11. return $res;

12. }

接下来我们需要一个专门为管理员服务的服务员admin.class.php,内容如下

复制代码

1.class admin extends controller{

2. public function __construct(){

3. //这里当然写判断是否登陆的类了,至于怎么写...

4. }

5. public function news(){

6. $m=$this->loadModel('news');

7.$ok='';

8. if($_POST['title']&&@$_POST['id']){

9. $m->insertNews($_POST['title'],$_POST['content']);

10.$ok='新闻添加成功';

11. }

12. include_once 'configs/smartyConfig.php';

13. $smarty->assign('ok',$ok);

14. $smarty->display('admin.html');

15. }

16.}

到此添加新闻的部分也做好了,至于登陆部分,以及判断登陆部分,同理可以做出来

相关主题
相关文档
最新文档