使用Symfony的同学,连接数据库时,如果想指定编码,需要在得到数据库Connection的时候发送一条SET NAMES UTF-8语句,以保证统一。

针对这个问题,我以前写过2篇Blog,地址:

里面是通过修改Creole的源码,symfony/vendor/creole/Creole.php,加入一个setUTF8方法。

这个方式管用,但不是最好。

这两天看了Symfony的 Code snippets ,发现很多Symfony的运行机制,看到一个FilterChains,可以由用户添加一个Filter到调用链中,可以在系统初始化时自动运行。

利用这个特点,把设置连接编码的语句,添加到一个filter中,每次自动运行:

// 首次执行时,设置数据库连接编码为 GBK
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开发的经验和技巧。

这回,深刻体会到了“温故而知新”的内涵。