使 ってみよう kohana v3 kohana は MVC を 使 用 している PHP5のフレームワークです セキュア 軽 量 使 い 安 さを 目 的 としています 一 般 的 なデサインパターン 概 念 を 再 利 用 していますが kohana が 独 自 のものがあります コミュニティによる 開 発 厳 密 なオブジェクト 指 向 PHP 自 動 クラスローディング インターフェイス 抽 象 化 シングルトン 超 軽 量 kohana は 大 型 のモノシリックライブラリを 避 けるため PECL 拡 張 PEAR ライブラリとは 依 存 関 係 がありません 1/18
目 次 1 はじめに... 3 2 導 入... 4 3 設 定... 5 4 テストアプリケーションを 作 ろう... 8 5 プログラムの 作 成... 10 5.2 コントローラー...11 5.3 ビュー... 12 5.4 モデル... 13 6 エラーを 出 してみよう... 15 6.2 ; を 忘 れた... 16 6.4 モデルのクラス 名 を 間 違 えた... 16 6.5 定 義 されていない 関 数 を 使 用 した... 16 6.6 データベースの 結 果 セットから 間 違 った 項 目 名 で 情 報 を 取 得 した... 16 7 モジュール... エラー! ブックマークが 定 義 されていません 2/18
1 はじめに PHP のフレームワークは 多 数 ありますが 私 自 身 これらを 利 用 したプロジェクトを 行 った 経 験 がありません 実 際 には フレームワークを 適 用 するために 幾 度 となく 各 フレームワークの 機 能 や 使 い 方 にトライしてみましたが いまいち 気 に 入 ったフレームワークに 遭 遇 しませんでした 本 心 は 是 非 ともレームワークを 使 いたかったのですが! 皆 さんはできるだけフレームワークを 利 用 すべきと 思 います 現 在 主 流 のフレームワークは Symfony CakePHP Zend Framework ethna です 利 点 と 欠 点 がありますが 利 点 は 欠 点 を 補 って 余 りあるものです ここでフレームワークのおさらいをして 見 ましょう 利 点 MVC アーキテクチャによる 機 能 分 離 モデル データベース ビュー 表 示 コントローラー 制 御 生 産 性 向 上 コード 量 の 劇 的 減 少 オブジェクトを 利 用 することで 書 くコードの 量 が 劇 的 に 少 なくなる 同 じようなコード(DB 接 続 データ 読 み 込 み HTML 表 示 など)を 重 複 して 書 かなく てもよい 均 質 な 開 発 保 守 性 の 向 上 欠 点 フレームワークの 理 解 コスト 機 能 不 足 対 処 そこで kohana はどうなの? とにかく 超 軽 量 インストール 簡 単 使 うのも 簡 単 に 惹 かれました 3/18
2 導 入 私 の 環 境 は OS windowsxp SP3 XAMPP1.7.1 kohana の 取 得 は 下 記 の URL からできます http://v3.kohanaphp.com/ ダウンロードタブで 安 定 版 を 選 択 します kohana_v3..x.x,zip がダウンロードされます ZIP を 解 凍 します 出 来 上 がったディレクトリ kohana を xampp の htdocs に 移 動 します 確 認 作 業 アドレスは http://localhost/kohana/index.php これが 表 示 されれば OK です 4/18
3 設 定 kohana が 動 いたので 設 定 をしましょう kanaha/install.php を 削 除 します 再 度 アクセス http://localhost/kohana/index.php hello world 表 示 されました ここで kohana のファイル 構 造 を 見 て 見 ましょう ディレクトリ 構 成 が 変 わりました root +- application +- cache +- classes +- controllers +- config +- logs +- bootstrap +- modules +- auth +- codebench +- database +- images +- orm +- pageination +- userguide +-... +- system +- classes +- config +- i18n +- messages +- utf8 +- views +- index.php +- example.htaccess 5/18
名 前 の 付 け 方 ルール クラスは application/classes の 中 に 入 れる アンダースコアはスラッシュに 変 換 される ファイル 名 は 小 文 字 クラス 記 述 クラスの 種 類 をプレフィックスでつける controller_xxxxx Model_XXXXX Public 関 数 は action_をプレフィックスでつける コントローラ 格 納 場 所 が 変 更 されました application/classes/controller フォルダーにアプリケーションを 作 っていきます モデル 格 納 場 所 application/classes/model ビュー 格 納 場 所 application/views 設 定 場 所 も 変 更 されますた それではまず konoha//application/bootstrap.php を 修 正 しましょう Kohana::modules(array( コメントを 外 し database =MODPATH.database, データベースを 有 効 にします 次 にデータベースの 設 定 modules database config database.php type にデータベース 種 類 mysql user に 使 用 者 root database にデータベース 名 testdb 注 意 :dietdb はまだ 作 っていません xampp の phpmyadmin で 作 成 します 6/18
.htaccess の 作 成 example.htaccessa をそのまま 使 ってください windowsではリネイムができません v.2.3.4 のものを 使 いました URI のリライトとは http://localhost/コントローラ 名 /メゾット 名 / 引 数 / 引 数 のように 記 述 できます 7/18
4 テストアプリケーションを 作 ろう ダイエットの 記 録 と 登 録 表 示 するアプリを 作 ります 起 動 すると 過 去 の 記 録 を 表 示 します 本 日 の 記 録 を 入 力 して 更 新 ボタンを 押 すと 登 録 し ページを 更 新 します データベースは dietdb,テーブルは diet とします http://127.0.0.1 で xammp を 起 動 します phpmyadmin を 起 動 し,dietdb を 作 ります 8/18
テーブル diet を 作 ります 項 目 数 は3 個 です 項 目 数 を 作 ります wait,percent,udate 作 成 結 果 初 期 データを 入 れましょう 挿 入 タブ 押 します 挿 入 結 果 9/18
5 プログラムの 作 成 5.1 kohana を 使 わないで PHP でデータを 取 得 する <?PHP //(1)パラーメータの 取 得 $parm=$_post['parm']; //(2)データベース 設 定 if (!($cn = mysql_connect("localhost", "root", ""))) { print "db error"; die; $db="dietdb"; // MySQL DB 選 択 if (!(mysql_select_db($db))) { print "DB select error $db"; die; $sql="set names UTF8"; mysql_query($sql); //(3)データの 取 得 $sql="select wait,percent,udate from diet limit 1"; if (!($result = mysql_query($sql))) { print "err:$sql";die; $row = mysql_fetch_row($result); $wait=$row[0]; // $percent=$row[1]; // $udate=$row[2]; // //(4) 出 力 print "<html><body>"; print "<tabel><tr>"; print "<td>$wait</td><td> percent</td><td>$udate</td>"; print "</tr></table>" print "</body></html>"; //テンプレートエンジン(Smarty など)を 使 うときはここで 指 定 このように 何 もかも コーディングしなければなりません これが kohana を 使 うとどのようになるのでしょうか? 10/18
5.2 コントローラー 次 は MVC のコントローラを 作 ります これが WEB からアクセスする 基 点 になります konoha/application/classes/controller/diet diet.php を 作 成 します まず helloworld を 表 示 しましょう ここで 注 意 しなければならないのは クラスの 名 前 は ontroller プレフィックスの 次 に PHP の 名 前 と 同 じ かつ クラスの 先 頭 文 字 を 大 文 字 にしなければなりません <?php defined('syspath') OR die('no direct access allowed.'); class Controller_Diet extends Controller { public function action_index() { $this->request->response = 'hello, world!';?> さあ 実 行 してみましょう http://127.0.0.1/konoha/diet Hello World が 表 示 されました 実 行 されるのはコントローラーの 関 数 index です http://127.0.0.1/konoha/diet/index でも 同 じです 説 明 をすると http://localhost/konoha/コントローラ 名 /メゾット 名 / 引 数 / 引 数 11/18
5.3 ビュー 出 力 する HTML を 用 意 します <?php defined('syspath') OR die('no direct access allowed.');?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <?php echo $content?> </body> </html><body> <html> <body> <table><tr> <?PHP foreach ($data as $d) { print "<tr><td>$d->wait</td> <td>$d->percent </td><td>$d->udate</td></tr>";?> </tr></table> </body> </html> ビューのファイルを 保 存 konoha/application/view views/diet diettemplate.php を 作 成 します konoha/application/view views/diet diet.php を 作 成 します HTML のなかに PHP を 書 くのは テンプレートを 使 ってきた 方 には 違 和 感 を 感 じる 方 がいる と 思 います これも 軽 量 化 のためです 我 慢 しましょう 記 述 された 変 数 は コントローラから 渡 されます 12/18
5.4 モデル データベースをアクセスする 部 分 を 作 りましょう konohaapplication/clsses/ clsses/mo model/ del/diet diet.php を 作 成 します クラス 名 の 書 き 方 が 変 更 になりました query の 引 数 も 変 更 になりました type sql の 種 類 を 入 れなければなりません select:,insert. Query 同 じ Object true:stdclass 関 数 GetData で 情 報 を 取 得 します <?php defined('syspath') or die('no direct script access.'); class Model_diet extends Model { protected $db; public function construct() { parent:: construct(); $this->db = Database::instance(); public function getdata() { $sql="select wait,percent,udate from diet order by udate DESC"; $result=$this->db->query(database::select,$sql,true); return $result;?> さあ 準 備 ができました コントローラーを 修 正 して モデル ビューを 使 えるようにしましょ う 13/18
5.5 コントローラの 修 正 konoha/application/classes/controller/diet diet.php を 修 正 します <?php defined('syspath') or die('no direct script access.'); class Controller_diet extends Controller_Template { public $template = 'diettemplate';?> public function action_index() { $this->template->content = new View('diet'); $dat = new model_diet; $result=$dat->getdata(); $this->template->content->data=$result; //ビュー //モデル //データ 取 得 アクセスしてみましょう http://127.0.0.1/konoha/diet どうですか? データは 表 示 されましたか? kohana を 使 うと ファイルが3 個 に 分 割 され それぞれの 役 割 分 担 ができています データベースの 出 力 は stdclass になっている テーブルの 項 目 名 で 参 照 できるは ミスが 少 なくなって 便 利 です データベース 接 続 などは 書 かなくてもいいです 分 割 されているので 単 体 検 査 が 楽 になります 14/18
6 エラーを 出 してみよう プログラムを 作 成 する 段 階 で 必 ず 行 うことがシンタックスのデバッグです たとえば 変 数 名 を 間 違 った SQL 文 を 間 違 った ; を 忘 れた 関 数 名 を 間 違 った PHP の 書 き 方 間 違 い まあ 数 え 上 げればきりがありません このようなときに kohana はどのようなエラーを 返 してくれるのでしょうか 結 構 いい 情 報 を 出 してくれるので 開 発 の 生 産 性 に 寄 与 します 出 力 例 controller/diet.php で 定 義 されていない 変 数 $results を 使 ったときです 実 際 はミススペルで $result でした v2.3.4 より 見 やすくなりました 15/18
6.1 定 義 されていない 変 数 を 使 った 変 数 のミススペル 6.2 ; を 忘 れた 通 常 の PHP エラーが 出 ます 6.3 定 義 されてないビューを 指 定 した 6.4 モデルのクラス 名 を 間 違 えた クラス 名 がないと 表 示 される model/diet.php 内 に Class Dietm_model()がない 6.5 定 義 されていない 関 数 を 使 用 した model/diet.php に Getdata1 関 数 がない 6.6 データベースの 結 果 セットから 間 違 った 項 目 名 で 情 報 を 取 得 した 間 違 った 項 目 名 が 表 示 されます 6,7 データベースからデータが 取 得 できなかったの 結 果 セットからデータを 取 り 出 そうとし たこのような 例 が 一 番 面 倒 です 具 体 的 な 行 や 変 数 名 などが 表 示 されません 16/18
テーブル スキーマ CREATE TABLE IF NOT EXISTS `roles` ( `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, `name` varchar(32) NOT NULL, `description` varchar(255) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uniq_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `roles` (`id`, `name`, `description`) VALUES(1, 'login', 'Login privileges, granted after account confirmation'); INSERT INTO `roles` (`id`, `name`, `description`) VALUES(2, 'admin', 'Administrative user, has access to everything.'); CREATE TABLE IF NOT EXISTS `roles_users` ( `user_id` int(10) UNSIGNED NOT NULL, `role_id` int(10) UNSIGNED NOT NULL, PRIMARY KEY (`user_id`,`role_id`), KEY `fk_role_id` (`role_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `users` ( `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, `email` varchar(127) NOT NULL, `username` varchar(32) NOT NULL DEFAULT '', `password` char(50) NOT NULL, `logins` int(10) UNSIGNED NOT NULL DEFAULT '0', `last_login` int(10) UNSIGNED, PRIMARY KEY (`id`), UNIQUE KEY `uniq_username` (`username`), UNIQUE KEY `uniq_email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE IF NOT EXISTS `user_tokens` ( `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` int(11) UNSIGNED NOT NULL, `user_agent` varchar(40) NOT NULL, 17/18
`token` varchar(32) NOT NULL, `created` int(10) UNSIGNED NOT NULL, `expires` int(10) UNSIGNED NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uniq_token` (`token`), KEY `fk_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `roles_users` ADD CONSTRAINT `roles_users_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE, ADD CONSTRAINT `roles_users_ibfk_2` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE; ALTER TABLE `user_tokens` ADD CONSTRAINT `user_tokens_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE; データ Users Roles_user Roles 18/18