PoiPHP の「最小・明快・必要最小限」という思想を活かして、 実際に動く簡易掲示板(BBS)を作る流れを紹介します。
SQLite / MySQL どちらでも動きます。
CREATE TABLE posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
body TEXT,
created_at TEXT
);
1 テーブル = 1 クラス。必要なのはこれだけです。
<?php
class Post extends Model
{
public $table = "posts";
}
このチュートリアルでは SQLite を使用します。
PoiPHP/config.php の database セクションを以下のように設定してください。
'database' => [
'dsn' => 'sqlite:' . POI_DIR . '/app.sqlite',
'user' => null,
'pass' => null,
],
SQLite はファイルを置くだけで動作するため、最も簡単に始められます。 MySQL を使いたい場合は DSN を書き換えてください。
投稿処理と一覧表示を 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");
}
PoiPHP では、テンプレートはすべて
layout.htmlを通して表示されます。 テンプレート側は「中身だけ」書けばよく、ヘッダーやフッターは layout にまとめて管理します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>= $s->html($title ?? "PoiPHP") ?></title>
</head>
<body>
<div class="container mt-4">
<?= $content ?> <!-- ← テンプレートの内容がここに入る -->
</div>
</body>
</html>
$contentは PoiPHP が自動で用意する変数で、テンプレートの内容がそのまま入ります。 開発者が定義する必要はありません。
フォームと一覧を表示するだけのシンプルなテンプレートです。 ヘッダーやフッターは 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 の「余計なものはポイ」という思想を体験できるサンプルです。