Laravelでメソッドインジェクション(Request $request)を使うとURLに添えて送られてきたデータを簡単に取得できる。
ある特定のビューで渡されたデータの一部を編集して表示することも簡単にできる。データの取得は、全てのデータを取得したり、欲しいデータを指定して取得することができる。
用途に合わせてメソッドを使うと余計な処理やデータが減り効率を上げることができる。メソッドインジェクションと各メソッドでどういったデータが取得できるかを実例を合わせて解説。
▼解説対象のメソッド
get, input, only, except, has, path, is, url, fullurl, method, isMethod
メソッドインジェクションとは?(Request $request)
本題からは逸れるが重要な概念なので、冒頭で出てきたメソッドインジェクションとは何かについて。
メソッドインジェクションはLaravelの便利機能の一つで、functionで作成するメソッドの引数にクラスのインスタンスを変数として渡すこと。
正確にはDI(Dependency injection)、日本語では依存注入という機能で、メソッドに対して使うため、メソッドインジェクションと呼ばれている。
利点は、クラスの中でインスタンスを生成せずとも、引数に指定の記述すれば、メソッドの中で変数としてすぐに使えるようになること。
ややこしいので、具体例で見た方ると、例えば以下のようにTestControllerの中に、関数indexを作成したとき、引数で渡している Request $request がメソッドインジェクションになる。
use Illuminate\Http\Request;
class TextController extends Controller
{
public function index(Request $request)
{処理}
}
これは、上部でIlluminate\Http\Requestのクラスをuse宣言したことで、そのクラスをRequestの記述のみで使えるようにしている。
引数で、このRequestクラスから生成したインスタンスを格納する変数を $request として指定している。
あとは、メソッドの中で $request->プロパティ名 や $request->メソッド名 とすれば、Requestクラスの中のプロパティやメソッドを呼び出すことができる。
今回解説するのは、この$request->メソッド に該当する便利メソッドについて。
$requestの中身
$requestには様々な情報が含まれており、メソッドインジェクションした処理の中で dump($request) としてデバッグすれば中身を見ることができる。
例えば、以下が$requestの中身になる。
$request->メソッドの概要
$requestに対して使えるメソッドは複数あり、大きく次の2つに分けられる。
- データの取得
- 通信情報の取得(URLやHTTP動詞など)
データの取得については、GETやPOSTメソッドでURLと合わせて送られてきたデータを取得する方法になる。
通信情報は現在開いているページのURLやパスの取得や、指定したパスかどうかを調べてtrueやfalseを返すといった処理ができる。
データの取得
渡されるデータとは例えばGETメソッドの場合、URLの末尾についている?以降の文字列、いわゆるパラメータの事になる。
例えば、https://example.com/text/1?name=Ken&gender=man&age=24 の name=Ken&gender=man&age=24 が該当する。
ここでは、GETで送信されたデータを例として、各メソッドの使い方を実例で紹介する。
データ取得のメソッド一覧
メソッド | 内容 | 実例 |
all() | すべてのデータを取得 | $request->all() |
get(‘キー名’) | 指定したキーの値を取得 | $request->get(‘name’) |
input(‘キー名’, ‘デフォルト値’) | 指定したキーの値を取得。デフォルト値を指定できる | $request->input(‘name’, ‘Jon’) |
only([ ‘キー名1’, ‘キー名2’,,, ]) | 指定したキー名のキーと値を取得。配列形式でも指定可能。 | $request->only(‘name’) |
only([ ‘キー名1’, ‘キー名2’,,, ]) | 指定したキー名以外のキーと値を取得。配列形式でも指定可能。 | $request->except(‘name’) |
has(‘キー 名’) | 指定したキー名が存在すればtrue、なければfalseを返す。 | $request->has(‘name’) |
$request->all()
all()はGETやPOSTで渡されたすべてのデータを取得する。
例えば、http://localhost:13001/topics?category=info&x=abc&y=1 というページで以下メソッドを実行した時に取得できるデータは以下のようになる。
$request->all()
$request->get(‘キー名’)
getは指定したキー名の値を取得する。注意点は引数に空白や配列を渡すとエラーになること。
例えば、http://localhost:13001/topics?category=info&x=abc&y=1 というページで以下メソッドを実行した時に取得できるデータは以下のようになる。
$request->get('category')
$request->get('name')
categoryというキーは存在するので、その値 info が取得できるが、nameというキーはないので null が返る。
$request->input(‘キー名’, ‘デフォルト値’)
inputは指定したキー名の値を取得する。デフォルト値がある場合は、指定したキーにデータがなかったときにその値をセットしてくれる。
getの進化版のような感じで、デフォルト値を設定しない時はgetとほぼ同じ機能となる。getと違い引数が空や配列を渡してもエラーにならない。
inputの引数が空の時は、allと同じくすべてのデータを取得してくる。
例えば、http://localhost:13001/topics?category=info&x=abc&y=1 というページで以下メソッドを実行した時に取得できるデータは以下のようになる。
$request->input()
$request->input('category', 'TEST1')
$request->input('name')
$request->input('name', 'TEST2')
引数が空の時はallと同じくすべてのデータを取得。指定したキーが存在する時はそのデータを取得。指定したキーが存在しない時はnullを返す、ただしデフォルト値がある場合はその値を入れる。
$request->only([ ‘キー名1’, ‘キー名2’,,, ])
onlyは指定したキー名のキー名と値をセットで取得する。引数の指定は値でも配列でもどちらでも可能。
指定したキーが一つも存在しない場合は空の配列 [ ] を返す。
例えば、http://localhost:13001/topics?category=info&x=abc&y=1 というページで以下メソッドを実行した時に取得できるデータは以下のようになる。
$request->only('name')
$request->only('category')
$request->only([ 'category', 'name', 'y' ])
$request->except([ ‘キー名1’, ‘キー名2’,,, ])
exceptはgetと真逆の処理をする。指定したキー名以外のキー名と値をセットで取得する。引数の指定は値でも配列でもどちらでも可能。
指定したキーがすべて存在する場合は空の配列 [ ] を返す。
例えば、http://localhost:13001/topics?category=info&x=abc&y=1 というページで以下メソッドを実行した時に取得できるデータは以下のようになる。
$request->only('name')
$request->only('category')
$request->only([ 'category', 'name', 'y' ])
$request->only([ 'category', 'x', 'y' ])
$request->has(‘キー 名’)
指定したキー名が存在すればtrue、なければfalseを返す。 パラメータの値が空の場合はfalseを返す。
データの有無によって処理を切り分けるときに使える。
例えば、http://localhost:13001/topics?category=info&x=abc&y=1 というページで以下メソッドを実行した時に取得できるデータは以下のようになる。
$request->has('category')
$request->has('name')
通信情報の取得
現在のページに関する情報を取得する便利メソッドについて。
通信情報の取得のメソッド一覧
メソッド | 内容 | 実例 |
path() | パスを取得(https://example.com/ 以下) | $request->path() |
is(‘パス名’) | 指定したパスであればtrue、そうでなければfalseを返す。ワイルドカードも使える | $request->is(‘topic’) |
url() | URLを返す(https://example.com/~)。パラメータはなし。 | $request->url() |
fullUrl() | URLを返す(https://example.com/~?name=Ken)。パラメータはあり。 | $request->fullUrl() |
method() | 使われているHTTP動詞を返す(GETやPOSTなど) | $request->method() |
isMethod(‘HTTP動詞’) | 指定したHTTP動詞と一致していればtrueをそうでなければfalseを返す。指定は大文字・小文字の区別なし。 | $request->isMethod(‘get’) |
$request->path()
pathは現在表示されているページのパスを取得する。
例えば、http://localhost:13001/topics?category=info&x=abc&y=1 というページであれば、ドメイン以下の topics を取得します。パラメータは無視する。
以下メソッドを実行した時に取得できるデータは以下のようになる。
$request->path()
$request->is(‘パス名’)
isは指定したパスであればtrue、そうでなければfalseを返す。ワイルドカード「*」も使うことができる。
例えば、http://localhost:13001/topics?category=info&x=abc&y=1 というページで以下メソッドを実行した時に取得できるデータは以下のようになる。
$request->is('topics')
$request->is('dummy')
$request->is('topics/*')
$request->is('topics*')
$request->url()
urlは現在のページの完全なURLを返す。ただしパラメータは除外する。
例えば、http://localhost:13001/topics?category=info&x=abc&y=1 というページで以下メソッドを実行した時に取得できるデータは以下のようになる。
$request->url()
$request->fullUrl()
fullUrlは現在のページのパラメータ付きの完全なURLを返す。
例えば、http://localhost:13001/topics?category=info&x=abc&y=1 というページで以下メソッドを実行した時に取得できるデータは以下のようになる。
$request->fullUrl()
$request->method()
mthodは現在のページのHTTP動詞(GETやPOSTなど)を返す。
例えば、GETメソッドで表示しているhttp://localhost:13001/topics?category=info&x=abc&y=1 というページで以下メソッドを実行した時に取得できるデータは以下のようになる。
$request->method()
$request->isMethod(‘HTTP動詞’)
isMethod(‘HTTP動詞’)は現在のページが指定したHTTP動詞かどうかをチェックし、合っていればtrueを違う場合はfalseを返す。
指定に大文字、小文字の区別はない。
例えば、GETメソッドで表示しているhttp://localhost:13001/topics?category=info&x=abc&y=1 というページで以下メソッドを実行した時に取得できるデータは以下のようになる。
$request->isMethod('get')
$request->isMethod('GET')
以上。