Zend Frameworkと戯れる -じゃんけんゲームを作ってみる-


とりあえず、タイトル通りのことをやってみた。
Hello, World!じゃつまらないので、名前入れてもらってじゃんけんの手を選んでもらってCPUと対決しましょう、という感じ。
まず、ディレクトリ構成を考えることに。
サブドメイン(xxx.yuxx.netのxxxの部分)を切ってやっても良いんだけど、便利な設定してないから、UserDir(xxx.yuxx.net/~hogeの~hogeの部分)でやることに。
しかもドキュメントルート(このアプリの頭はやっぱつかいたくなかったからディレクトリを一段したにした。
URL的にはhttp://test.yuxx.net/~yuxx。

以下、treeコマンドより。(超便利w)

zend_test_prj
|-- public_html
|   `-- zend_test
|       |-- .htaccess
|       `-- index.php
`-- web_app
`-- zend_test
|-- controllers
|   `-- IndexController.php
|-- models
`-- views
`-- scripts
`-- index
|-- index.phtml
`-- pon.phtml

public_html以下が公開ディレクトリで、web_appがプログラムの場所。
まぁ、web_appはプログラムは権限さえあればどこ置いたって良いんだけどね。
名前も本来はapplicationsが推奨だし。。

で、まず公開領域にある.htaccessを置きましょう、と。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

一行目でURLを変換出来るようにmod_rewriteをOnに。
4行目で「js、ico、gif、jpg、png、css以外はindex.phpへ送る」と言う設定。
Flashとかをこのディレクトリ内に置いて使うんだったら適宜設定を。
2行目と3行目は別に必要ないんだけど、そのディレクトリ内にURLで叩かれたディレクトリ、あるいはファイルがあった場合はそっち優先で見に行くよ~と言うおまじない。

お次は同じ場所に設置するindex.php。

<?php
ini_set('display_errors', 'On');
require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::run('../../web_app/zend_test/controllers');

2行目は一応エラー表示させたいので置いといた。
この程度のプロジェクトだからそうそうエラーは出ないだろうけど、それでも俺みたいな脳たりんには重要だったりする。
もちろん、リリース時には外すけど:-)
で、重要なのは3行目と4行目。
3行目は基本的にこういうもの、と言うことで。
4行目はこのファイル「index.php」の場所から見ての相対パスで、IndexController.phpがどこにあるか、と言うこと。
今回の場合、ドキュメントルートがそもそも1階層深かったり、アプリケーションルートもそれに合わせて深くしたりしているから、チト長い書き方になってしまったかね。。。

で、用意したテンプレはこんな感じ。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html, charset=UTF-8">
<title>じゃんけん</title>
</head>
<body>
<center>
<h1>じゃんけんゲーム</h1>
<?php if (!empty($this->errMsgs)) { ?>
<?php   foreach ($this->errMsgs as $currMsg) { ?>
<span style="color:#ff0000"><?php echo $currMsg ?></span><br />
<?php   } ?>
<?php } ?>
<form action="<?php echo $this->baseUrl(); ?>/index/pon" method="post">
お名前<?php echo $this->formText('pName', $this->escape($this->pName)) ?><br />
<?php echo $this->formRadio('pMethodKey', $this->pMethodKey, null, $this->methodNames) ?>
<br /><?php echo $this->formSubmit('', 'ポン!') ?>
</center>
</body>
</html>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html, charset=UTF-8">
<title>ポン!</title>
</head>
<body>
<center>
<h1>CPU &gt; <?php echo $this->cpuMethod ?></h1>
<?php echo $this->escape($this->pName)?>さんは<?php echo $this->pMethodName?>を出したのでの<?php echo $this->result?>です。<br />
<a href="<?php echo $this->baseUrl(); ?>">戻る</a>
</center>
</body>
</html>

では、web_app/zend_test以下のcontrollers/IndexController.phpを見ていこうか。
ちなみに、このコントローラーはデフォルトだと一番最初にアクセスされるコントローラクラスと言うことになる。

<?php
// load base components.
require_once 'Zend/Controller/Action.php';
class IndexController extends Zend_Controller_Action
{
private $_methodNames = array(
0 => 'グー',
1 => 'パー',
2 => 'チョキ'
);
private $_resultNames = array(
0 => 'あいこ',
1 => '負け',
2 => '勝ち'
);
// Index action
public function indexAction()
{
$this->view->assign('methodNames', $this->_methodNames);
}
public function ponAction()
{
$req = $this->getRequest();
$errMsgs = array();
$pName = $req->getPost('pName');
if ($pName == null || $pName == '') {
$errMsgs[] = '名前を入力して下さい。';
}
$pMethodKey = $req->getPost('pMethodKey');
if ($pMethodKey == null || $pMethodKey == '') {
$errMsgs[] = 'あなたの手を選択して下さい。';
$pMethodKey = null;
} else {
$errFlg = true;
foreach ($this->_methodNames as  $key => $methodName) {
if ($pMethodKey == $key) {
$errFlg = false;
break;
}
}
if ($errFlg == true) {
$errMsgs[] = 'もう一度選択して下さい。';
}
}
// index、ponの両方で必要なデータのアサイン
$this->view->assign('pName', $pName);
if (!empty($errMsgs)) {
// indexで必要なデータのアサイン
$this->view->assign('errMsgs', $errMsgs);
$this->view->assign('pMethodKey', $pMethodKey);
$this->view->assign('methodNames', $this->_methodNames);
// indexをレンダー
//            $this->render('index/index'); // なぜかこれだと動作しない。
$this->getHelper('viewRenderer')->setNoController()->setScriptAction('index/index');
// 処理修了
return;
}
// CPUのじゃんけんの手をランダムで出す
srand(time());
$cpuMethodKey = rand() % 3;
// じゃんけんの結果を計算
$result = ($cpuMethodKey - $pMethodKey + 3) % 3;
// ponで必要なデータのアサイン
$this->view->assign('pMethodName', $methodName);
$this->view->assign('cpuMethod', $this->_methodNames[$cpuMethodKey]);
$this->view->assign('result', $this->_resultNames[$result]);
}
}

今回はMVC(モデル・ビュー・コントローラー)デザインの内、DBを使ってないからModelは用意せず、コントローラー内でバリデート(エラーチェック)を行った。
Postされた値は$this->getRequest()で取ってくることが出来る。
また、ビューでデータを使うためには他のフレームワーク同様アサイン(追加)しないといけない。
アサイン方法は$this->view->assign(‘ビューで使うための変数名’, データ)という感じ。
ビューファイルで使うときは先ほどのビューに書いてあるとおり、$this->ビューで使うための変数名 と言う風に取ってこれる。
とまぁ、こんな感じ。
じゃんけんのルーチンは自分で検証してみてくだされ。

出来上がったクソアプリは下記の通り。
http://test.yuxx.net/~yuxx/zend_test

一応まとまったソースは下記。
zend_test_prj.tar.bz2
zend_test_prj.zip
お好きな方をどうぞ。

お粗末。

Zend Framework 徹底マスター

著者/訳者:藤野 真吾

出版社:ソーテック社( 2009-04-11 )

定価:

Amazon価格:¥ 26,034

単行本 ( 592 ページ )

ISBN-10 : 488166669X

ISBN-13 : 9784881666692


Post to Twitter

, ,

  1. No comments yet.
(will not be published)