Symfony的MVC实现方式 Symfony's MVC Implementation
暂停一下,一个显示blog文章列表的页面,有多少部分组成?如图2-2所示,由下面的部分组成:
模型层
数据库抽象
数据访问
视图层
视图
模版
布局
控制器层
前端控制器
动作
7个脚本--每次修改一个页面需要打开这么多文件!可是,symfony做了些简化。虽然使用最好的MVC架构,symfony的方式使得开发程序更加快速容易。
首先,前端控制器是应用程序里所有的动作共用的。可以有多个控制器与多个布局,但是只需要一个前端控制器。前端控制器是纯MVC逻辑组件,你不必自己写一个,因为symfony会为你生成一个。
另外一个好消息是模型层的类也是根据数据结构自动生成的。这是由Propel库完成的,它有类的构架与代码生成功能。如果Propel找到外键或者日期字段,它会生成特殊的存取方法,这使得数据处理非常容易。另外,数据库抽象也是完全看不见的,它是由另外一个Creole组件处理的。所以如果你决定更换数据库引擎,你不必重写代码。你只要修改配置参数就可以了。
最后一件事情视图逻辑可以很容易的转换成以一个配置文件,不需要编写程序。
图 2-2 - symfony工作流程

这就是说在symfony里面显示文章的例子之需要3个文件,如例2-11,2-23,2-12所示。
例 2-11 - list 动作, myproject/apps/myapp/modules/weblog/actions/actions.class.php
[php]
<?php
class weblogActions extends sfActions
{
public function executeList()
{
$this->posts = PostPeer::doSelect(new Criteria());
}
}
?>
例 2-12 - list 模版, myproject/apps/myapp/modules/weblog/templates/listSuccess.php
[php]
<h1>List of Posts</h1>
<table>
<tr><th>Date</th><th>Title</th></tr>
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post->getDate() ?></td>
<td><?php echo $post->getTitle() ?></td>
</tr>
<?php endforeach; ?>
</table>
例 2-13 - list 视图, myproject/apps/myapp/modules/weblog/config/view.yml
listSuccess:
metas: { title: List of Posts }
另外,你需要定义一个布局,如例2-14,但是它可以多次重用。
例 2-14 - 布局 myproject/apps/myapp/templates/layout.php
[php]
<html>
<head>
<?php echo include_title() ?>
</head>
<body>
<?php echo $sf_data->getRaw('sf_content') ?>
</body>
</html>
这些就是全部的了。你只需要这些代码来显示与例2-1完全一样的页面。余下的事情(使所有的组成部分共同工作)由symfony来处理。如果你计算行数,会发现用MVC架构的symfony来实现显示文章列表花的时间和编写的代码不比写一个普通脚本要多。不过,这样做的巨大好处是,代码组织得十分清楚,可重用,灵活性还有更多的乐趣。作为奖励,你会得到XHTML兼容性,调试能力,简单的配置,数据库抽象,智能URL定向,多种环境,还有很多开发工具。