お久しぶりです!夏季休暇真っ最中の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
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 jaaction内でタスクの実行ができれば、例えばキャッシュをクリアするボタンや、モジュールを作成できるフォーム画面等、いろいろなことができるようになります。
考えただけで用途はたくさんありますね。
おわり
というわけで、少ないですがいくつかaction内でできることを紹介させていただきました。
action内でできることが増えれば、それだけ動的なプログラムが書けるようになります。
僕はこれらを知っただけで、できることが一気に広がりました!
まだまだ可能性を広げるために、どんどん勉強していきます!!