PHP – 抽象クラス/ポリモーフィズム

抽象クラス

抽象クラスは

  • abstract classキーワードでクラスを定義する
  • abstract定義されたメソッドを含む

たとえば以下のクラスは、RPGのキャラクターをイメージしていて、

  • 固有の名前を持つ
  • 名前を返すpublicメソッドを持つ
  • attack()というabstract宣言されたpublicメソッドを持つ

このクラスからインスタンスを生成しようとすると、Cannot instantiate abstract class CharacterClassとエラーになる。

抽象クラスの継承

先の抽象クラスCharacterClassを継承して、以下の2つのクラスを定義する。

こうすると、Swordfighterクラス、Wizardクラスのインスタンスを生成することができる。

ポリモーフィズム

先の2つのクラス(SwordfighterWizard)のインスタンスを、以下のように配列にしてattack()メソッドを実行してみる。

配列の各要素が具体にどのクラスかを指定しなくても、それぞれのクラスに応じたattack()メソッドが適切に呼ばれている(ポリモーフィズム)。

抽象クラスとポリモーフィズム

  • 抽象クラスはabstractメソッドを含む
  • 抽象クラスを継承したクラスのうち、インスタンスを生成するクラスでは、必ずabstractメソッドを実装しなければならない
  • 実行時にabstractメソッドに対応したメソッドを呼び出すと、インスタンスのクラスを逐一確認しなくても、そのインスタンスのクラスに応じたメソッドが実行される
  • したがって、abstractメソッドの機能の実装は各継承クラスで責任を持ち、それを呼び出す側でケアする必要はない(例外処理などを除けば)

 

PHP – 継承

設定

以下のようなクラス構成を考える。

  • RPGに出てくるようなキャラクターとして、剣士と魔法使いを考える
  • 共通点として、いずれも名前とエネルギーを持つ
  • 剣士特有の能力として、剣で切りかかって戦う動作ができる
  • 魔法使い特有の能力として、攻撃魔法を唱える動作ができる
  • それぞれの動作を行うと、それに応じたエネルギーが消費される

親クラス~汎化

キャラクターの種類によらず共通するものを、親クラスCharacterClassとしてまとめる。

  • privateなプロパティーとして、$name(名前)、$energy(エネルギー)を持つ
  • インスタンス生成時に名前を与えて生成し、エネルギーの初期値は職業によらず100
  • それぞれの値を得るpublicなゲッターを備えている
  • エネルギー値を変更するpublicメソッドを備えている
  • 自身の攻撃の番であることを表示するpublicメソッドを備えている

継承

CharacterClassクラスを継承し、剣士(Swordfighter)と魔法使いのクラスを定義する。

  • 戦士の動作メソッドattack()で剣で切りかかり、エネルギーを15消費する
  • 魔法使いの動作メソッドspell()で攻撃魔法を唱え、エネルギーを10消費する

剣士としてアーサー、魔法使いとしてハリーという名前でインスタンスを生成し、順番に2回ずつ攻撃させる。

メソッドのオーバーライド

CharacterClassクラスにshowTurn()メソッドを定義したが、これと同じ名前のメソッドをSwordfighterクラスとWizardクラスに定義する。

そして同じように実行すると以下のようになり、それぞれの子クラスで定義したshowTurn()が呼ばれて剣士・魔法使いと表示され、その後に親クラスのメソッドの表示がされている。

ここで行ったのがメソッドのオーバーライド。

  • 親クラスのメソッドと同じ名前のメソッドを子クラスで定義した場合、子クラスのメソッドが呼ばれる
  • 子クラスのメソッドの中でparent::メソッド名とすると、親クラスのメソッドが呼ばれる。

実行時のメソッドの探索順は以下の通り。

  1. 現在のクラスで該当するメソッドを探す
  2. 無ければ親クラスのメソッドを順次遡って探す
  3. parent::で呼ばれた場合、親クラスのメソッドを探す

コンストラクター

オーバーライド

上記のコードに更に変更を加えて、初期エネルギー値を戦士が100、魔法使いが80となるようにする。

まずCharacterClassのコンストラクターを変更して、$energyについても引数で値をあてるようにする。

そしてSwordfighterWizardそれぞれのクラスにコンストラクターを追加。インスタンス生成時には名前のみを指定し、それぞれのクラスに応じた初期エネルギー値を親クラスのコンストラクターに渡して、名前とともにセットする。

実行結果は以下の通り。

クラスの継承とコンストラクター/デストラクターについて

  • インスタンス生成時、子クラスのコンストラクターが見つからなければ、親クラスのコンストラクターが使われる
  • 子クラスのコンストラクターを定義した場合、暗黙では親クラスのコンストラクターは呼ばれない
  • から親クラスのコンストラクター/デストラクターを呼び出すときは、parent::_construct/__destructで呼び出す
  • 通常、子クラスのコンストラクターの中で
    • parent::constructor()はコードの最初に書く
    • parent::destructor()はコードの最後に書く

プロパティーのprivate宣言について

  • 親クラスのプロパティー$name$energyprivate宣言にしているので、継承した子クラスから直接はアクセスできない
    • このため、publicなメソッドを準備して、アクセスさせている
  • プロパティーをpublic宣言すると子クラスから$this->nameのようにアクセスできる
    • しかしpublic宣言すると、クラス外部で任意に名前やエネルギーの値を変更できてしまう
  • protected宣言にすれば、継承したクラスから$this->nameのようにアクセスできる
    • ここではプロパティーの変更を厳格にし、アクセスメソッドを準備しているのでprivateにした

 

PHP – クラス

クラスの定義

  • classキーワードでクラスを定義
  • プロパティーはprivate/protected/publicで宣言
  • コンストラクターはpublic function __construct()で定義(アンダースコア2つ)
  • メソッドはpublic/protected/private functionで定義
  • インスタンスの生成はnew クラス名(...);

プロパティー

宣言・定義

プロパティー宣言時に値の初期値を定義可能。

private/protected/public プロパティー = 初期値;

参照・代入

クラス内でのプロパティー参照・代入

$this->プロパティー名($除き)

publicプロパティーのインスタンスからの参照・代入

インスタンス変数->プロパティー名($除き)

メソッド

メソッドはオーバーロードできない

PHPでは、異なるシグネチャーでメソッドをオーバーロードすることはできない。コンストラクターについても同じくオーバーロードできない。

以下のクラスではメソッドをシグネチャーの違いによってオーバーロードしようとしている。

しかし複数宣言はできないというエラーになる。

デフォルト引数は使える

異なるシグネチャーのメソッドは、デフォルト引数を使うことで実現できる。

デフォルト引数が指定されている場合に引数を指定すると、先頭の引数から値が設定されていく。引数名を指定して任意の引数の実を指定することはできない。

コンストラクター/デストラクター

public function __construct(...) { ... }
public function __destruct(... { ... }

  • いずれも動詞形で、先頭にアンダースコアを2つつける

クラスを継承した場合、コンストラクター/デストラクターを定義しなければ、親クラスのそれらが呼ばれるが、定義した場合には明示的に親クラスのコンストラクター/デストラクターを呼び出す必要がある。

parent::__construct(...)
parent::__destruct(...)

staticプロパティー

プロパティーをstatic宣言することで、クラスとして保持されるようになる。

private static宣言

クラス外からアクセス不能なクラスレベル変数。

  • クラス内で(すなわち各インスタンスから)self::プロパティー名($付き)でアクセスできる
  • 全インスタンスで1つの値を共有する

以下の例では全インスタンスに共通のカウンターをクラス変数として持ち、

public static宣言

クラス外からもアクセス可能なクラスレベル変数。

  • クラス内外を問わず、クラス名::プロパティー名($付き)でアクセスできる

以下のコードではクラスレベルのカウンターをpublic宣言し、クラス外からもアクセス可能としている。

8行目はself::$countでもよいが、クラス外からもアクセス可能なことを強調してMyClass::$countとしている。

staticメソッド

public static宣言

クラス外からもアクセス可能なクラスレベルメソッド。

以下のコードでは、private static宣言されたカウンターを、public static宣言されたメソッドで参照している。このようにすると、private宣言されたカウンターが外部で変更される恐れがなくなる。

private static宣言

private宣言したメソッドはstatic宣言されたクラスメソッドでもインスタンスメソッドでもあまり変わりはないように思える。

こちらの記事で、staticメソッドからインスタンスのプロパティーにアクセスできないことを利用して、メソッドが余計な副作用を持たないことを明示できるとあって、なるほどと思った。

 

Laravel – バリデーションメッセージの日本語化

概要

バリデーションエラーはデフォルトで英語だが、これを日本語にしてみる。

方法の1つとして、ロケールjaに対するメッセージファイルを編集する方法を整理する。

ロケールファイルを一括して日本語化する方法はこちら

元になるアプリケーション

ルーティング

GETリクエストに対してフォームを含むビューを表示し、POSTリクエストに対してバリデーション処理を実行する。

ビュー

フォームでユーザー名とメールアドレスを入力し、POST処理の結果バリデーションエラーがあれば表示する。

コントローラー

フォーム表示

GETリクエストに対してフォーム画面を表示する。

POST処理

POSTリクエストに対して、ユーザー名とメールアドレスのバリデーションを実行。

この場合のバリデーションエラーは以下の様に表示される。

あるいは

ロケール設定による日本語化

ReaDouble.comのバリデーションのドキュメントでエラーメッセージのカスタマイズについて説明されていて、ローカライゼーションについては多言語化ドキュメントを参照するよう示唆されている。

これに基づいて、バリデーションエラーメッセージの日本語化をローカライゼーション周りで実装する方法を整理する。

言語の選択

config/app.phpでロケール設定を変更する。

  • localeをデフォルトのenからjaに変更
  • localejaで見つからないときのfallback_localeがデフォルトでenになっていることを確認
  • これにより、日本語ロケールの設定がある場合は日本語が適用され、見つからない場合は英語の設定が適用される

バリデーションエラーメッセージのコピー・編集

resources/en/validation.phpで英語のバリデーションメッセージが定義されている。

日本語ロケール設定のため、jaディレクトリーを作成し、そこにコピーしたvalidation.phpを編集する。

  • resources/jaディレクトリーを作成
  • jaディレクトリー下にvalidation.phpをコピー
  • 必要なバリデーションメッセージを日本語化

:attributeはエラーが発生したフィールドのname属性の値で置き換えられる。また:maxはバリデーションで設定した値に置き換えられる。

これにより、バリデーションエラーが生じたときの表示は以下の様に日本語化される。

あるいは

属性の日本語化

上記のメッセージでは、:attributeが置き換えられるname属性のnameemailがそのまま現れている。

これらは、validation.phpの最後にある'attributes'に連想配列を記述することで、日本語表現に置き換えることができる。

今回の例の場合、name属性はname(ユーザー名)とemail(メールアドレス)なので、これらを日本語に置き換えるよう定義する。

この結果、バリデーションエラーメッセージは以下の様になる。

あるいは

エラーメッセージを日本語化したもの以外のバリデーションに対しては、元のまま残っている英語の内容が使われる。

たとえばバリデーションを追加する。

そうするとバリデーションエラーは以下のようになる。

全体のセンテンスは英語だが、name属性emailattributesで変更した内容に置き換えられている。

 

 

Laravel – 動的メッセージ表示

概要

バリデーションエラーや登録成功などのメッセージを一時的に表示する方法を整理する。

ダイアログによりブラウザー表示領域とは別に表示する方法と、表示領域にメッセージを出して動的に消去する方法の2つ。

エラー・成功メッセージの登録

以下のような例で考えていく。

  • GETリクエストから表示用コントローラー・アクションにルーティング
  • アクションからフォームを含むページを呼び出す
  • フォームにユーザー名とメールアドレスの入力テキストボックスを配置

  • 送信ボタンが押された場合のPOSTに対して、バリデーション用コントローラー・アクションにルーティング
  • バリデーション用アクションでは、ユーザー名とメールアドレスのバリデーションを記述
    • バリデーション結果が妥当な場合はflash()で成功メッセージを登録
    • バリデーション結果が妥当でない場合は、それ以降は実行されず$errorsに結果が保存される
  • いずれの場合も元のGETルートにリダイレクトされる

状況に応じて登録された/空のままの$errorsflashに対して、ビュー側で表示する。

ダイアログ表示

$errorsflashをダイアログで表示する方法。

ビューのhead要素内で、これらの状態に応じたメッセージを生成し、Javascriptのalertの引数に渡している。

複数のエラーメッセージを改行文字を挟んでつなげるのに、PHPのinplode()関数を使っている。

スライドアップによる一時表示

エラーや成功メッセージをブラウザーの上部などに表示し、一定時間後にそれをスライドアップなどで消去する。

メッセージ表示領域の設定と、Javascriptによる動的な消去の2段階で整理する。

メッセージ表示エリアの設定

ビューのbody要素最上部で、ディレクティブによってメッセージ表示領域を動的に生成している。その際に、エラー/成功に応じたクラスを要素に設定している。

  • $errors->any()でエラーが登録されていれば、エラー表示領域を生成
  • session()->has()で成功メッセージが登録されていれば成功メッセージ表示領域を生成

ビューのhead要素内で、エラーメッセージ領域/成功メッセージ領域それぞれのクラスに応じたスタイルを設定している。

なお、エラーメッセージは複数のメッセージを改行で表示させたいので、PHPのImplode()関数で区切りを<br>としたうえで{!! ... !!}で囲んでエスケープを抑制している。

メッセージ表示エリアの消去

エラー/成功のクラスに対して、JQueryでこれらをスライドアップして消去するスクリプトを追加する。

  • 5行目でJQueryをCDNで読み込み
  • script要素内でスライドアップの動作を定義

 

Laravel – flash

概要

  • セッションのflash()メソッドは、put()メソッドと同じくセッションにキーと値のデータを登録できる
  • ただしそのデータは、次のリクエストの間だけ保存され、その後は削除される
  • このためflashはコントローラー処理結果の通知などに使われる
  • flashの操作はsession()グローバルヘルパーを使うが、Requestインスタンス経由でもよい

基本形

flashへの登録

session()->flash('キー', 値);
$request->session()->flash('キー', 値);

flashのデータ存在確認

session()->has('キー')

flashのデータ参照

session()->get('キー')

実装例

ビュー

ビューから見た動作は以下の通り

  • GETリクエストでルーティングされ、フォームを表示する
  • ユーザー名を入力後に送信ボタンを押すと、ユーザー名のバリデーション用コントローラーに制御を移す
  • バリデーションの結果、このページにリダイレクトされ、結果に応じて$errorsflashの内容が表示される
  • $errorsはバリデーション結果が妥当でない時に自動でメッセージが登録される
  • flashはバリデーション結果が妥当な時にコントローラーでメッセージを登録する

表示アクション

最初のルーティングで呼ばれ、ビューを初期状態で表示する。

バリデーションアクション

フォームから呼び出され、バリデーションのみを行い、元のページへリダイレクトする。

  • バリデーション結果が妥当でなければ、$errorsにメッセージが登録され、初期ページにリダイレクト
  • バリデーション結果が妥当な時はflashにメッセージを登録して初期ページにリダイレクト

 

Laravel – 各ヘルパーのパス指定

概要

引数にパス文字列を与えて、サーバー上のパスやURLを返すヘルパー。

パス系はpublic_pathのみ挙動が異なるが、全般に以下のように決めておくと紛れがない。

  • 引数を省略、もしくは引数に''を与えると、それぞれのターゲットパスが得られる
  • 引数に'/'を指定してはいけない
  • 引数のパス指定の頭に'/'を付けない
  • 戻り値のパスの後に動的にパスを付加したいといった場合は、以下のいずれか
    • 引数のパス指定の最後に'/'を付ける
    • 引数のパス指定の最後に'/'を付けず、戻り値に明示的に'/'を連結する

URL系はパス系と挙動が異なる。

  • 引数は省略できない
  • 引数に''を与えると、ドメイン名のみのURLが得られる
  • 引数に'/'を与えると、ドメイン名の後ろに’/’が付いたURLが得られる
  • 引数のパスの最後に'/'を付けても付けなくても、結果のURLの最後には'/'は付かない
  • 戻り値のパスの後に動的にパスを付加したいといった場合は、以下の一択
    • 引数のパス指定の最後に'/'を付けても付けなくても、戻り値に明示的に'/'を連結する

サーバーパス系

app_path()~appディレクトリー

Laravelアプリケーションのappディレクトリー下の相対パスを与えて、サーバー上のフルパスを返す。

末尾の'/'の有無で結果が変わる。

絶対パスの形式にすると戻り値のパスがおかしくなる。

  • app_path()app_path('')
    /.../アプリケーションディレクトリー/app
  • app_path('abc/def')
    /.../アプリケーションディレクトリー/app/abc/def
  • app_path('abc/def/')
    /.../アプリケーションディレクトリー/app/abc/def/
  • app_path('/')
    /.../アプリケーションディレクトリー/app//
  • app_path('/abc/def')
    /.../アプリケーションディレクトリー/app//abc/def
  • app_path('/abc/def/')
    /.../アプリケーションディレクトリー/app//abc/def/

base_path()~アプリケーションのベースディレクトリー

Laravelアプリケーションディレクトリー下の相対パスを与えて、サーバー上のフルパスを返す。

末尾の'/'の有無で結果が変わる。

絶対パスの形式にすると戻り値のパスがおかしくなる。

  • base_path()base_path('')
    /.../アプリケーションディレクトリー
  • base_path('abc/def')
    /.../アプリケーションディレクトリー/abc/def
  • base_path('abc/def/')
    /.../アプリケーションディレクトリー/abc/def/
  • base_path('/')
    /.../アプリケーションディレクトリー//
  • base_path('/abc/def')
    /.../アプリケーションディレクトリー//abc/def
  • base_path('/abc/def/')
    /.../アプリケーションディレクトリー//abc/def/

config_path~configディレクトリー

Laravelアプリケーションのcopnfigディレクトリー下の相対パスを与えて、サーバー上のフルパスを返す。

末尾の'/'の有無で結果が変わる。

絶対パスの形式にすると戻り値のパスがおかしくなる。

  • config_path()config_path('')
    /.../アプリケーションディレクトリー/config
  • config_path('abc/def')
    /.../アプリケーションディレクトリー/copnfig/abc/def
  • config_path('abc/def/')
    /.../アプリケーションディレクトリー/copnfig/abc/def/
  • config_path('/abc/def')
    /.../アプリケーションディレクトリー/copnfig//abc/def
  • config_path('/abc/def/')
    /.../アプリケーションディレクトリー/copnfig//abc/def/

public_path~publicディレクトリー

Laravelアプリケーションのpublicディレクトリー下の相対パスまたは絶対パスを与えて、サーバー上のフルパスを返す。

末尾の'/'の有無で結果が変わる。

相対パス・絶対パスいずれの形式も指定可能だが、結果は同じ。

  • public_path()public_path('')
    /.../アプリケーションディレクトリー/public
  • public_path('abc/def')
    /.../アプリケーションディレクトリー/public/abc/def
  • public_path('abc/def/')
    /.../アプリケーションディレクトリー/public/abc/def/
  • public_path('/')
    /.../アプリケーションディレクトリー/
  • public_path('/abc/def')
    /.../アプリケーションディレクトリー/public/abc/def
  • public_path('/abc/def/')
    /.../アプリケーションディレクトリー/public/abc/def/

resource_path~resourcesディレクトリー

Laravelアプリケーションのresourcesディレクトリー下の相対パスを与えて、サーバー上のフルパスを返す。ディレクトリー名は複数のresourcesだがヘルパー名は単数形のresource

末尾の'/'の有無で結果が変わる。

絶対パスの形式にすると戻り値のパスがおかしくなる。

  • resource_path()resource_path('')
    /.../アプリケーションディレクトリー/resources
  • resource_path('abc/def')
    /.../アプリケーションディレクトリー/resources/abc/def
  • resource_path('abc/def/')
    /.../アプリケーションディレクトリー/resources/abc/def/
  • resource_path('/')
    /.../アプリケーションディレクトリー/resources//
  • resource_path('/abc/def')
    /.../アプリケーションディレクトリー/resources//abc/def
  • resource_path('/abc/def/')
    /.../アプリケーションディレクトリー/resources//abc/def/

storage_path~storageディレクトリー

Laravelアプリケーションのstorageディレクトリー下の相対パスを与えて、サーバー上のフルパスを返す。

末尾の'/'の有無で結果が変わる。

絶対パスの形式にすると戻り値のパスがおかしくなる。

  • storage_path()storage_path('')
    /.../アプリケーションディレクトリー/storage
  • storage_path('abc/def')
    /.../アプリケーションディレクトリー/storage/abc/def
  • storage_path('abc/def/')
    /.../アプリケーションディレクトリー/storage/abc/def/
  • storage_path('/')
    /.../アプリケーションディレクトリー/storage//
  • storage_path('/abc/def')
    /.../アプリケーションディレクトリー/storage//abc/def
  • storage_path('/abc/def/')
    /.../アプリケーションディレクトリー/storage//abc/def/

URL系

asset()~publicディレクトリー下のアセット

Laravelアプリケーションのpublicディレクトリー下の相対パスまたは絶対パスを与えて、アセットへのURLを返す。

末尾の'/'の有無は結果に影響しないが、'/'を単独で指定するとドメイン名の後に'/'が付加されたURLになる。

以下の例では、public/abcディレクトリー下のdefファイルを指定していて、ブラウザーに戻り値のURLを指定するとdefファイルの内容が表示される。

  • asset('abc/def')
  • asset('abc/def/')
  • asset('/abc/def')
  • asset('/abc/def/')
    http://ドメイン/abc/def
  • asset('/')
    http://ドメイン/
  • asset()
    →エラー

セキュア―な通信環境下の場合はsecure_asset()を使う。戻り値はhttp→httpsとなったURL。

url()~アプリケーションのURL

Laravelアプリケーションのドメインより後のディレクトリーを与えて、URLを返す。ルーティングで定義したパスを指定するとドメイン名を含んだURLが得られる。パスの指定は相対/絶対のどちらでもよい。

末尾の'/'の有無は結果に影響せず、戻り値の末尾には常に'/'が付かない。

'/'を単独で指定するとドメイン名の後に'/'が付加されたURLになる。

  • url('abc/def')
  • url('abc/def/')
  • url('/abc/def')
  • url('/abc/def/')
    http://ドメイン/abc/def
  • url('/')
    http://ドメイン/
  • asset()
    →エラー

url()ヘルパーを使ってURLに関する様々な情報を得ることができる。

 

Laravel – セッション

セッションの操作

セッションの操作には、session()グローバルヘルパーを利用する方法と、、アクション引数のRequestインスタンスを経由する方法がある。

session()グローバルヘルパーを利用する方法:

session()->各メソッド;

Requestインスタンスを経由する方法:

$request->session()->各メソッド;

セッションデータの取得・初期化

変数 = session()->get('キー', 初期値);
変数 = $request->session()->('キー', 初期値);
変数 = $request->session()->('キー', function() { return 初期値 });

  • キーに対応するセッションデータの値を変数に代入する
  • キーが存在しない時は、キー初期値をセットしてセッションデータを追加し、その値を変数に代入する

セッションデータの保存

session()->put('キー', 値);
session(['キー' => 値]);
$request->session()->put('キー', 値);

  • キーをセッションデータとして保存する

セッションデータの削除

session()->forget('キー');
$request->session()->forget('キー');

  • キーに対応するセッションデータを削除する

session()->flush();
$request->session()->flush();

  • セッションのすべてのデータを削除する

実装例

ビュー

以下の内容を含むビューを所定の位置に準備。

  • $countが1なら初訪問の旨を、そうでなければ訪問回数を表示
  • カウンターをクリアするためのボタンを表示

設定・変更アクション

コントローラーに以下のアクションを準備し、ルーティング設定する。

  • 'count'キーのセッションデータの値を取得して$countに代入
    • countというキーのセッションデータがなければ値0で作成して、その値を$countに代入
  • $countの値をインクリメント
  • $countの値を渡してビューをレンダリング

削除アクション

forget('キー')
キーに対応するセッションデータを削除する。
flush()
全てのセッションデータを削除する。

フォームのカウンタークリアボタンが押されたときのアクションを準備し、ルーティングを設定する。

  • 'count'キーのセッションデータを削除する
  • 削除した旨を画面に直接表示する

実行結果

  • 最初にアクセスすると、「初めまして」と表示
  • リロードすると「2回目のアクセスです」と表示
  • その後リロードするたびに回数が1つずつ増加
  • カウンタークリアボタンを押すと、「セッションデータを削除しました」と表示
  • ブラウザーの戻るボタンを押すと元の画面に戻り、「初めまして」と表示

 

Laravel – Cookie

Cookieの操作

Cookieの取得・初期化

変数 = \Cookie::get('Cookie名', 初期値);

  • Cookie名のCookieの値を変数に代入する
  • Cookie名のCookieが存在しない時は、初期値をセットしてその値を変数に代入する

Cookieの保存

\Cookie::queue('Cookie名', 変数, 保存期限);

  • Cookie名のCookieに変数の値を保存する
  • 保存期限は分単位で設定する

Cookieの削除

\Cookie::queue(\Cookie::forget('Cookie名'));

  • Cookie名のCookieを削除する

実装例

ビュー

以下の内容を含むビューを所定の位置に準備。

  • $countが1なら初訪問の旨を、そうでなければ訪問回数を表示
  • カウンターをクリアするためのボタンを表示

設定・変更アクション

コントローラーに以下のアクションを準備し、ルーティング設定する。

  • countという名前のCookieの値を取得して$countに代入
    • countという名前のCookieがなければ値0で作成して、その値を$countに代入
  • $countの値をインクリメント
  • $countの値を90日期限でCookieに保存
  • $countの値を渡してビューをレンダリング

削除アクション

フォームのカウンタークリアボタンが押されたときのアクションを準備し、ルーティングを設定する。

  • Cookieを削除する
  • 削除した旨を画面に直接表示する

実行結果

  • 最初にアクセスすると、「初めまして」と表示
  • リロードすると「2回目のアクセスです」と表示
  • その後リロードするたびに回数が1つずつ増加
  • カウンタークリアボタンを押すと、「cookieを削除しました」と表示
  • ブラウザーの戻るボタンを押すと元の画面に戻り、「初めまして」と表示

 

Laravel – 複数のsubmitボタン

概要

Laravelで1つのフォームに複数のsubmitボタンを配置して、押されたボタンによって処理を分ける方法。

  • ボタンにname属性を加える
  • アクションのRequest引数のhasメソッドで、引数にname属性の値を指定して、それらに応じた処理を記述する

以下のフォームを含むビューを準備する。

コントローラーに以下のアクションを準備し、フォームからのPOSTに対してルーティング設定する。

ボタン1/ボタン2を押すと、それぞれのname属性の値に応じたメッセージが表示される。