====== Apricot リクエストとレスポンス ======
--- //[[http://www.y2sunlight.com|y2sunlight]] 2020-07-29//
[[apricot:usage:ja|Apricot ドキュメント に戻る]]
目次
* [[apricot:usage:ja:features|Apricot 特徴と概要]]
* [[apricot:usage:ja:config|Apricot 配置と構成]]
* [[apricot:usage:ja:errors-logging|Apricot ログとエラー処理]]
* Apricot リクエストとレスポンス
* [[apricot:usage:ja:frontend|Apricot フロントエンド]]
* [[apricot:usage:ja:database|Apricot データベース]]
* [[apricot:usage:ja:model|Apricot モデルとサービス]]
* [[apricot:usage:ja:middleware|Apricot ミドルウェア]]
* [[apricot:usage:ja:controller|Apricot コントローラ]]
* [[apricot:usage:ja:validation|Apricot バリデーション]]
* [[apricot:usage:ja:provider|Apricot サービスプロバイダー]]
* [[apricot:usage:ja:authentication|Apricot ユーザ認証]]
* [[apricot:usage:ja:utility|Apricot ユーティリティ]]
----
===== リクエスト =====
Apricotのリクエストクラスは、PHPのスーパーグローバル変数を個別にカプセル化したシングルトンです。リクエスト取得用に以下のシングルトンがあります:
* Input --- フォーム送信データ(GET変数またはPOST変数:methodに依存)
* QueryString --- クエリ文字列(GET変数)
* Session --- SESSION変数
* Flash --- 1回限り有効なSESSION変数
* Cookie --- COOKIE変数
これらはシングルトンなので、アプリケーションのどこからでもリクエストを取得することができます。
\\
==== 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シングルトンを使用します。
\\
=== 設定ファイル ===
セッションには以下の設定ファイルが存在します。
{{fa>folder-open-o}} ** /your-project/config/setting **
'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] */
],
];
* name --- セッション名(初期設定値は環境変数APP_SECRETを使って設定します)
* ini.gc_maxlifetime --- サーバに保存されるセッション変数の有効期間(デフォルト値は1440[秒])
* ini.gc_probability --- [[https://www.php.net/manual/ja/session.configuration.php#ini.session.gc-probability|PHPのマニュアル]]を参照して下さい(既定値は1)
* ini.gc_divisor --- [[https://www.php.net/manual/ja/session.configuration.php#ini.session.gc-divisor|PHPのマニュアル]]を参照して下さい(デフォルト値は100)
* ini.cookie_lifetime --- セッションクッキーの有効期間(デフォルト0ではブラウザを閉じたらセッションは破棄されます)
\\
==== Flashクラス ====
フラッシュとは、セッション内で一回限りだけ有効な[[#Session|セッション]]変数(次の画面の遷移のときまで保存される変数)のことです。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_inputs|array|前回の入力データ|
|_old_path|string|前回のURIパス|
|errors|ErrorBag|エラーバッグ|
\\
==== 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'' によって決まります。
\\
=== 設定ファイル ===
クッキーには以下の設定ファイルが存在します。
{{fa>folder-open-o}} ** /your-project/config/setting **
'',
'domain' => '',
'secure' => FALSE,
'httponly' => FALSE,
'forever' => 365*24*60*60,
];
* path --- ドメイン上のクッキーが有効なパス(デフォルト値はカレントパス:即ち公開パスpublic)
* domain --- クッキーが有効なドメイン(デフォルト値はカレントURLのドメイン)
* secure --- TRUEを設定すると、セキュアな接続が存在する場合にのみクッキーを設定します
* httponly --- TRUEを設定すると、HTTPを通してのみクッキーを設定します
* forever --- 永続的クッキーの実際の保存期間を設定します(デフォルト値は365日)
> path から httponly までの設定値の詳細は、PHPマニュアルの[[https://www.php.net/manual/ja/function.setcookie.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):Response|HTMLヘッダーの追加|
|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):RenderResponse|HTMLテキストの設定|
|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_inputs|array|前回の入力データ|
|_old_path|string|前回のURIパス|
|errors|ErrorBag|エラーバッグ|
アプリケーションでは、直接RedirectResponseクラスを使うのではなく、後述する redirect() 関数を使用します。
\\
==== ボイラープレート ====
レスポンス処理用のボイラープレートには以下の関数があります。render()とredirect()はコントローラアクションで、その他はHTMLテンプレートでよく使われる関数です。
{{tablelayout?colwidth="350px"}}
^ヘルパー関数^機能^
|render(string $view=null, array $variables=[])\\ :RenderResponse|RenderResponseの生成 \\ テンプレート名とテンプレート変数を指定します|
|redirect(string $url):RedirectResponse|RedirectResponseの生成\\ リダイレクトURLを指定します|
|old(string $key, $default = null):string|キーを指定して前回の入力値を取得します|
|back():string|前回のURIを取得します|
|errors():ErrorBag|前回のエラーバッグを取得します|
''render()'' は、テンプレート名(string)とテンプレート変数(array)を指定してHTMLをレンダリングしてRenderResponseオブジェクトを返す関数です。テンプレートについては、[[apricot:usage:ja:frontend#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引数にはモデルから取得したテンプレート変数を渡します。
''errors()'' は、前ページからフラッシュで渡された[[apricot:usage:ja:errors-logging#エラーバッグ]]を取得する関数です。以下の例では、エラーバッグのcount()メソッドでエラーの数を取得し、エラーがあれば、その内容を出力しています。エラーバッグは[[https://www.php.net/manual/ja/class.iteratoraggregate.php|IteratorAggregateインターフェース]]を実装してるのでforeach()などのIteratorを使用した構文が使用できます。
@if($errors->count())
@foreach($errors as $key=>$value)
{{$value}}
@endforeach
@endif
\\