PoiPHP は「余計なものはポイ」という思想で作られた、軽量・明快・必要最小限の PHP フレームワークです。
PoiPHP は ZIP を展開するだけで使えます。特別なセットアップは不要です。
/your-app/
├ index.php ← アプリの入口(actionを書く)
├ html/ ← テンプレート
├ models/ ← モデル
└ PoiPHP/ ← フレームワーク本体
├ core/ ← フレームワーク内部クラス
├ poiphp.php ← メインローダー
└ config.php ← フレームワーク設定
PoiPHP は PDO を使用しており、
config.phpの
databaseセクションで DSN を指定します。
MySQL を使用する場合は、以下のように DSN を記述します。
'database' => [
'dsn' => 'mysql:host=localhost;dbname=poiphp;charset=utf8mb4',
'user' => 'root',
'pass' => 'password',
],
SQLite を使う場合は DSN を
sqlite:に変更します。
'database' => [
'dsn' => 'sqlite:' . POI_DIR . '/app.sqlite',
'user' => null,
'pass' => null,
],
Model の insert / update / delete は未対応ですが、query() で生 SQL は利用できます。
'database' => [
'dsn' => 'pgsql:host=localhost;dbname=poiphp',
'user' => 'postgres',
'pass' => 'password',
],
PoiPHP は「必要な時だけ接続」する設計です。 Model をロードした時点で初めて DB に接続します。
PoiPHP の設定は
PoiPHP/config.phpに記述します。 デバッグモード、データベース接続、アプリ固有の設定をまとめた シンプルで明快な構成です。
return [
// デバッグモード
'debug' => true,
// データベース設定(PDO)
'database' => [
'dsn' => 'mysql:host=localhost;dbname=;charset=utf8mb4',
'user' => '',
'pass' => '',
],
// SQLite の例
// 'database' => [
// 'dsn' => 'sqlite:' . POI_DIR . '/app.sqlite',
// 'user' => null,
// 'pass' => null,
// ],
// PostgreSQL(生 SQL のみ利用可能)
// 'database' => [
// 'dsn' => 'pgsql:host=localhost;dbname=poiphp',
// 'user' => 'postgres',
// 'pass' => 'password',
// ],
// レイアウト設定(任意)
//'layout' => 'html/layout.html',
'layout' => null,
// アプリ固有の設定
'app' => [
'base_url' => '',
'default_controller' => 'index',
],
];
'debug' =>trueの場合、エラー画面に詳細情報が表示されます。 本番環境では
falseに設定してください。
PoiPHP は PDO を使用しており、DSN を記述するだけで DB を切り替えられます。
'database' => [
'dsn' => 'mysql:host=localhost;dbname=poiphp;charset=utf8mb4',
'user' => 'root',
'pass' => 'password',
],
'database' => [
'dsn' => 'sqlite:' . POI_DIR . '/app.sqlite',
'user' => null,
'pass' => null,
],
'database' => [
'dsn' => 'pgsql:host=localhost;dbname=poiphp',
'user' => 'postgres',
'pass' => 'password',
],
PoiPHP は「必要な時だけ接続」する設計です。
$c->loadModel()を呼んだ時点で初めて DB に接続します。
PoiPHP は
layout.html を使った 1 レイアウト方式を採用しています。
全ページ共通のヘッダー・フッター・HTML 構造を layout.html にまとめて記述し、
ページごとの内容は
<?= $_poi_content ?>の位置に差し込まれます。
'layout' => 'html/layout.html',
'layout' =>null
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title><?= $s->html($title ?? "PoiPHP") ?></title>
</head>
<body>
<header>
<!-- 共通ヘッダー -->
</header>
<main>
<?= $_poi_content ?>
</main>
<footer>
<!-- 共通フッター -->
</footer>
</body>
</html>
アプリをサブディレクトリに配置する場合に設定します。 通常は空文字のままで問題ありません。
URL に何も指定されなかった場合に呼ばれるコントローラ名です。 デフォルトは
indexです。
まずは最小の画面を作ってみましょう。
<?php
require_once __DIR__ . '/PoiPHP/poiphp.php';
function action(&$c)
{
$c->set("msg", "Hello PoiPHP!");
$c->setTemplateFile("html/index.html");
}
<h1><?= $s->h($msg) ?></h1>
これだけで画面が表示されます。
URL → action() → set() → テンプレート → レイアウト → HTML 出力
複雑な仕組みはありません。 「必要な時だけ必要な処理をする」だけです。
/html/index.html
/html/user_list.html
/html/login.html
URL に応じて自動的に action() が呼ばれます。
function action(&$c)
{
$c->set("title", "Hello PoiPHP");
$c->setTemplateFile("html/index.html");
}
<h1><?= $s->html($title) ?></h1>
PoiPHP のテンプレートでは、以下の変数が自動で利用できます。
$c… コントローラオブジェクト(POST/GET、セッション、CSRF など)
$s… サニタイズ(エスケープ)用オブジェクト
$_poi_content… layout.html 内で使用される、テンプレートの内容
テンプレートで値を表示する時は、必ず
$s->html()を使って XSS を防ぎます。
<?= $s->html($value) ?>
<?= $s->h($value) ?>
PoiPHP のテンプレートおよびコントローラでは、入力値の取得と出力時のエスケープのために
$s が利用できます。
$s->html($value)
HTML エスケープ(XSS 対策)。配列・多次元配列にも対応。
$s->h($value)
$s->html() の短縮形。
$s->url($value)
URL エンコード。GET パラメータに埋め込む時に使用。
$s->json($value)
JSON エスケープ。JavaScript に安全に埋め込むための出力。
$s->post($key)
$_POST[$key] を取得し、HTML エスケープして返す。
$s->postt($key)
$_POST[$key] を取得 → エスケープ → trim() して返す。
$s->posts($key)
$_POST[$key] を取得 → エスケープ → $_SESSION[$key] に保存して返す。
$s->postst($key)
$_POST[$key] を取得 → エスケープ → trim() → $_SESSION[$key] に保存して返す。
$s->get($key)
$_GET[$key] を取得し、HTML エスケープして返す。
$s->gett($key)
$_GET[$key] を取得 → エスケープ → trim() して返す。
$s->gets($key)
$_GET[$key] を取得 → エスケープ → $_SESSION[$key] に保存して返す。
$s->getst($key)
$_GET[$key] を取得 → エスケープ → trim() → $_SESSION[$key] に保存して返す。
$_poi_contentは PoiPHP が自動で用意する変数で、テンプレートの内容がそのまま入ります。 開発者が定義する必要はありません。
PoiPHP では、すべてのテンプレートは
layout.htmlを通して表示されます。 テンプレート側は「中身だけ」書けばよく、ヘッダーやフッターは layout にまとめて管理できます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title><?= $s->html($title ?? "PoiPHP") ?></title>
</head>
<body>
<?= $_poi_content ?> <!-- ← テンプレートの内容がここに入る -->
</body>
</html>
$_poi_contentは PoiPHP が自動で用意する変数で、テンプレートの内容がそのまま入ります。 開発者が定義する必要はありません。
<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"></textarea><br><br>
<button>投稿</button>
</form>
<hr>
<?php foreach ($list as $p): ?>
<div>
<strong><?= $s->h($p["name"]) ?></strong>
(<?= $s->html($p["created_at"]) ?>)<br>
<?= nl2br($s->h($p["body"])) ?>
</div>
<?php endforeach; ?>
テンプレートにはヘッダーやフッターを書く必要はありません。 すべて layout.html に任せることで、ページ全体の統一感を保てます。
$c->setTemplateFile("html/bbs.html");
これだけで自動的に layout.html が適用されます。
PoiPHP は PDO を使用した必要最小限の DB ラッパーを提供しており、以下のデータベースに対応しています。
SQLite ✔ 標準対応(最小構成・設定が最も簡単)
MySQL ✔ 対応(config.php に DSN / user / pass を記述)
MariaDB ✔ 対応(MySQL と同等)
PostgreSQL △ 生 SQL は利用可能(Model の insert/update/delete は未対応)
その他 ✘ 非対応(動作保証なし)
PoiPHP は ORM を搭載していません。 必要な時だけモデルをロードし、必要なクエリだけを実行する シンプルで明快な設計です。
PoiPHP のモデルは「1 テーブル = 1 クラス」のシンプルな仕組みです。
必要な時だけ $c->loadModel() でロードし、データベース操作を行います。
<?php
class User extends Model
{
public $table = "users"; // 対応するテーブル名
}
$userModel = $c->loadModel("User");
findAll()
テーブルの全件を配列で返します。
find($id)
主キー(id)で1件取得します。見つからなければ null。
findBy($column, $value)
任意のカラムで検索し、配列で返します。
insert($data)
データを INSERT し、挿入された ID を返します。
update($id, $data)
主キーで UPDATE。成功時 true、失敗時 false を返します。
delete($id)
主キーで DELETE。成功時 true、失敗時 false を返します。
query($sql, $params)
生 SQL(SELECT)を実行し、結果を配列で返します。
exec($sql, $params)
生 SQL(INSERT/UPDATE/DELETE)を実行し、成功/失敗を返します。
updateCount($id, $data)
UPDATE を実行し、更新件数(rowCount)を返します。
// User モデルをロード
$userModel = $c->loadModel('User');
// 1件取得
$user = $userModel->find(1);
// 保存して新しいIDを受け取る
$newId = $userModel->insert(['name' => 'Taro']);
// 更新して影響があった件数を確認
$count = $userModel->updateCount(1, ['name' => 'Jiro']);
複雑な ORM 機能はありません。
必要な時に必要な処理だけを行う、軽量なモデルです。
PoiPHP はシンプルなページネーション機能を標準搭載しています。 Controller でページ番号を受け取り、Model に limit / offset を渡すだけで利用できます。
$page = $c->getInt("page", 1);
$limit = 10;
$offset = ($page - 1) * $limit;
$User = $c->loadModel("User");
$list = $User->query(
"SELECT * FROM users ORDER BY id LIMIT ? OFFSET ?",
[$limit, $offset]
);
$total = $User->query("SELECT COUNT(*) AS cnt FROM users")[0]["cnt"];
$c->set("list", $list);
$c->set("pager", $c->pager($page, $limit, $total));
$c->setTemplateFile("html/user_list.html");
<h1>User List</h1>
<?php foreach ($list as $u): ?>
<div>
<?= $s->html($u["name"]) ?>
</div>
<?php endforeach; ?>
= $pager ?>
« 最初へ ‹ 前へ 1 2 3 4 5 次へ › 最後へ »
Bootstrap 風のシンプルな UI が自動生成されます。 特別な CSS や設定は不要です。
PoiPHP のセッションは
$c->sessionで扱います。 set / get / delete の3つの操作が利用できます。
$c->session->set("name", "bee"); // 保存
$name = $c->session->get("name"); // 取得
$c->session->delete("name"); // 削除
PoiPHP は POST 時に自動で CSRF チェックを行います。 フォームには必ず
_tokenを hidden で入れてください。
テンプレート内で $c->csrf を出力するだけで OK です。
<input type="hidden" name="_token" value="<?= $c->csrf ?>">
POST を受け取る処理では、最初に
$c->csrfErrorを確認します。
if ($c->isPost() && $c->csrfError) {
return $c->error("CSRF token mismatch");
}
ファイルアップロードは $c->upload->save() を呼ぶだけです。
ディレクトリがなければ自動で作成し、ファイル名は衝突しないようリネームして保存されます。
// 第一引数:inputのname属性、第二引数:保存先ディレクトリ
$path = $c->upload->save("photo", "uploads");
if ($path) {
// 成功:保存されたパス(例:uploads/image_1710521234.jpg)が返ります
} else {
// 失敗:エラーまたは未選択の場合は null が返ります
}
JSON を返す場合は
$c->json()を返すだけです。
return $c->json($data);