FuelPHPサイド
FuelBeans 10 : ビューを利用する
FuelPHPに入っているデモは構造は簡単ですが、やっていることが複雑です。同じ事を単純にやりましょう。
FuelPHPの開発メンバーは、どうも技術的に優れていると思っているのか、ドキュメントの書き方や、デモの作り方がテクニカルすぎる部分があります。それが、ちょっと敷居を高くしています。
FuelPHP自体は簡単です。本当に簡単です。全然難しくなんてありません。
デモと同じ機能で、見た目をずっと地味にしたHello, Worldを作成しましょう。
もし実際に何かのWebアプリを開発するとしたら、まず余計なファイルを削除することでしょう。そこからはじめましょう。
練習も兼ね、NetBeansのプロジェクトウィンドウから、削除しましょう。
これで、開発のスタートラインに立ちました。もうデモは残っていません。localhost/fuelphp/publicにアクセスしてみてください。デフォルトの、地味な404ページが表示されます。
システムのイメージを持っているのであれば、ルーティングは初めから決めておきましょう。固定されたURLつまりlocalhost/fuelphp/public/aboutなど、決め打ちのURLだけを利用するならともかく、localhost/fuelphp/public/show/page/20など、可変する文字や数値がある場合、必ずエラーチェックが入ります。
もし、ユーザーにURLを叩いてもらう前提であれば、これも一種のUIです。わかりやすいものを考えます。
もしルーティングのパターンの最後が:anyや名前付きパラメーターの場合、それによって渡される値の解析も考慮に入れておく必要があります。
複数の違ったパターンを同じクラス/アクションで処理しようとするのなら、どんなパターンで制御が渡ってくるのか、予めわかっていなければ、プログラムできません。
理想的には細部まで設計することですが、スクラッチでバンバン作る場合でも、イメージ程度は決めておきましょう。
今回はデモとそっくりにしましょう。こういうイメージです。
全部を一つのクラス内で行います。helloとhello/名前は同じアクション関数で処理します。
では、まずクラスを作成しましょう。
ファイル名はhello.php、fuel/app/classes/controllerの下に作ります。classesがその名のとおり、クラスを置いておく場所で、デフォルトのオートロードの対象でしたね。オートロードはわざわざincludeやrequireしなくても、読み込んでくれる仕組みでした。
クラスの名前は、classes以下のディレクトリー構造によって決まるのでしたね。ディレクトリー名、ファイル名の先頭を大文字にし、階層をアンダーバーで表します。
では、作成しましょう。最初は、最低限のURL、デフォルトで呼び出されるページを表示しましょう。「いらっしゃいませ」をechoで表示してください。まずは下のコードを見ないで作成してみましょう。
controllerフォルダーで右クリック、新規→PHPファイルで作成します。名前にhelloと指定し、完了ボタンをクリックし、コーディングを始めます。
<?php
class Controller_Hello extends Controller {
function action_index() {
echo 'いらっしゃいませ';
}
}
それでは実行しましょう。configフォルダーを開いてください。(場所を探して覚えてもらうため、これ以降は細かい場所を指示しません。プロジェクトウィンドウの使用にも慣れてください。)ルーティングをまっさらに戻します。routes.phpを開き、定義を全部削除します。
<?php
return array(
);
定義を削除しても、暗黙のルーティングルールは残っています。
localhost/huelphp/public/helloへアクセスしましょう。どうです?「いらっしゃいませ」と正しく表示されましたか?
続いて、ルーティングを指定します。何も余計なURLを付けない、デフォルトの場合にこれが実行されるようにするのでした。routes.phpに一行加えましょう。
<?php
return array(
'_root_' => 'hello/index',
);
では実行してみましょう。IDEの実行ボタンを押してください。ブラウザで実行されましたか?URLが異なるようでしたら、プロジェクトを選択し、右クリックでプロパティ、実行構成→プロジェクトURLを確認してください。
それではhelloクラスから、ビューを呼び出します。
次のように変更してください。
<?php
class Controller_Hello extends Controller {
function action_index() {
return View::forge('hello');
}
}
echoで内容を直接書きだすのではなく、関数の戻り値として出力内容を返します。FuelPHPのコアクラスでは、何かを生成する関数名はforge()に統一されています。View::がViewクラスを表し、forge()が生成ですね。すぐに慣れます。
さて、いよいよ初めてのビューを作成します。ビューといってもほとんどhtmlです。でも拡張子はphpです。
ビューはclasses/viewではなく、views(複数形)のフォルダーに作成するのでした。ややこしいですが、間違えないでください。View::forge()で指定したビュー名は、viewsフォルダー内のphpファイルで探され、取り込まれます。views内にフォルダーで階層を作る場合は'folder/file'と指定します。
viewsにhello.phpを作成します。今回は普通のhtmlの内容です。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>FuelPHP テストプログラム</title>
</head>
<body>
<h1>FuelPHP テストプログラム</h1>
<p>いらっしゃいませ<p>
</body>
</html>
では、実行してみましょう。実行アイコンをクリックです。どうでしょう。上手く表示されたでしょうか?
できたことは出来ましたが、全部が決め打ちなら、直接htmlファルを作ったほうがいいわけです。PHPを使うのであれば、もっと柔軟にプログラムらしくしましょう。
ビューの中の決め打ちの文字列を変数にしましょう。次のように変更してください。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title><?php echo $title; ?></title>
</head>
<body>
<h1><?php echo $title; ?></h1>
<p><?php echo $content; ?><p>
</body>
</html>
$titleと$contentという変数を導入しました。初期化されていない変数を利用しているために、NetBeansから警告が出されています。気にしないで進みましょう。(気になる方はオプションで、初期化されていない変数に対する警告を止めることも出来ます。)
続いて、コントローラの改造です。ビューに値を渡してあげるように変更します。
<?php
class Controller_Hello extends Controller {
function action_index() {
$view = View::forge('hello');
$view->title = 'FuelPHP テストプログラムです。';
$view->content = 'いらっしゃいませ、ご主人様';
return $view;
}
}
全く同じですと、変化がわかりませんので、多少変更してあります。 :D ご自由に変更ください。 ;)
では、実行してみましょう。実行アイコンをポチッとしましょう。
では、続いて/helloと/hello/名前のパターンに移ります。この2つのパターンは同じアクションで処理することにしていました。
routes.phpを次のように変更してください。
<?php
return array(
'_root_' => 'hello/index',
'hello' => 'hello/hello',
'hello/(:segment)' => 'hello/hello/$1',
);
処理する関数名はaction_hello()になりますね。
名前なしの場合、action_hello()は引数がなしで呼ばれます。名前がある場合は、それが引数に入ってきます。
ビューはhello.phpを使いまわせます。titleはとりあえず同じにしておいて(変えてもかまいません。ご自由に :D)contentを変えてあげれば、行けそうです。
ここまでのヒントで組めるでしょうか?PHPに慣れている人なら、いけますよね。もう、FuelPHPに関連する部分の仕様は出ています。あとは、単にPHPのプログラムとして組むだけです。自分で組まなきゃ、面白くありませんよね。チャレンジしてください。
一つの回答です。動作すれば、なんであれ問題ありません。
<?php
class Controller_Hello extends Controller {
function action_index() {
$view = View::forge('hello');
$view->title = 'FuelPHP テストプログラムです。';
$view->content = 'いらっしゃいませ、ご主人様';
return $view;
}
function action_hello($name = false) {
$view = View::forge('hello');
$view->title = 'FuelPHP テストプログラムです。';
$view->content = 'ようこそ、'.($name ? $name.'さん' : '世界');
return $view;
}
}
三項演算子が嫌いな方は、if文で書いてもかまいません。(世界には「さん」をつけないで、名前には「さん」を付けています。仕様を見落としたなんて言わないでください。:p もう、しようがないなぁぁ…)(現場で百万回は使用されているだろう歴史的なオヤジギャグでした。)
名前付きパラメータは、param関数を利用して、受け取ります。(実は、:segmentでも、正規表現であっても、$1,$2,$3を指定してあげれば、受け取れるんです。例えば、param('$1')と指定することで可能なんです。)
routes.phpを以下のように変更します。
<?php
return array(
'_root_' => 'hello/index',
'hello' => 'hello/hello',
'hello/:name' => 'hello/hello',
);
名前付きパラメーターはカッコで囲まなくても、大丈夫です。(内部的にはカッコつきの正規表現に展開されます。そのため、$1とか$2という形でルーティングで指定する事も可能です。routesetterを実行してみてください。正規表現もシミュレートしています。)
実際に渡された値を得るためには$this->param('name')と指定します。$this->param('name', false)と第2引数を指定することで、nameがない場合の値を指定できます。
さて、では組める方は、上記のヒントでコントローラーのhello.phpを変更してください。今度は簡単すぎますね。
<?php
class Controller_Hello extends Controller {
function action_index() {
$view = View::forge('hello');
$view->title = 'FuelPHP テストプログラムです。';
$view->content = 'いらっしゃいませ、ご主人様';
return $view;
}
function action_hello() {
$name = $this->param('name', false);
$view = View::forge('hello');
$view->title = 'FuelPHP テストプログラムです。';
$view->content = 'ようこそ、'.($name ? $name.'さん' : '世界');
return $view;
}
}
まずはroutes.phpに404の時のルーティングを設定しましょう。
<?php
return array(
'_root_' => 'hello/index',
'_404_' => 'hello/404',
'hello' => 'hello/hello',
'hello/:name' => 'hello/hello',
);
404の処理は通常のビューの表示とほぼ同じです。異なる部分は404のレスポンスコードを設定してあげることだけです。
<?php
class Controller_Hello extends Controller {
function action_index() {
$view = View::forge('hello');
$view->title = 'FuelPHP テストプログラムです。';
$view->content = 'いらっしゃいませ、ご主人様';
return $view;
}
function action_hello() {
$name = $this->param('name', false);
$view = View::forge('hello');
$view->title = 'FuelPHP テストプログラムです。';
$view->content = 'ようこそ、'.($name ? $name.'さん' : '世界');
return $view;
}
function action_404() {
$view = View::forge('hello');
$view->title = 'FuelPHP テストプログラムです。';
$view->content = 'ページが見つかりません。';
$this->response->status = 404;
return $view;
}
}
では実行してみましょう。存在しないでたらめなURLを指定してみてください。すると…残念。「ようこそ、404さん」と表示されます。
これも、前回のルーティングでお話しした、404時の指定も、再度ルーティングを通る仕様のための現象です。自分で例外を投げなくとも、ルーターが例外を投げているため、このような結果になります。ルーティングが見つからないため、ルーターは404を表示するための例外を投げます。すると'hello/404'が指定されており、それが再度ルーティングに送られ、'hello/:name'と一致したため、404が名前として処理されたわけです。
これを防ぐために、index.phpに手を入れる手法をお伝えしました。その時にも軽く触れた、ルーティングで再度定義する方法をここでは取りたいと思います。
routes.phpをこのように変更してください。
<?php
return array(
'_root_' => 'hello/index',
'_404_' => 'hello/404',
'hello/404' => 'hello/404',
'hello' => 'hello/hello',
'hello/:name' => 'hello/hello',
);
ここでのポイントは、ルーティングは上から順番に比較され、最初に一致したパターンが実行されるということです。'hello/:name'より前に、'hello/404'を自分自身に結びつけているため、これで正しく動作します。
では、再度でたらめなURLを指定し、404ページを表示してください。今度はうまくいくはずです。
| FuelBeans 8 : ルーティング、more about< 前 | 次 >FuelBeans 12 : ビューを柔軟に取り扱う |
|---|
| < 前 | 次 > |
|---|