发新话题
打印

深入理解symfony原理(2)

深入理解symfony原理(2)

MVC以外的分离方式 Layer Separation Beyond MVC



所以MVC架构的原理是把代码根据类型分成三层。数据逻辑代码放在模型里,表现代码放在视图里,应用逻辑代码放在控制器里。



还有其它的设计模式甚至可以使编写代码变得更加容易。模型,视图,控制器层还可以进一步细分。

数据库抽象 Database Abstraction



模型层可以分成数据访问曾与数据库抽象层。这样,数据访问函数不使用与数据库有关的查询语句,由其它的函数执行。如果换数据库系统,只需要修改数据库抽象层。



例2-6是MySQL的数据库抽象层的例子,随后的例2-7是一个简单的数据访问层。



例 2-6 - 模型的数据库抽象层部分

[php]

<?php



function open_connection($host, $user, $password)

{

  return mysql_connect($host, $user, $password);

}



function close_connection($link)

{

  mysql_close($link);

}



function query_database($query, $database, $link)

{

  mysql_select_db($database, $link);



  return mysql_query($query, $link);

字串1



}



function fetch_results($result)

{

  return mysql_fetch_array($result, MYSQL_ASSOC);

}



例 2-7 - 模型的数据访问层







[php]

function getAllPosts()

{

  // 连接数据库

  $link = open_connection('localhost', 'myuser', 'mypassword');



  // 执行SQL查询

  $result = query_database('SELECT date, title FROM post', 'blog_db', $link);



  // 填充数组

  $posts = array();

  while ($row = fetch_results($result))

  {

     $posts[] = $row;

  }



  // 关闭连接

  close_connection($link);



  return $posts;

}



?>







从上面我们可以看到数据访问层的部分没有数据库引擎有关的函数,从而不依赖于特定的数据库。另外,建立数据库抽象曾的函数可以在很多其它的模型函数中重用。 字串1



NOTE 例2-6与例2-7的例子并不十分让人满意,要完成一个完整的数据库抽象层还有很多事情要做(通过数据库无关的查询生成器抽象SQL代码,把所有的函数放到一个类,等等)。但是这本书的目的不是手把手教你怎么写一个数据库抽象层,在第8章里你会看到symfony本身是如何把这些抽象做好的。







视图元素 View Elements



视图层也可以通过分离代码来优化。应用程序中的网页往往会包含一些固定的元素:页头,图形版面设计,页脚以及全局导航。只有网页的中间部分变化。所以我们把视图分成布局(layout)与模版。布局(layout)一般是整个程序通用的,或者一组页面公用。模版只负责把控制器的变量显示出来。我们需要一些逻辑使这些零件(components)和在一起能够起作用,这就是视图逻辑。根据这些原则,例2-3的视图部分可以分成3部分,如例2-8,2-9,2-10所示。



例 2-8 - mytemplate.php 视图的模版部分

[php]

<h1>List of Posts</h1>

<table>

<tr><th>Date</th><th>Title</th></tr>

<?php foreach ($posts as $post): ?> 字串1

  <tr>

    <td><?php echo $post['date'] ?></td>

    <td><?php echo $post['title'] ?></td>

  </tr>

<?php endforeach; ?>

</table>



例 2-9 - 视图的视图逻辑部分

[php]

<?php



$title = 'List of Posts';

$content = include('mytemplate.php');



?>



例 2-10 - 视图的布局部分

[php]

<html>

  <head>

    <title><?php echo $title ?></title>

  </head>

  <body>

    <?php echo $content ?>

  </body>

</html>







动作与前端控制器 Action and Front Controller



在上一个例子里,控制器(controller)并没有作太多事情,但是在真正的web应用程序里面,控制器要做很多事情。这些事情中的一些重要部分对于所有的控制器都要做。这些事情包括处理请求、安全处理、载入应用程序配置信息,以及一些杂事。所以控制器经常被分成整个应用程序唯一的前端控制器和只负责某个特定页面的动作。

字串6





前端控制器的一个很大的好处他是整个应用程序唯一的入口。如果你决定关闭应用程序,你只要修改前端控制器脚本。如果一个应用程序没有前端控制器,那就要单独的关掉每一个控制器。










面向对象 Object Orientation



所有前面的例子都是面向过程的。现代编程语言的面向对象特性能简化编程,因为对象可以封装逻辑,继承,以及提供干净的命名规则。



在非面向对象的语言里面实现MVC架构会引起命名空间及代码重复的问题,代码会比较难以阅读。



开发者通过面向对象的方式可以通过视图对象,控制器对象,模型对象把之前例子里面的函数转换成方法。这是MVC架构必须的。



TIP 如果你想更详细的了解面向对象环境中的web应用程序设计模式,请阅读《Patterns of Enterprise Application Architecture》(作者:Martin Fowler, 出版 Addison-Wesley, ISBN: 0-32112-742-0)。这本书里面的代码用Java或者C#写的,PHP开发者也可以读一读。
长不大昨办

TOP

发新话题