PoiPHP ドキュメント

概要(PoiPHP とは)

PoiPHP は「余計なものはポイ」という思想で作られた、軽量・明快・必要最小限の PHP フレームワークです。

  • ファイル名 = 画面(シンプルな構造)
  • action() に処理を書く(Controller クラス不要)
  • set() で値を渡し、テンプレートで表示
  • Model は必要な時だけロード
  • 生 SQL をそのまま書ける

インストール

PoiPHP は ZIP を展開するだけで使えます。特別なセットアップは不要です。

/your-app/
 ├ index.php        ← アプリの入口(actionを書く)
 ├ html/            ← テンプレート
 ├ models/          ← モデル
 └ PoiPHP/          ← フレームワーク本体
      ├ core/       ← フレームワーク内部クラス
      ├ poiphp.php  ← メインローダー
      └ config.php  ← フレームワーク設定
                

データベース設定

PoiPHP は PDO を使用しており、 config.phpdatabaseセクションで DSN を指定します。

MySQL / MariaDB

MySQL を使用する場合は、以下のように DSN を記述します。

'database' => [
    'dsn'  => 'mysql:host=localhost;dbname=poiphp;charset=utf8mb4',
    'user' => 'root',
    'pass' => 'password',
],
SQLite(最小構成・設定が最も簡単)

SQLite を使う場合は DSN を sqlite:に変更します。

'database' => [
    'dsn'  => 'sqlite:' . POI_DIR . '/app.sqlite',
    'user' => null,
    'pass' => null,
],
PostgreSQL(生 SQL のみ利用可能)

Model の insert / update / delete は未対応ですが、query() で生 SQL は利用できます。

'database' => [
    'dsn'  => 'pgsql:host=localhost;dbname=poiphp',
    'user' => 'postgres',
    'pass' => 'password',
],
接続タイミング

PoiPHP は「必要な時だけ接続」する設計です。 Model をロードした時点で初めて DB に接続します。

config.php(設定ファイル)

PoiPHP の設定は PoiPHP/config.phpに記述します。 デバッグモード、データベース接続、アプリ固有の設定をまとめた シンプルで明快な構成です。

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(デバッグモード)

'debug' =>trueの場合、エラー画面に詳細情報が表示されます。 本番環境では falseに設定してください。

database(データベース設定)

PoiPHP は PDO を使用しており、DSN を記述するだけで DB を切り替えられます。

MySQL / MariaDB の例
'database' => [
    'dsn'  => 'mysql:host=localhost;dbname=poiphp;charset=utf8mb4',
    'user' => 'root',
    'pass' => 'password',
],
    
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',
],
    

PoiPHP は「必要な時だけ接続」する設計です。 $c->loadModel()を呼んだ時点で初めて DB に接続します。

layout(レイアウト設定)

PoiPHP は layout.html を使った 1 レイアウト方式を採用しています。
全ページ共通のヘッダー・フッター・HTML 構造を layout.html にまとめて記述し、
ページごとの内容は <?= $_poi_content ?>の位置に差し込まれます。

設定例

'layout' => 'html/layout.html',

動作仕様

  • layout.html が 存在する場合→ 自動的にレイアウトとして使用されます
  • layout.html が 存在しない場合→ レイアウトなしでテンプレートのみ表示(エラーなし)
  • レイアウトを使わない場合 → 'layout' =>null

layout.html の最小例

<!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>

app(アプリ固有の設定)

base_url

アプリをサブディレクトリに配置する場合に設定します。 通常は空文字のままで問題ありません。

default_controller

URL に何も指定されなかった場合に呼ばれるコントローラ名です。 デフォルトは indexです。

Hello World(最初の1ページ)

まずは最小の画面を作ってみましょう。

index.php

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

function action(&$c)
{
    $c->set("msg", "Hello PoiPHP!");
    $c->setTemplateFile("html/index.html");
}
                
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()(HTML エスケープ)

テンプレートで値を表示する時は、必ず $s->html()を使って XSS を防ぎます。

<?= $s->html($value) ?>
$s->h()(短縮形)
<?= $s->h($value) ?>
$s のメソッド一覧(Sanitize)

PoiPHP のテンプレートおよびコントローラでは、入力値の取得と出力時のエスケープのために $s が利用できます。

■ 出力(エスケープ)
$s->html($value)
    HTML エスケープ(XSS 対策)。配列・多次元配列にも対応。

$s->h($value)
    $s->html() の短縮形。

$s->url($value)
    URL エンコード。GET パラメータに埋め込む時に使用。

$s->json($value)
    JSON エスケープ。JavaScript に安全に埋め込むための出力。
■ 入力(POST)
$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] に保存して返す。
■ 入力(GET)
$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(layout 専用)

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

レイアウト(layout.html)

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

layout.html(共通レイアウト)
<!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 が自動で用意する変数で、テンプレートの内容がそのまま入ります。 開発者が定義する必要はありません。

テンプレート側(例:html/bbs.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"></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 を搭載していません。 必要な時だけモデルをロードし、必要なクエリだけを実行する シンプルで明快な設計です。

モデル(Model)

PoiPHP のモデルは「1 テーブル = 1 クラス」のシンプルな仕組みです。
必要な時だけ $c->loadModel() でロードし、データベース操作を行います。

モデル定義(models/User.php)
<?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 を渡すだけで利用できます。

Controller(例)
$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");
    
View(テンプレート)
<h1>User List</h1>

<?php foreach ($list as $u): ?>
    <div>
        <?= $s->html($u["name"]) ?>
    </div>
<?php endforeach; ?>


    
出力されるページネーション(例)
« 最初へ   ‹ 前へ   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");       // 削除
    

CSRF トークン

PoiPHP は POST 時に自動で CSRF チェックを行います。 フォームには必ず _tokenを hidden で入れてください。

送信側(フォーム)

テンプレート内で $c->csrf を出力するだけで OK です。

<input type="hidden" name="_token" value="<?= $c->csrf ?>">
    
受け側(POST 時のチェック)

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 が返ります
}
                        

API JSON 出力

JSON を返す場合は $c->json()を返すだけです。

return $c->json($data);