ライブラリを使わずに実装するフラッシュメッセージPHP

フラッシュメッセージ?

フラッシュメッセージというのは、一度だけ警告が出てリロードすると消えてるっていうアレです。ログインミスやエラーメッセージ等によく使われます。 有名所のPHPフレームワークなどでは一機能として実装されていたりしますが、生のPHPでも比較的簡単に実装できます。

PHPセッションを利用

PHPのセッション機能を利用した実装を以下に掲載します。(メッセージタイプを指定してスタイルを分けられる仕様になっています)

<?php

@session_start();
$flash = isset($_SESSION['flash']) ? $_SESSION['flash'] : array();
unset($_SESSION['flash']);

...
<?php

/**
 * flashメッセージセット
 *
 * @param string $type タイプ
 * @param string $message メッセージ
 * @return void
 * @example flash('error', 'エラーです');
 */
function flash($type, $message)
{
    global $flash;
    $_SESSION['flash'][$type] = $message;
    $flash[$type] = $message;
}

...
<?php

foreach(array('default', 'error', 'warning') as $key) {
    if(strlen(@$flash[$key])){
        ?>
            <div class="flash flash-<?php echo $key ?>">
                <?php echo $flash[$key] ?>
            </div>
        <?php
    }
}

...

実際の使い方は、プログラム中で flash() を呼び出し、その後リロードするだけです。

<?php

if(!$login) {
    flash('error', 'ログインエラーですね! もう一度お試しください。');
    header('Locatione: /login/');
    exit;
}

...

また、メッセージタイプはテンプレートいじればいくらでも増やせます。(上記例は default error warning だけです)

仕組みとしては非常に単純で、フラッシュメッセージをセッションに書き込んでGETリロードしたら、保存されているフラッシュメッセージを変数(上記の $flash)に格納して、すぐにセッションからフラッシュデータを消しているだけです。
すると、変数に格納した初回だけ、テンプレートにフラッシュメッセージを表示することができます。そして次回はフラッシュデータは空っぽなので、変数にも取り込まれません。つまり次回からは何も表示されません。

構成はシンプルですが、イチから考え出すとちょっと混乱するので、是非参考にしてみてください。