黒曜
@kokuyouwind
▲ スライドのリンクは常に表示されています
スライドめくりもリンクされます
プログラマ向けの謎解きゲームを作りました
(主観)
黒曜
@kokuyouwind
/core
/model - MVCのM
/logic - 共有ロジック
/for_xxx
/public - web公開ディレクトリ
/controller - MVCのC
/view - MVCのV
/template - Smartyテンプレート
/core
/model - MVCのM
/logic - 共有ロジック
/for_xxx
/public - web公開ディレクトリ
/controller - MVCのC
/view - MVCのV
/template - Smartyテンプレート
/core
/model - MVCのM
/logic - 共有ロジック
/for_xxx
/public - web公開ディレクトリ
/controller - MVCのC メイン処理を書く場所
/view - MVCのV
/template - Smartyテンプレート
/core
/model - MVCのM
/logic - 共有ロジック
/for_xxx
/public - web公開ディレクトリ
/controller - MVCのC メイン処理を書く場所
/view - MVCのV 謎
/template - Smartyテンプレート
<?php
class UserModel extends HogeFWModel
{
public function get($id, $ignore_delete = false) {
$table = $this->get_table_name($id); // ソフトシャーディング
$query = "SELECT * FROM $table WHERE id = ?";
if (!$ignore_delete) {
// deletedが未来のことがあるので、IS NULLだけではだめ
$query .= "AND (deleted IS NULL OR deleted <= '$(data('Y-m-d h:i:s'))'");
}
$records = $this->db->execute($query, $id);
if ($records === false) {
// 厳密にfalseならSQL接続エラー
throw new SQLException('SQL接続エラーです');
} elseif (!$records) {
// クエリは成功したが中身が空
throw new NotFoundException('ユーザーが見つかりませんでした');
}
$user = $records[0];
// 他に必要な情報を補完する
return $this->appendInfo($user);
}
}
// こんな感じで使う
// callはメソッドの呼び出し結果をキャッシュする関数
$this->cache->call('User', 'get', $id);
// callには配列形式で渡しても良い
$um = $this-> getModel('User');
$this->cache->call([$um, 'get'], $id);
// 返ってくるのは配列(というかハッシュ)
['id' => '758',
'name' => '黒曜',
'registered' => '2016-04-16 15:50:00', // 大抵MySQL形式
'last_login' => 1460789400, // たまにUnixTimeが入っている
'attributes' => [
'belongs' => [
'Misoca' => ['id' => '331'] // どんどんネストする
],
'is_penalty' => 'none', // なぜか真偽値ではなく文字列
],
'append_info' => [
// 3段くらいネストしたなんらかの情報
]
]
/core
/model - MVCのM 配列の加工とDB処理
/logic - 共有ロジック
/for_xxx
/public - web公開ディレクトリ
/controller - MVCのC メイン処理を書く場所
/view - MVCのV 謎
/template - Smartyテンプレート
/core
/model - MVCのM 配列の加工とDB処理
/logic - 共有ロジック メイン処理を書く場所2
/for_xxx
/public - web公開ディレクトリ
/controller - MVCのC メイン処理を書く場所
/view - MVCのV 謎
/template - Smartyテンプレート
<?php
class ContentController extends HogeFWController
{
public function execute() {
// 大体2文字変数
$cm = $this->getModel('Content');
$nl = $this->getLogic('Normalize');
$cont = $this->cache->call([$cm, 'get'], $this->getAttribute('id'));
$cont = $nl->norm($cont);
// 間に300行くらい挟まる
if($has_body) {
$cont = $nl->normBody($cont);
}
// 間に500行くらい
if ($need_next) {
// さっきの$nlを上書きする
$nl = $this->getLogic('NextContent');
$content['next'] = $nl->calc($content);
}
// ...まだ続きます
// ...続き
// 間に300行くらい
// さっきの分岐を通ってると死ぬバグ
$content['append'] = $nl->normAppend($content);
//間に200行くらい
if ($need_extra) {
// 明らかに$nlじゃないけど$nlを上書きする
$nl = $this->getLogic('Extra');
$content['extra'] = $nl->compute($content);
}
// 間に300行くらい
// viewにcontentを受け渡す(Model, Logicからも可能)
$this->setAttribute('content', $content);
return;
}
}
<?php
class ContentController extends HogeFWController
{
public function execute() {
try {
$cm = $this->getModel('Content');
$content = $this->cache->call($cm, 'get', $this->getAttribute('id'));
if(!this->user) {
throw new NotLoginException();
}
// ログイン時、コンテンツありの処理が1000行くらい続く
} catch (NotLoginException $e) {
// 非ログイン時の処理
if ($cm->isAllowGuest($content)) {
// 非ログイン時、コンテンツ閲覧可の処理が800行くらい続く
// うち600行くらいはログイン時処理のコピペ
} else {
// view/content_error_viewを描画する
return 'content_error';
}
}
}
}
/core
/model - MVCのM
/logic - 共有ロジック
/for_xxx
/public - web公開ディレクトリ
/controller - MVCのC
/view - MVCのV
/template - Smartyテンプレート
/core
/model - MVCのM
/logic - 共有ロジック
/for_xxx
/public - web公開ディレクトリ
/controller - MVCのC メイン処理を書く場所
/view - MVCのV 謎
/template - Smartyテンプレート