Symfony 温故而知新
使用Symfony的同学,连接数据库时,如果想指定编码,需要在得到数据库Connection的时候发送一条SET NAMES UTF-8语句,以保证统一。
针对这个问题,我以前写过2篇Blog,地址:
里面是通过修改Creole的源码,symfony/vendor/creole/Creole.php,加入一个setUTF8方法。
这个方式管用,但不是最好。
这两天看了Symfony的 Code snippets ,发现很多Symfony的运行机制,看到一个FilterChains,可以由用户添加一个Filter到调用链中,可以在系统初始化时自动运行。
利用这个特点,把设置连接编码的语句,添加到一个filter中,每次自动运行:
class FilterGBK extends sfFilter {
public function execute($filterChain) {
// execute this filter only once
// 这里确保了这几行代码只执行一次
if ($this->isFirstCall()) {
$connection = Propel::getConnection();
$query = ‘SET NAMES gbk’;
$statement = $connection->prepareStatement($query);
$statement->executeQuery();
}
// execute next filter
$filterChain->execute();
}
}
再编辑 apps/front/config/filters.yml 文件,在开头加入:
FilterGBK:
class: FilterGBK
这样就可以达到目的,而以前的实现方式需要修改插件源码,无法在一个系统中运行多个Symfony项目。
随着逐渐深入Symfony,并反复查看文档和代码,可以学到很多Web开发的经验和技巧。
这回,深刻体会到了“温故而知新”的内涵。

似乎没有必要这么复杂吧,在config/databases.yml里面设置encoding不就行了?就象下面这样:
dev:
propel:
class: sfPropelDatabase
param:
dsn: mysql://root:123456@localhost/db
encoding: utf8