PHP: 2009年2月アーカイブ
3日目までは挫折したなりにも以前やったことがあったのですんなりだったが、4日目にしてグっとボリュームが出てきた感じ。
新しく試したキーワードをざっと挙げるだけでも、
- モデルにトリガーメソッドを作成
- パーシャルでフラグメントの整理
- トランザクション
- URLルーティング調整
- カスタムクラス作成
となかなかに盛り沢山。
内容も盛り沢山なので、その分だけわからない点もいくつか出てきた。
例えばInterest.phpのsaveメソッドを修正するところで、いきなり「$this->getQuestion()」が取れてしまうのは何で?schemaの定義に基づいて、modelが関連するQuestionオブジェクトも取得してくれてるってことなのかな。その辺りの自動で済ませてくれている部分が把握できてないと、重複してわざわざ取りに行くようなコードを書いてしまいそう。
ルーティングはかなり柔軟性が高そうで良さげですね。この恩恵を受けるために、テンプレート上のリンクはlink_toヘルパを使うようにすることが大事そう。
カスタムクラス作成でやったタイトルのストリップ処理は、日本語タイトル用にurlencodeするように変えたりしていましたが思うように動いてくれませんでした。これもちょっと課題。
ORMは便利だろうけど、パフォーマンスが気になるとかSQLが全部目に見える状態で作りたいとかいう話もあったりして、直接PDO経由でDB操作をしたい場合にどうすれば良いのか試してみました。
DSN情報を設定ファイルに記述。
apps/appname/config/app.yml
all:
db:
dsn: mysql:host=localhost;dbname=test
user: root
pass: pass
DB接続クラスを作成。
lib/dbConnection.class.php
<?php
class dbConnection
{
static private $PDOInstance;
protected function __construct()
{
$dsn = sfConfig::get('app_db_dsn');
$user = sfConfig::get('app_db_user');
$pass = sfConfig::get('app_db_pass');
self::$PDOInstance = new PDO($dsn, $user, $pass);
}
public static function getConnection()
{
if(!self::$PDOInstance)
{
new self();
}
return self::$PDOInstance;
}
}
actionなどからコネクション取得。
$conn = dbConnection::getConnection();
で、あとはこのコネクション使っていろいろと、ていう感じで動かしてみていたのですが、おいおい調べていたら自作せずともデフォルトのDB設定でPDO接続を指定できてしまうことを知りました・・・。
config/databases.yml
all:
pdocon:
class: sfPDODatabase
param:
dsn: mysql:host=localhost;dbname=test
dbtype: mysql
database: test
username: root
password: pass
actionからコネクション取得。
$conn = $this->getContext()->getDatabaseConnection('pdocon');
action以外から取得。
$conn = sfContext::getInstance()->getDatabaseConnection('pdocon');
なるほど、こっちの方が簡単。
動的にDB接続先を切り替えたりといったこともやってみたかったりするので、それぞれの使い勝手も含めて引き続き調べてみたいと思います。
まだ動かして間もないですが、少しずつsymfonyに慣れてきた気がします。