PoiPHP で簡易掲示板を作ってみる

概要

PoiPHP の「最小・明快・必要最小限」という思想を活かして、 実際に動く簡易掲示板(BBS)を作る流れを紹介します。

1. テーブルを作る

SQLite / MySQL どちらでも動きます。

CREATE TABLE posts (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT,
    body TEXT,
    created_at TEXT
);
        

2. モデルを作る(models/Post.php)

1 テーブル = 1 クラス。必要なのはこれだけです。

<?php
class Post extends Model
{
    public $table = "posts";
}
        

3. config.php の設定

このチュートリアルでは SQLite を使用します。 PoiPHP/config.php の database セクションを以下のように設定してください。

'database' => [
    'dsn'  => 'sqlite:' . POI_DIR . '/app.sqlite',
    'user' => null,
    'pass' => null,
],

SQLite はファイルを置くだけで動作するため、最も簡単に始められます。 MySQL を使いたい場合は DSN を書き換えてください。

4. コントローラ(index.php)

投稿処理と一覧表示を 1 ファイルで完結できます。

<?php
require_once __DIR__ . '/PoiPHP/poiphp.php';

function action(&$c)
{
    $Post = $c->loadModel("Post");

    // 投稿処理
    if ($c->isPost()) {

        if ($c->csrfError) {
            return $c->error("CSRF token mismatch");
        }

        $Post->insert([
            "name"       => $c->post("name"),
            "body"       => $c->post("body"),
            "created_at" => date("Y-m-d H:i:s")
        ]);

        return $c->redirect("index");
    }

    // 一覧
    $list = $Post->query("SELECT * FROM posts ORDER BY id DESC");

    $c->set("list", $list);
    $c->setTemplateFile("html/bbs.html");
}
        

5. レイアウト(layout.html)

PoiPHP では、テンプレートはすべて layout.htmlを通して表示されます。 テンプレート側は「中身だけ」書けばよく、ヘッダーやフッターは layout にまとめて管理します。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>html($title ?? "PoiPHP") ?></title>
</head>
<body>

<div class="container mt-4">
    <?= $content ?>   <!-- ← テンプレートの内容がここに入る -->
</div>

</body>
</html>
    

$contentは PoiPHP が自動で用意する変数で、テンプレートの内容がそのまま入ります。 開発者が定義する必要はありません。

6. テンプレート(html/bbs.html)

フォームと一覧を表示するだけのシンプルなテンプレートです。 ヘッダーやフッターは layout.html に任せます。

<h1>簡易掲示板</h1>

<form method="post">
    <input type="hidden" name="_token" value="<?= $c->csrf ?>">

    名前:<br>
    <input type="text" name="name"><br><br>

    本文:<br>
    <textarea name="body" rows="4" cols="40"></textarea><br><br>

    <button>投稿</button>
</form>

<hr>

<?php foreach ($list as $p): ?>
    <div style="margin-bottom:20px;">
        <strong><?= $s->html($p["name"]) ?></strong>
        (<?= $s->html($p["created_at"]) ?>)<br>
        <?= nl2br($s->html($p["body"])) ?>
    </div>
<?php endforeach; ?>
    

これで完成です

わずか数ファイルで、実際に動く掲示板が作れます。
コントローラ・モデル・テンプレート・レイアウトが最小構成でまとまり、 PoiPHP の「余計なものはポイ」という思想を体験できるサンプルです。