Symfony 温故而知新

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

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

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

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

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

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

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

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

Comments:

Post a comment

Google

Google
LAMP-Linux-redhat LAMP-Apache LAMP-MySQL LAMP-Php Leakon-Wiki Leakon-BBS XueBaoBao Xyoyou