2019/08/06
素のPHPでセッション操作をするときは、グローバル変数 $_SESSION を使います。
それでは、Laravel ではどう書くのでしょうか?
Laravel ではすでにセッションの機能がいくつか用意されています。
方法は主に3つあります。
Request
クラスをインポート2.ファサード ※
Session
クラスをインポート3.ヘルパ
また、メソッドチェーンで flash メソッドを使うと、フラッシュメッセージ(データをセッションに一時保存)をすることもできます。
今回は Laravel におけるセッション操作についてまとめます。
1.Requestクラスのメソッドを使う
最もよく使われる方法です。
以前、リクエスト処理についてまとめましたが、HTTPリクエストインスタンスを経由して Session を使う方法です。
具体的には以下のように使います。
Controller
:
// Requestクラスをインポート
use Illuminate\Http\Request;
:
class TopController extends Controller
{
public function index(Request $req)
{
// 存在チェック
if ($req->session()->has('name')) {
//
}
// 値を保存
$req->session()->put('key', 'value');
// 'name' というセッションキーに 'TEST' をセット
$req->session()->put('name', 'TEST');
// フォームからの name 属性をセッションに保存する場合
$req->session()->put('name', $req->input('name');
// セッション「name」の値を取得
$name = $req->session()->get('name');
// セッションの値を全て取得
$data = $req->session()->all();
// 指定アイテムを削除
$req->session()->forget('key');
// 全て削除
$request->session()->flush();
}
}
View(Blade)
<span class="navbar-text">ようこそ! {{ Session::get('name') }} 様</span>
フラッシュメッセージ
データをセッションに一時保存しメッセージとして表示するやり方をフラッシュメッセージといいます。
1回限りのメッセージを表示したい場合に使います。
例えば「登録完了!」といったメッセージを一時的に表示したい場合に使います。
フラッシュデータの設定は以下
$req->session()->flash('message', '本登録が完了しました');
Bladeテンプレート上では以下のようにファサードでフラッシュデータを扱います。
@if (Session::has('message'))
{{ Session::get('message') }}
@endif
2.ファサード
次にファサードを使ってSessionを利用するやり方です。
冒頭でセッションクラスをインポートします。
:
// セッションをインポート(必須)
use Session;
:
class TopController extends Controller
{
public function getIndex()
{
// userid が存在しない場合 xxxxx が返る
$userid = Session::get('userid', 'xxxxx');
if (Session::has('username')) {
// セッションからkey(username)を取得
$username = Session::get('username');
} else {
$username = '名無し';
}
return view('session.index', compact('userid', 'username'));
}
public function postIndex()
{
// useridの値があるときだけセッションを保存
if (Request::has('userid')) {
$userid = Request::input('userid');
// セッションにkey(userid):value($userid)を保存
Session::put('userid', $userid);
}
return Redirect::to('/session/page/');
}
public function getPage2()
{
// セッションから全データを取得
$all = Session::all();
return view('session.page2', compact('all'));
}
public function getLogout()
{
// セッションから username(key) を削除
Session::forget('username');
return view('session.logout');
}
public function getLogout2()
{
// セッションから全データを削除
Session::flush();
return view('session.logout2');
}
}
まとめると以下のような感じになります。
Session::get(key[, default]) | セッションからkeyを取得。 第2引数でkeyがセッションに存在しない場合の初期値を設定。 |
---|---|
Session::has(key) | セッションにkeyが存在するかを調べる。 |
Session::put(key, value) | セッションにkey: valueを保存。 |
Session::all() | セッションから全データを取得。 |
Session::forget(key) | セッションからkeyのデータを削除。 |
Session::flush() | セッションから全データを削除。 |
3.ヘルパ
グローバルSessionヘルパ関数でSessionを利用します。
class TopController extends Controller
{
public function index()
{
// セッションから一つのデータを取得する
$id = session('id');
// セッションの値を全て取得
$data = session()->all();
// デフォルト値を指定する場合
$name = session('username', '名無し');
// セッションへ一つのデータを保存する
session(['users' => null]);
// キー/値ペアの配列を渡し、値を設定することができます。
session(['chairs' => 7, 'instruments' => 3]);
// ユーザー情報の情報が存在する(!= null)かチェック
$is_users = session()->has('users');
// ユーザー情報がセット(nullでもOK)されているかチェック
$exists = session()->exists('users');
// 削除 (指定の値を個別に)
session()->forget('key');
// 削除 (全データ)
session()->flush();
}
}
Laravelにおけるセッションの使い方は以上です。
Laravel のセッションについてもっと理解を深めたい方は PHPフレームワーク Laravel入門 をお勧めします。
セッション関連の掲載ページ
Chapter 7 RESTfulサービス/セッション/ぺジネーション/認証/テスト
7.1 リソースコントローラとRESTful
7.2 セッション
7.3 ぺジネーション
7.4 ユーザー認証
7.5 ユニットテスト
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。