symfonyを使ってみよう(3/3)
[4]indexSuccess.phpの編集
では、このphpファイルの編集を行いましょう。もとのファイルは空ですが、ここに次のように付け加えます。
<p>お名前をどうぞ。</p> <?php echo form_tag('helloworld/youkoso') ?> <?php echo input_tag('anatano_onamae', 'your name') ?> <?php echo submit_tag('Save') ?> </form>
付け加えた部分の<?php ~ ?>
の部分はヘルパーとよばれるPHP
関数で、HTMLで同じ物を書くよりも短く、またsymfony側のURL管理を容易にしています。ヘルパーは多数用意されていますが今回用いたのはその中でもフォームヘルパーとよばれるもので、入力フォームを実現しています。
ヘルパー | 種別 | 同等のHTML |
form_tag( 'helloworld/youkoso') | フォームタグ | <form method="post" action= "http://localhost/index.php/helloworld/youkoso"> |
input_tag( 'anatano_onamae', 'your name') | テキストフィールド | <input type="text" name="anatano_oname" id="anatano_oname" value="your name" /> |
submit_tag('Save') | サブミットボタン | <input type="submit" name="submit" value="Save" /> |
個々のテンプレートは<body>
タグの中を指定するもので、<head>
タグのような共通部分についてはグローバルテンプレートが役割を担っています。アプリケーションフォルダ内の「templates/layout.php」というファイルがそれです。タイトルやキーワードなどの具体的な内容については、ここからさらにアプリケーションフォルダあるいはモジュールフォルダ内の「config/view.yml」が参照されます。アプリケーションやモジュールごとに細かく設定が可能です。以下にアプリケーションフォルダ内の「templates/layout.php」と「config/view.yml」を合わせて示します。前者に対して後者の設定がどう反映されるのか、確認ください。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <?php echo include_http_metas() ?>(view.ymlのhttp_metas:の部分) <?php echo include_metas() ?> (view.ymlのmetas:の部分) <?php echo include_title() ?> (タイトル(アクションやview.ymlで設定可)) <link rel="shortcut icon" href="/favicon.ico" /> </head> <body> <?php echo $sf_data->getRaw('sf_content') ?> (ここに個々のテンプレートが反映される) </body> </html>
default: http_metas: (http-metas設定部分。「http-equiv:content」という書式) content-type: text/html; charset=utf-8 metas: (metaタグの各部分。「name:content」という書式) title: symfony project robots: index, follow description: symfony project keywords: symfony, project language: en stylesheets: [main] (スタイルシート読み込み。この場合 「<プロジェクトフォルダ>/web/css/main.css」が 呼び出される) javascripts: [ ] (Javascriptファイル読み込み) has_layout: on (レイアウトファイルを使用) layout: layout (レイアウトファイル名(拡張子省略))
今回はここは特に変更しませんが、YAMLフォーマットは直感的に内容の把握しやすいものとなっています。YAMLフォーマットに関する詳細は、本連載後半で解説する予定です。
[5]actions.class.phpの編集
今度は同じく「helloworld」フォルダ内の「actions/actions.class.php」を編集しましょう。このファイルにはhelloworldモジュールが実行するアクションが記述されています。これも次のように追記します。
<?php /** * helloworld actions. * * @package codezine * @subpackage helloworld * @author Your name here * @version SVN: $Id: actions.class.php 2692 2006-11-15 21:03:55Z fabien $ */ class helloworldActions extends sfActions { /** * Executes index action * */ public function executeIndex() { /* $this->forward('default', 'module');*/ } public function executeYoukoso() { print(htmlspecialchars($this->getRequestParameter('anatano_onamae'))."さん、こんにちは!"); return sfView::NONE; } }
既にexecuteIndex()
という関数が定義されていますが、これも「execute<アクション名(最初大文字)>」という命名規則に沿っています。つまり、executeIndex()
は「index」というデフォルトのアクションです。executeIndex()
内は最初$this->forward('default', 'module');
とのみ記されています。これは「default」アプリケーションの「module」モジュールにフォワードするという意味で、先ほどのsymfonyのデフォルト画面が表示されるようになっています。もはやデフォルト画面を表示させる必要はありませんし、先ほど編集した「indexSuccess.php」を表示させたいので、フォワード処理はカットします(上記ではコメントアウトしています)。今回追記した executeYoukoso()
は「indexSuccess.php」に追記したフォームタグから呼び出される「youkoso」 というアクションを示しています。そして「youkoso」アクション中ではgetRequestParameter()
によってフォームからの値を受け取り表示しています。また、最後のreturn sfView::NONE;
ですが、これはアクションのリターンをどうするか決めています。戻り値には以下の表にあげたものがあります。
戻り値 | 概要 |
sfView::SUCCESS; | デフォルトビュー (~Success.php) |
'MyResult' ; | デフォルトでないビュー (~MyResult.php) |
sfView::ERROR; | エラービュー (~Error.php) |
sfView::NONE; | ビューは返さない |
sfView::HEADER_ONLY; | ビューは返さずヘッダーだけ返す (X-JSONヘッダ利用時などに使用) |
sfView::VAR; | ビューは返さないが変数を返す(単体テスト時などに使用) |
今回は簡単にするため、youkosoアクションでは特にビューは返さず、値の表示としています。では再び、先ほどのURLにアクセスしてみてください。
http://localhost/helloworld
「indexSuccess.php」で記述した内容が反映されています。ここでテキストボックスに「codezine」と入れてみましょう。
URLが「http://localhost/helloworld/youkoso」となっています。お気づきでしょうか。
これは、「http://localhost/<モジュール名>/<アクション名>」という形式になるからです。実際にこういう階層でファイルが存在するわけではありません。この形式でモジュールとアクションを呼び出す仕組みを担当しているのがMVCの「C」、コントローラの部分です。 symfonyでのフロントコントローラが「index.php」であるのは、先に触れた通りです。実際にこの機能は「スマートURL」あるいは「URIマッピング」と呼ばれています。こういった規則はプロジェクトフォルダやアプリケーションフォルダ内に存在する「config/routing.yml」で定義しています。
# default rules homepage: (「/」のみのURL指定にはdefaultモジュールの indexアクションが呼び出される) url: / param: { module: default, action: index } default_symfony: (「/symfony/<アクション名>/*」の場合、 defaultモジュールが呼び出される) url: /symfony/:action/* param: { module: default } default_index: (「/<モジュール名>」の場合、アクションはindexとなる) url: /:module param: { action: index } default: (基本的にURLは 「/<モジュール名>/<アクション名>/*」と解釈する) url: /:module/:action/*
ルーティングの各項目ごとに、リクエストURLの形式と送られるパラメータが設定できます。デフォルトの状態ではデフォルトのルールだけが記述されていて、「default」の項目で、上記の「/<モジュール名>/<アクション名>/」というマッピングが設定されています。
最後に、今回編集したファイルの役割と、主なsymfonyコマンドについて示しておきます。
![今回作成したアプリケーションとブラウザとのやりとり 今回作成したアプリケーションとブラウザとのやりとり](http://cz-cdn.shoeisha.jp/static/images/article/704/helloworld.gif)
コマンド | 機能 |
symfony -V | symfonyのバージョンを表示する |
symfony init-project <project name> | プロジェクトを生成する |
symfony init-app <application name> | アプリケーションを生成する |
symfony init-module <application name> <module name> | モジュールを生成する |
symfony propel-build-schema | 既存のデータベースから定義ファイルであるschema.ymlを生成する |
symfony propel-build-model | schema.ymlをもとにモデルクラスファイル群を生成する |
symfony propel-generate-crud <application name> <module name> <model class name> | テーブルに対する基本操作(CRUD)のためのモジュールとテンプレートを生成する |
symfony cc | キャッシュクリアを行う(設定ファイルを変更した後など) |
今回のまとめ
今回はPHPの基本を一通り学習されたばかりの方を対象に、フレームワークとはどういった雰囲気のものであるかをざっと触れ、PHPフレームワークであるsymfonyを紹介、そのインストールから簡単なアプリケーションを作成するところまでを見てみました。
非常に簡単なアプリケーションでしたが、symfonyコマンドでアプリケーションファイル群が自動生成されていく雰囲気はなんとなく分かってもらえたのではないでしょうか。次回からはsymfonyを使って、実際に掲示板アプリケーションを一から作ってみることとしましょう。
参考資料
- symfony(英語)
- My first project(英語)
- askeet(英語、一部日本語)
- symfony book