ABC(*1)の10日目。共通テーマは私が開発している「Risouto」についてです。
まずはサンプルコードの中身を見てみよう
前回はサンプルコードにWebブラウザからアクセスし、URLの指定方法や値をアプリケーションに受け渡す方法について見てみた。さて、今回はそれを実現するコードを見てみることにしよう。
なにがしかの方法で「/path/to/risoluto/apps/RisolutoApps/Sample」ディレクトリに移動して欲しい。その中にサンプルコードのファイルが保存されているはずだ。今回はSample2.phpとSample2.tplの2ファイルにだけ気にすれば良い。
共通のルール
さて、まずはRisolutoの世界におけるルールについて、いくつか解説しておく必要があるだろう。
ルールその1:アプリケーションは「/path/to/risoluto/apps/RisolutoApps/」ディレクトリ配下に格納する
「/path/to/risoluto/apps/RisolutoApps/」ディレクトリが貴方が意識する必要のある一番重要なディレクトリだ。この中に貴方が作成したアプリケーションのファイルを格納する。必要であればサブディレクトリを作成(*2)し、その中にアプリケーションのファイルを格納してもいい。
ルールその2:「/path/to/risoluto/apps/RisolutoApps/」ディレクトリ配下のサブディレクトリやファイル名の先頭は大文字で
このディレクトリ内に格納する全てのファイルおよびディレクトリ名は、例外なく先頭1文字を英大文字にすること。これは統一ルールとして設けてある。必要であれば、PSR-0に準拠している限りにおいて、このルールを破る事ができる。
ルールその3:テンプレートは「.tpl」、プログラムは「.php」という拡張子にする
拡張子としてHTMLを切り出したテンプレートに関するものは「.tpl」という拡張子にすること。そしてそれ以外のPHPコードが含まれる部分については「.php」という拡張子にすることがルールだ。前者がMVCで言うところの「V」に当たり、後者が「M」または「C」に当たるものだ。
ファイル名についてはテンプレートとプログラム(コントローラ側)双方で同一にしておくことが望ましい。もちろんこれは必須では無い。
.tpl:テンプレートファイルを紐解く
それでは簡単な方というわけで、「Sample2.tpl」の中身を覗いてみることにしよう。ここにそのコードを全て列挙することはしないので、各自コードを見て欲しい。
というわけで、ここでRisolutoにおけるテンプレートファイルに関するルールを説明しておこう。
ルールその4:Smarty3を使っている
デフォルトでは、RisolutoはテンプレートエンジンとしてSmarty3を使用している。ので、テンプレートを書くときは、そのルールに従う必要がある。必要であれば他のテンプレートエンジンを組み込んで使うこともできるが、配布パッケージ中の各ファイルはSmarty以外では動作しないだろう。
ルールその5:ヘッダやフッタ等の共通ファイルは「/path/to/risoluto/apps/RisolutoApps/common」に配置
ヘッダやフッタ等のある種共通で参照されるテンプレートについては、「/path/to/risoluto/apps/RisolutoApps/common」配下に格納されている。このルールを厳密に守る必要は無いが、特にこだわりが無いならしたがっておいた方が良いだろう。
ルールその6:「/path/to/risoluto/apps/RisolutoApps/」へのパスはデフォルトでアサインされている
よく参照するであろう「/path/to/risoluto/apps/RisolutoApps/」ディレクトリのパスであるが、これはデフォルトでテンプレート側で参照できる。「$__RISOLUTO_APPS」というSmarty変数がそれだ。サンプルコードでは、ヘッダやフッタをインクルードする際に、それらの格納パスを指定する目的で使用している。
というわけで、基本的には小難しいことは何も無い。Smarty3が使えてHTMLの知識があれば、それをフル活用すれば良いだけである。
.php:プログラムファイルを紐解く
続いて「Sample2.php」の中身を覗いてみることにしよう。こちらについても、ここにそのコードを全て列挙することはしないので、各自コードを見て欲しい。
というわけで、Risolutoにおけるプログラムファイルのルールを説明しよう。
ルールその7:アプリケーションの名前空間は「RisolutoApps」
貴方が作ったアプリケーションを「/path/to/risoluto/apps/RisolutoApps/」ディレクトリに配置したなら、「RisolutoApps」という名前空間に属するようにしなければならない。もしサンプルコードのようにサブディレクトリに配置したなら、名前空間は「RisolutoAppsPathToDir」のように指定する。
ルールその8:requireでなくUse
例えばSmartyのような外部のクラスライブラリを参照したいときは、requireやincludeを使うのではなく「Use」を使って指定する。Risolutoではcomposerをつかっているので、そのクラスローダが適切に必要な処理を行ってくれる。
コントローラの場合は「RisolutoRisolutoControllerBase」クラスを継承する
コントローラ向けに「RisolutoRisolutoControllerBase」というクラスが用意されている。これを継承しておくことで、Risoutoを使う上での手間のほとんどを解消してくれる。モデル向けに同様のクラスが一応用意されている(*3)。
ルールその9:コードはPlay()に
必要なコードはすべて「Play()」というメソッドに記述する。正確に言えばちょっと違うのだが、最初のうちはそう解釈しておくと良い。
ルールその10:デフォルトのヘッダ情報を取得する方法
$this->GetDefaultHeader()というメソッドをコールすると、デフォルトのヘッダ情報を連想配列の形式で得ることができる。どのような情報がセットされるのかについては、この連想配列の中身をチェックしてみて欲しい。
デフォルトから変更したいものがあれば、この連想配列の値を書き換えればよい。どのような連想配列を生成しなければいけないのかを理解しているなら、自分でそれを1からつくってもよい。
ルールその11:テンプレートの準備は3段階
テンプレートを準備するためのメソッドは3つあり、それらを順番に適切にコールする必要がある。
まずは「InitTemplate()」というメソッド。文字通りテンプレートエンジンの初期化等を担当するメソッドだ。
引数としてテンプレートファイルの格納パスを指定する。この格納パスには、RISOLUTO_APPS以下のディレクトリを指定する。もしRISOLUTO_APPS直下にテンプレートファイルが格納されているなら、引数無しでコールすればよい。
メソッドの戻り値として、テンプレートエンジンのオブジェクトが返却される。
2つめは「AssignTemplate()」というメソッド。テンプレートへ値をアサインするためのメソッドだ。前述の「$__RISOLUTO_APPS」というテンプレート変数は、このメソッドでアサインされる。
第1引数はテンプレートエンジンのオブジェクト、第2引数はアサインする値を連想配列形式で指定する。
最後が「DispTemplate()」というメソッド。テンプレートを表示するためのメソッドだ。これをコールすることでWebブラウザ側に処理されたHTMLが出力される。
第1引数はテンプレートエンジンのオブジェクト、第2引数はテンプレートファイルのファイル名を指定する。
ルールその12:Risoluto方式で渡されたパラメタはGetParam()メソッドで得る
Risoluto方式で渡されたパラメタ、すなわち「?seq=Foo.param1」のように指定された場合のパラメタを受け取るには、「GetParam()」というメソッドを使用する。このメソッドの戻り値は配列で、この例の場合「array( 'param1' )」の用に取得することができる。
文字にすると煩雑に見えるけれど……
さて、ここまでが代替覚えておくべきルールとなる。文字にするととても煩雑に見えるかもしれないが、実際にアプリケーションを作成する際は、さほど気にならないと思う。ほとんどの場合、Risoluto固有の部分については「サンプルと同じように書く」ことでニーズを満たせるはずだ。
ちょっと凝ったことをしたいなら、Risolutoのコードを読んでみると良いだろう。というわけでRisolutoのコードを深く読んでいきたいと思うわけだが、それについてはまた来週。
*1:アドベント・ぼっち・カレンダーの意
*2:ちょうどサンプルコードがそのようになっている
*3:開発の進捗上、そこらへんはあまり深く作れていないので今後いろいろ変わってくる部分のひとつだ