読者です 読者をやめる 読者になる 読者になる

symfony1.4 - action内であれこれ -

お久しぶりです!夏季休暇真っ最中のitani(@w650)です。

入社して5か月経ちますが、ひたすらsymfonyを触り続けています。
今回は、日々symfonyを触り続けてきた中で学んだ、action内でできることをいくつか紹介します。

1. metaタグやcssなどの指定

symfonyでmetaタグの指定やcssの読み込み等をしようとしたとき、真っ先に思いつくのはview.ymlだと思います。
しかし、symfonyのresponseオブジェクトを使えばview.ymlで設定するようなことがaction内でできます。

まずは、responseオブジェクトを取得します。
これはsfComponentの中にすでにメソッドが用意されています。

$response = $this->getResponse();
このメソッドはsymfonyのsfWebResponseオブジェクトを取得します。

sfWebResponseの中にはたくさんのメソッドが用意されていますが、いくつかご紹介します。

// titleの設定
$response->setTitle('hoge'); // <title>hoge</title>
// metaタグの設定
$response->addMeta('keywords', 'hoge,fuga'); // <meta name="keywords" content="hoge,fuga" />
// cssファイルの読み込み
$response->addStylesheet('hoge.css'); // <link rel="stylesheet" type="text/css" media="screen" href="/css/hoge.css" />
// javascriptファイルの読み込み
$response->addJavascript('hoge.js'); // <script type="text/javascript"/js/hoge.js"></script>

まだまだたくさんのメソッドが用意されていますが、とりあえずここまで。
気を付けなければいけないのは、add**系メソッドです。
add**系メソッドはあくまで追加するためのメソッドです。
そう「追加」です。「上書き」ではありあません。
つまり、view.yml等で設定されているものがあれば、その設定はそのまま有効になります。
その設定の上に追加するのです。

2. helperの読み込み

helperはuse_helperやsetting.ymlで設定してtemplateで使用するのが一般的です。
しかし、action内で使用したくなることもありますよね。
そんなときは以下のようにすることで、action内でもheplerのメソッドを使用できるようになります。

sfContext::getInstance()->getConfiguration()->loadHelpers(array('hoge', 'fuga'));
symfonyは以下のディレクトリからファイルを見つけして、includeします。
  • apps以下のlib/helper
  • sf_root_dir以下のlib/helper
  • symfony以下のlib/helper
ファイルが見つからない場合はexceptionを投げるようになっています。

3. タスクの実行

action内ではタスクの実行もできます。
これはもちろんsymfonyがもともと用意しているタスクも実行することができます。
今回は、symfonyのi18n、xliff形式のxmlファイルを生成するタスク(i18n:extract)を実行してみます。

// 現在のカレントディレクトリを変数に代入
$cd = dirname(__FILE__);
// カレントディレクトリをsf_root_dirに移動
chdir(sfConfig::get('sf_root_dir'));
// 実行したいタスクのオブジェクトを生成
$task = new sfI18nExtractTask(sfContext::getInstance()->getEventDispatcher(), new sfFormatter()); 
// タスクの実行
// 第一引数にはパラメータの指定。第二引数にはオプションを指定
$task->run(array('application' => 'front', 'culture' => 'ja'), array('--auto-save', '--auto-delete'));
// カレントディレクトリを元に戻す
chdir($cd);
これで、このactionが実行されたとき、以下のコマンドが実行されたことになります。
./symfony i18n:extract --auto-save --auto-delete front ja
action内でタスクの実行ができれば、例えばキャッシュをクリアするボタンや、モジュールを作成できるフォーム画面等、いろいろなことができるようになります。
考えただけで用途はたくさんありますね。

おわり

というわけで、少ないですがいくつかaction内でできることを紹介させていただきました。
action内でできることが増えれば、それだけ動的なプログラムが書けるようになります。
僕はこれらを知っただけで、できることが一気に広がりました!
まだまだ可能性を広げるために、どんどん勉強していきます!!

カヤックでは自分の可能性を広げる技術者も募集しています!