Symfony 温故而知新

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

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

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

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

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

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

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开发的经验和技巧。

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

5 comments

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

  2. 我看Symfony的论坛里也说这样设置,但我试过,没成功,不知道是哪儿的问题,回头我再查查,谢谢提醒!

  3. 试了下,升级到最新了1.0.16,波乐说的方法果然可以。
    之前也是用得过滤器,以后改编码集就方便了。

  4. 谢谢大家热心的讨论。
    作为PHP开发者,我从Symfony框架中学到了很多经验,尤其是web框架的架构和面向对象的开发模式。
    最近一直在钻研Symfony的源码,看了一下他很多Magic做法的实现过程。
    从中学习更好更聪明的做法,是很有收获的。
    但Symfony在很多地方做得过于可扩展了。
    其实,就我们来说,只用MySQL数据库,但他为了兼容其他数据库,做了很多接口,在运行效率上,确实下降了很多。
    我看过cache目录下为了autoload而生成的类名对文件路径的映射文件,居然有150K!!
    多么令人震惊的数字。
    我觉得,Symfony给我最大的帮助有3点:
    1、基于路由的controller和action的转发和url生成
    2、以ORM封装数据库操作
    3、面向对象的设计模式
    如果可以在这3方面有更深入地理解和学习,一定可以在PHP开发方面有非常明显的进步。
    我最近在尝试精简一套最小代码的Web开发框架。
    也许总文件数也就20来个,通过一定的目录规则进行autoload,而不是生成映射表,尽量减小文件加载的代码量,减少对象创建过程。
    毕竟,再快的语言,创建100个对象也比只创建1个对象慢得多。

Leave a Reply

Your email address will not be published.

*