Flightで作った掲示板をクラスに分割してみる

Flightのルーティングの呼び出し処理をクラスに変更

今回までのソースコードをGithubへ登録しています。Github
前回作った簡易掲示板を管理しやすくするために処理の呼び出し先をクラスに変更します。

ついでにviewの部分の呼び出しを分割していきます。index.phpを以下のように変更しています。

<?php

class bbs
{
    public static function index()
    {
        $db   = Flight::db();
        $stmt = $db->prepare('select * from bbs order by created DESC limit 20');
        $stmt->execute();
        $a    = $stmt->fetchAll(PDO::FETCH_ASSOC);

        Flight::render('header');
        Flight::render('top', array('hoge' => $a));
        Flight::render('footer');
    }
    public static function post()
    {
        $db   = Flight::db();
        $stmt = $db->prepare("insert into bbs(content, mail, name) values('{$_POST['content']}', '{$_POST['mail']}', '{$_POST['name']}')");
        $stmt->execute();

        Flight::redirect('./');
    }
}

Flight::register('db', 'PDO', array('mysql:host=127.0.0.1;dbname=flight_test', 'root', 'root'));
Flight::route('POST /', array('bbs', 'post'));
Flight::route('/', array('bbs', 'index'));

最後の行のあたりのrouteの呼び出し引数が直接functionを入れずにクラス名とメソッド名で呼び出しています。

Flight::route('/', array('bbs', 'index'));

第二引数の配列の最初がクラス名、次にメソッド名となっています。メソッドの中身は前回と処理内容は変わらず、viewの呼び出しが変わっております。

ルーティングの / の部分は前回と変わらず、次の引数にクラス名とメソッド名を記述した配列が引数になっています。呼び出した順番にviewファイルが展開されますので上から順番に呼び出していますが、.phpは省略できるようなのでrenderの後の引数にはheader, top, footerと素っ気ない書き方になっています。

これで前回作った部分までをclassで呼び出す方法に変更することができました。

Viewの中身

header.php

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
<meta name="keywords" content="">
<meta name="description" content="">

<!-- http://todc.github.io/todc-bootstrap/components/#panels-heading -->
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap-theme.min.css">
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>

</head>
<body>

top.php

<div class="container">
<h1>flight test 掲示板</h1>
</div>

<div class="container">
<form method="post" action="./" class="form-horizontal" role="form">
  <div class="form-group">
    <label for="input_name" class="col-sm-1 control-label">名前</label>
    <div class="col-sm-2">
      <input type="text" name="name" class="form-control" id="input_name" value="" placeholder="名前">
    </div>
  </div>
  <div class="form-group">
    <label for="input_mail" class="col-sm-1 control-label">メール</label>
    <div class="col-sm-4">
      <input type="mail" name="mail" class="form-control" id="input_mail" value="" placeholder="hoge@hogehoge.com">
    </div>
  </div>
  <div class="form-group">
    <label for="input_text" class="col-sm-1 control-label">内容</label>
    <div class="col-sm-4">
      <textarea name="content" class="form-control" id="input_text"></textarea>
    </div>
  </div>
  <div class="form-group">
    <div class="col-sm-offset-1 col-sm-4">
      <input type="submit" class="btn btn-primary">
    </div>
  </div>
</form>
</div>

<div class="container">

<hr>

<? foreach ($hoge as $c) { ?>
<div class="panel panel-default">
  <div class="panel-heading">
    <span class="label label-primary"><?=$c['name'];?></span>
    <a href="mailto:<?=$c['mail'];?>"><?=$c['mail'];?></a>
    <span class="label label-default"><?=$c['created'];?></span>
  </div>
  <div class="panel-body">
    <?=$c['content'];?>
  </div>
</div>
<? } ?>

</div>

footer.php

</body>
</html>