前文所述的代码,可以加在每个 Module 的 Actions 类的构造函数中,这样就确保了每次数据库链接时都是按照 utf8 编码进行传输和读取的。
但如果 Module 多了,到处重复代码可是一件烦人的事,也严重违反了 DRY(Don’t Repeat Youself) 原则,另外,有些 action 只显示一些表单或其他内容,并不需要数据库连接,而在构造函数中调用那段代码,每次都会连接数据库,造成了不必要的性能损失,因此,我们要进行一下小小的重构。
研究了 Symfony 的框架,发现他在做数据库方面的处理时,用了第三方的工具来封装,Creole 和 Propel,这 2 个工具之间的关系我还没深入研究,据我目前的理解,Creole 是对 MySQL 等数据库的底层封装,Propel 提供了应用层的逻辑代码,也就是说,在写跟逻辑有关代码时,用 Propel 把 SQL 语句封装起来,等语句都拼接好后,调用 Creole 的接口连接数据库。
我看了 Creole 的代码,找到了 getConnection 这个静态方法,他负责解析 DSN 并返回一个数据库连接。我们要做的,就是在每个需要数据库连接会话开始时,发送一条
语句,这个方法正好给了我们这个机会,因此,我在这个方法的 return 语句前面,调用了另一个方法:
$obj 是 getConnection 要 return 的数据库连接。
打开 symfony/vendor/creole/Creole.php ,在 getConnection 方法的 return 前面加入上面这条语句,然后写出方法的定义:
return $statement->executeQuery();
}
}
?>
说明:为了保证 SQL 语句只被发送一次,定义了宏
作为判断标志。下次调用这个方法的时候,不会执行任何操作。
http://www.leakon.com/archives/106
这里有更好的解决方案