目次

Apricot リクエストとレスポンス

y2sunlight 2020-07-29

Apricot ドキュメント に戻る

目次


リクエスト

Apricotのリクエストクラスは、PHPのスーパーグローバル変数を個別にカプセル化したシングルトンです。リクエスト取得用に以下のシングルトンがあります:

これらはシングルトンなので、アプリケーションのどこからでもリクエストを取得することができます。


Inputクラス

Inputクラスはフォームの送信データを取得するシングルトンで、methodに従って、$_GETまたは$_POSTから生成されます。Inputクラスは後述のQueryStringクラスは同じく Apricot\Foundation\SimpleInput クラスをシングルトンにしたものです。

使用法: Input::{メソッド}

メソッド機能
bool has(string $key)キー指定よる入力データの存在確認
string get(string $key, string $default = null)キー指定よる入力データの取得
array all()全ての入力データの取得
array only(array|mixed $keys)必要入力データのみの取得
array except(array|mixed $keys)不要なものを除く入力データの取得
set(string $key, string $vale)入力データの設定
remove(string $key)入力データの削除

all()は、フォームからの全ての入力値を取得するメソッドです。

$inputs = Input::all();
$account = $inputs['account'];
$password = $inputs['password'];

以下は、上の例と同じ結果になります。get() は第2引数にデフォルト値を指定できます。

$account = Input::get('account',null);
$password = Input::get('password',null);

only() は、指定したキーだけの入力値を取得する場合に使用します。

$inputs = Input::only('account','password');

except() は指定したキー以外の入力値を取得する場合に使用します。

$inputs = Input::except('password_confirmation');

バリデーションなどの後で不要になった入力値は、remove() で削除して次の処理に進みます。

Input::remove('password_confirmation');


QueryStringクラス

QueryStringクラスはクエリ文字列を取得する為のシングルトンです。このクラスはApricot\Foundation\SimpleInput クラスをシングルトンにしたもので、$_GETから生成します。

使用法: QueryString::{メソッド}

メソッド機能
bool has(string $key)キー指定よる入力データの存在確認
string get(string $key, string $default = null)キー指定よる入力データの取得
array all()全ての入力データの取得
array only(array|mixed $keys)必要入力データのみの取得
array except(array|mixed $keys)不要なものを除く入力データの取得
set(string $key, string $vale)入力データの設定
remove(string $key)入力データの削除

使用例は上のInputシングルトンを同じです。


Sessionクラス

Sessionクラスはセッション変数を設定及び取得をするシングルトンです。このクラスは Apricot\Foundation\SimpleSession クラスをシングルトンにしたもので、$_SESSIONから生成します。Sessionシングルトン後述するフラッシュデータを包含しています。

使用法: Session::{メソッド}

メソッド機能
start()セッションの開始
isStarted():boolセッションが開始されているか否かの判定
has(string $key):boolセッション変数の存在確認
get(string $key, $default = null)セッション変数の取得
set(string $key, $value)セッション変数の設定
remove(string $key)セッション変数の削除
clear()セッション変数のクリア
destroy()セッションの破棄
flash():SimpleFlashフラッシュデータの取得

使用例:

// 指定したデータがセッションに存在するかを調べる。
if (Session::has('key')) {
    // 存在する
}
 
// 指定したデータをセッションから取得する。第2引数はデフォルト値です。
$value = Session::get('key', 'default');
 
// セッションへデータを保存する。
Session::set('key', 'value');
 
// 指定したデータをセッションから削除する
Session::remove('key');

start() メソッドはフレームワークによってアプリケーション初期化時に呼び出されます。

clear() メソッドは $_SESSIONだけをクリアします。destroy() メソッドは 内部的にclear() メソッドとPHPのsession_destroy()を呼び出して、現在のセッションに関連づけられたすべてのデータを完全に破棄し、さらに、現在のセッションIDもクッキーから削除します。通常、destroy() メソッドは フレームワークによってログオフ時に呼びされます。

flash() メソッドは後述のFlashシングルトンで使用されます。通常、フラッシュデータの操作にはFlashシングルトンを使用します。


設定ファイル

セッションには以下の設定ファイルが存在します。

/your-project/config/setting

session.setting.php
<?php
/**
 * This file contains session settings.
 */
return
[
    'name' => 'SID'.substr(md5(env('APP_SECRET', env('APP_NAME'))),0,16),
    'ini' =>[
        'gc_maxlifetime' => null,   /* default: 1440[sec] */
        'gc_probability' => null,   /* default: 1         */
        'gc_divisor' => null,       /* default: 100       */
        'cookie_lifetime' => null,  /* default: 0[sec]    */
    ],
];


Flashクラス

フラッシュとは、セッション内で一回限りだけ有効なセッション変数(次の画面の遷移のときまで保存される変数)のことです。Flashクラスはフラッシュ変数の設定及び取得を行うシングルトンで、Apricot\Foundation\SimpleFlash クラスから作ります。

使用法: Flash::{メソッド}

メソッド機能
has(string $key):boolフラッシュ変数の存在確認
get(string $key, $default = null)フラッシュ変数の取得
set(string $key, $value)フラッシュ変数の設定
remove(string $key)フラッシュ変数の削除
clear()フラッシュ変数のクリア

使用例:

// 指定したデータがフラッシュに存在するかを調べる。
if (Flash::has('key')) {
    // 存在する
}
 
// 指定したデータをフラッシュから取得する。第2引数はデフォルト値です。
$value = Flash::get('key', 'default');
 
// フラッシュへデータを保存する。
Flash::set('key', 'value');
 
// 指定したデータをフラッシュから削除する
Flash::remove('key');
 
// フラッシュをクリアする
Flash::clear();

フレームワークが使用するFlashデータ

以下のフラッシュ・キーはフレームワークで使用しています。

キー内容
_old_inputsarray前回の入力データ
_old_pathstring前回のURIパス
errorsErrorBagエラーバッグ


Cookieクラス

Cookieクラスはクッキーの設定及び取得を行うシングルトンで、Apricot\Foundation\SimpleCookie クラスを使って実装します。

使用法: Cookie::{メソッド}

メソッド機能
has(string $key):boolクッキーの存在確認
get(string $key, $default = null)クッキーの取得
set(string $key, string $value, int $expires_sec=0):boolクッキーの設定(有効期間付き)
forever(string $key, string $value):boolクッキーの設定(永続的)
remove(string $key)クッキーの削除

使用例:

// 指定したデータがクッキーに存在するかを調べる。
if (Cookie::has('key')) {
    // 存在する
}
 
// 指定したデータをクッキーから取得する。第2引数はデフォルト値です。
$value = Cookie::get('key', 'default');
 
// クッキーへデータを1日間だけ保存する。第3引数は有効期間[秒]です。
Cookie::set('key', 'value', 24*60*60);
 
// クッキーへデータを永続的に保存する。
Cookie::forever('key', 'value');
 
// 指定したデータをクッキーから削除する。
Cookie::remove('key');

set() メソッドの第3引数を省略した場合は、デフォルト値の0が設定されます。この場合はセッションクッキーとなり、セッションが終了すると保存したデータは消えます。forever() メソッドは永続的にクッキーを保存しますが、その期間は設定ファイル( cookie.setting.php )の forever によって決まります。


設定ファイル

クッキーには以下の設定ファイルが存在します。

/your-project/config/setting

cookie.setting.php
<?php
/**
 * This file contains cookie settings.
 */
return
[
    'path' => '',
    'domain' => '',
    'secure' => FALSE,
    'httponly' => FALSE,
    'forever' => 365*24*60*60,
];
path から httponly までの設定値の詳細は、PHPマニュアルのsetcookieを参照して下さい。


ボイラープレート

リクエスト取得用のボイラープレートには以下の関数があります。input()からcookie()までは、それぞれのリクエスト変数を取得する関数で、HTMLテンプレートでよく使われるます。inputLabels()はInputクラスからバリデーションの項目名を取得するのに便利な関数です。

ヘルパー関数機能
input
(string $key, $default=null):string
フォームデータを取得
queryString
(string $key, $default=null):string
クエリ文字列を取得
session
(string $key, $default=null):mixed
セッション変数を取得
flash
(string $key, $default=null):mixed
フラッシュ変数を取得
cookie
(string $key, $default=null):string
クッキー変数を取得
inputLabels
(string $message_key):array
フォームデータのラベル配列を取得します


レスポンス

Responseクラス

Responseクラスはレスポンスのベースクラスで、その目的はHTMLヘッダーとフラッシュデータの管理です。後述の RenderResponse(レンダリング用) と RedirectResponse(リダイレクト用) はResponseクラスから派生します。Responseクラスは以下のメソッドを持ちます。

メソッド機能
addHeader($headers):ResponseHTMLヘッダーの追加
hasFlash(string $key):boolフラッシュデータの存在確認
addFlash(string $key, $value):Responseフラッシュデータの追加
commit(int $response_code=null)レスポンスの確定


RenderResponseクラス

RenderResponseクラスはResponseクラスから派生します。HTMLレンダリングを行うレスポンス用のクラスで、以下のメソッドを持ちます。addHeader()などのResponseクラスのメソッドも使用できます。

メソッド機能
__construct(string $html=null)RenderResponseの生成
setHtml(string $html=null):RenderResponseHTMLテキストの設定
commit(int $response_code=null)レスポンスの確定

アプリケーションでは、直接RenderResponseクラスを使うのではなく、後述する render() 関数を使用します。


RedirectResponseクラス

RedirectResponseクラスはResponseクラスから派生したリダイレクト用のクラスです。リダイレクトではフラッシュデータを使ってリダイレクト先のページにデータを送ることが多いので、フラッシュ用のメソッドが追加されています。RedirectResponseクラスは以下のメソッドを持ちます。addHeader()などのResponseクラスのメソッドも使用できます。

メソッド機能
__construct(string $url)RedirectResponseの生成
with(string $key, $value):RedirectResponseフラッシュデータの追加
withInputs():RedirectResponse入力データをフラッシュに追加する
withErrors(ErrorBag $errorBag):RedirectResponseエラーバッグをフラッシュに追加する
withOldErrors():RedirectResponse前回のエラーバッグを次のフラッシュに転送する

以下は、RedirectResponseクラスで使用するフラッシュデータです。_old_inputs は withInputs()で、errorsは withErrors() と withOldErrors()で使用されます。

キー内容
_old_inputsarray前回の入力データ
_old_pathstring前回のURIパス
errorsErrorBagエラーバッグ

アプリケーションでは、直接RedirectResponseクラスを使うのではなく、後述する redirect() 関数を使用します。


ボイラープレート

レスポンス処理用のボイラープレートには以下の関数があります。render()とredirect()はコントローラアクションで、その他はHTMLテンプレートでよく使われる関数です。

ヘルパー関数機能
render(string $view=null, array $variables=[])
:RenderResponse
RenderResponseの生成
テンプレート名とテンプレート変数を指定します
redirect(string $url):RedirectResponseRedirectResponseの生成
リダイレクトURLを指定します
old(string $key, $default = null):stringキーを指定して前回の入力値を取得します
back():string前回のURIを取得します
errors():ErrorBag前回のエラーバッグを取得します

render() は、テンプレート名(string)とテンプレート変数(array)を指定してHTMLをレンダリングしてRenderResponseオブジェクトを返す関数です。テンプレートについては、HTMLテンプレートを参照して下さい。以下の例では、ユーザモデルで全件検索した結果をテンプレート変数としてユーザ一覧を表示しています。

/** index action */
public function index()
{
    $users = $this->user->findAll();
    return render("user.index", ["users"=>$users]);
}

以下は redirect()back() の典型的な使用例です。フォーム送信を受け取るアクションでは、通常、バリデーションに失敗した場合は、前回の入力値とエラー内容と共に送信元のページに戻ります。以下の例では、redirect() の引数に back() で取得した前回のURIを指定し、RedirectResponse オブジェクトを得た後に、withInputs() と withErrors() メソッドを使って前回の入力値とエラー内容をフラッシュを使用してリダイレクト先に渡しています。

/** update action */
public function update()
{
    // バリデーション結果に応じてリダイレクトする
    if ($errorBag)
    {
        // 失敗した時
        return redirect(back())->withInputs()->withErrors($errorBag);
    }
 
    // 成功した時
    return redirect(route("user/{$id}/edit"));
}

old()errors() はBladeテンプレートで良く使用される関数です。old() はフラッシュで渡された前回の入力値を取得する関数で、第2引数はデフォルト値です。以下はユーザ名の入力フィールドの例です。このように、データ編集ページの場合、通常は第2引数にはモデルから取得したテンプレート変数を渡します。

<input type="text" name="account" id="account" value="{{old('account',$user->account)}}">

errors() は、前ページからフラッシュで渡されたエラーバッグを取得する関数です。以下の例では、エラーバッグのcount()メソッドでエラーの数を取得し、エラーがあれば、その内容を出力しています。エラーバッグはIteratorAggregateインターフェースを実装してるのでforeach()などのIteratorを使用した構文が使用できます。

@if($errors->count())
    @foreach($errors as $key=>$value)
        <div class="alert">{{$value}}</div>
    @endforeach
@endif