Laravel – dump()とdd()

概要

PHPのvar_dump()と同じような変数表示機能を提供する。

dump()

dump()は変数の内容をブラウザー上に表示する。

たとえばコントローラー内で以下の記述があるとき

ビューの内容に先立って、dump()による変数の内容が表示される。配列などの場合、個別にその内容を展開・折りたたみできる。

dd()

dump()の場合、エラーが生じてビューにエラーメッセージが表示されるとdump()の結果が表示されない。

dd()を使うと、その時点でブラウザーにdump()と同じ内容を表示し、実行が停止する(dump and die)。

 

Laravel – ルートパラメーターのwhereによる検証

概要

ルートパラメーターがURIに含まれて送られてきた時、ルーティングの段階で、正規表現を使って検証することができる。

検証の結果正規表現にマッチすれば処理され、マッチしなければ”404 Not Found”エラーとなる。

ルーティングの書き方

以下の様に、通常のルーティングのget()メソッドにwhere()を適用する。

たとえば以下は、ルートパラメーターが2桁の整数(00や01などを含む)であることを検証している。数字2桁ならValidと表示され、数値の桁が違ったり、数字以外の文字が含まれている場合は404エラーとなる。

リクエスト先がコントローラー・アクションでもこれは使える。以下の例ではリクエストパラメーターが数字2桁の場合だけアクションが実行され、そうでなければ404エラーとなる。

 

Laravel – POSTリクエストパラメーター

概要

Laravelでは、フォームからPOSTされたリクエストパラメーターもクエリーパラメーターと同じようにRequestオブジェクトを介して取得できる。

  • formからのメソッド(POST)にしたがって、actionで指定した送信先に、リクエストパラメーターがHTTPリクエストのボディーに含められて送信される
  • actionの送信先からコントローラーのアクションにルーティング
  • アクションでパラメーターを取得して利用

フォーム

例として、以下のフォームを含むビューでリクエストを受け付ける。

  • 入力項目=パラメーターはuser_namepost
  • メソッドはPOST
  • actionのターゲット取得にurl()ビューヘルパーを使っている
  • form開始タグの直後に@csrfディレクティブがあるが、これはCSRF(Cross Script Request Forgery)を防止するためのトークンを埋め込むためのもので、デフォルトではこれがないとフォーム送信時に”419 Page Expired”エラーになる

ルーティング

フォームからの送信が送られるactionのターゲットをコントローラーのアクションにルーティングする。この時はパラメーターについて特に関与しない。

以下は上記の例のルーティング例。

コントローラー

ルーティングされたコントローラーのアクションで、リクエストパラメーターを取得して利用する。

必須事項

クエリーパラメーターのコントローラーにおける必須事項を参照。

アクションにおけるパラメーターの取得

Requestオブジェクトのinput()メソッド

アクションの引数で指定したRequestオブジェクトのinput()メソッドで引数にパラメーター名を指定すると、これに対応したパラメーターの値が得られる。

$request->input('パラメーター名');

  • $requestはアクションの引数名で任意
  • パラメーター名はフォーム各要素のname属性で指定した名前

冒頭の例に対応したコントローラーの記述例は以下のとおり。

ビューはこれらの値を使って表示される。

request()関数

Requestオブジェクトのinput()メソッドではなく、request()関数の引数にパラメーター名を指定してもパラメーターの値を取得できる。

request('パラメーター名');

先の例のアクションの部分をこれで書き換えると以下の様になる。

 

Laravel – url()

概要

url()は、パス文字列を与えてドメイン名を含むURLを返すヘルパー。

ドメイン名

引数に空文字列''を与えると、ドメイン名が得られる。

ドメインを含むパスの生成

引数のパスに文字列を与えると、ドメイン名の後にそれが付加されたパスが生成される。引数文字列の先頭に'/'があるかどうかは関係なく、ドメイン名にパスが連ねられたURLが得られている。

現在のURLに関する情報

url()に引数を与えない場合はIlluminate\Routing\UrlGeneratorインスタンスが戻り値となり、そのメソッドによって現在のURLに関する様々な情報が得られる。

  • url()->current()は現在のフルパスでクエリーは含まない
  • url()->full()は現在のフルパスでクエリーも含む
  • url()->previous()は直前にいたページのURL

たとえば現在のURLがクエリーを含む以下の用であるとする。

http://localhost:3000/example/path?x=123

また1つ前に表示していたページのURLが以下だったとする。

http://localhost:3000/old

 

 

Laravel – クエリーパラメーター

概要

クエリーパラメーターは、フォームの送信時にGETメソッドを指定した時に送信されるパラメーター形式。

ルートパラメーターが直接URIの一部としてパラメーターの値を送るのに対して、クエリーパラメーターはパラメーターの名前と値をセットで送る。たとえば以下の様に。

http://www.my_bbs.com/search_post?user_id=10

このパラメーターをコントローラーで取得するには、以下の2通りの方法がある。

  • アクションの引数でRequestオブジェクトを指定し、その属性でパラメーター名を指定する。
  • アクション内でrequest()関数の引数にパラメーター名を指定する

いずれの場合も、コントローラーで以下の指定が必要。

use Illuminate\Http\Request;

ルーティング

ルーティング設定では、パラメーターを送信するパスとそれを受け取るコントローラー・アクションを指定するだけで、特別の記述はない。

Route::get('パス', 'ルーティング先');

たとえばmy_bbsというアプリケーションで以下のようにルーティングを設定した場合、

リクエスト側のURLは以下のようになる。

http://www.my_bbs.com/search_post?user_id=5

複数のパラメーターを送る場合は以下の様に'&'で区切る。

http://www.my_bbs.com/search_post?user_id=5&keyword=hello

ルーティングではパラメーターの数や名前には関与せず、コントローラー・アクションにおいてこれらを扱う。

コントローラー

必須事項

Request使用の宣言

コントローラー定義前に以下の定義が必要。artisanでコントローラーを生成すると、この定義は自動的に含まれる。

use Illuminate\Http\Request;

アクションの引数でのRequestオブジェクト指定

コントローラーでクエリーパラメーターを扱うのに、Requestパラメーターをアクションの引数に指定する方法と、request()関数を使う方法があるが、いずれの場合でも、アクションの引数にRequestクラスのオブジェクトを引数として指定する。

public function アクション名(Request $request) { ... }

引数の変数名は、必ずしも$requestでなくてもよい。

共通のコントローラー・アクションの形式

上記2つをまとめたコントローラー・アクションの一般形は以下のとおり。

アクションにおけるパラメーターの取得

Requestオブジェクトの属性からパラメーターを受け取る方法

アクションの引数に指定したオブジェクトの属性値に、パラメーター名を指定して値を取り出す。引数の変数名は$requestである必要はなく任意。

$request->パラメーター名

たとえば先のリクエストの項で挙げた例の場合、以下のような処理例となる。ビューではコントローラーで設定された変数を使う。

複数パラメーターが送られる場合は、Request引数の属性で順次パラメーター名を指定して取り出す。

request()関数にパラメーター名を指定して受け取る方法

request()関数の引数に、クエリーのパラメーター名を指定して値を取り出す。

request('パラメーター名');

上記の複数パラメーターの例をこの方法で書き換えると以下のとおり。

パラメーター省略時

リクエスト送信時にパラメーターを送信した時など、コントローラーで想定したパラメーターが存在しないときはエラーにならず、値が空文字列となる。

 

Laravel – ルーティング

ルーティングの基本形

Route::メソッド('パス', ルーティング先);

たとえばGETメソッドで'ドメイン/bbs/show_posts'がリクエストされ、そのコントローラがBbsController、メソッドがshowPostsの場合は以下のように書く。

メソッド

HTTPメソッドに対応したRouteクラスのスタティックメソッドが準備されている。

  • get
  • post
  • put
  • patch
  • delete
  • options

URL

HTTPリクエストで指定されるURLを記述する。

  • ドメイン以下のパスを書く
  • 頭の'/'はあってもなくてもよい

たとえばGETメソッドによるhttp://www.my_site/bbs/show_postsへのリクエストを扱う場合は以下のようになる。

または

ルーティング先

コントローラーとアクションを指定

'コントローラー名@アクション名'で指定する。

たとえば上記のURLへのリクエストをBbsControllerコントローラーのshowPostsアクションにルーティングしたい場合は以下のように指定する。

シングルアクションコントローラーを指定

'コントローラー名'で指定する。

たとえば上記のURLへのリクエストでシングルアクションコントローラー'ShowPosts'にルーティングしたい場合は以下のように指定する。

直接ビューを指定

コントローラーを介さずに直接ビューを指定する方法。無名関数を使い、戻り値にビューを指定したview()関数を渡す。

Route::get('パス', function () { return view('ビュー'); });

たとえば先のURLへのリクエストでビューファイルが以下のように配置されているとする。

resources/views/bbs/profile.blade.php

この場合のルーティングは以下のようになる。

ビューで参照する変数がある場合、以下のようにコントローラーと同じように無名関数の中で設定できる。

直接出力

無名関数の戻り値に直接文字列を渡すと、それがそのまま送信される。

Route::get('パス', function () { return '文字列'; });

以下の例では、ブラウザーに単に「こんにちは」とだけ表示される。

直接HTMLを送ることも可能。

ルートパラメーター

ルートパラメーターは、以下の様にリクエストURIの一部としてパラメーターの値が送信される。

http://ドメイン/.../パラメーター

パラメーターの値のみ送り、それを扱う変数の名前はLaravelで指定する。

 

Larave- コントローラーの基礎

コントローラーの生成

artisanで作成する

php artisan make:controller コントローラー名

コントローラーが配置される場所。

app/Http/Controllers

初期状態のコントローラーの内容。

一般的な構成

ビューの基礎で使ったblade_sampleはルーティングファイルに変数などを記述して呼び出していた。しかし一般的には、ビューに必要な処理はコントローラーのメソッド=アクションを記述し、ルーティングではコントローラーのアクションを呼び出す、という方法が取られる。

そこで、このルーティングに書かれた処理をコントローラーに記述しなおし、ルーティングはコントローラーを呼び出すだけの構成に変更する。

コントローラーの記述

先に生成したSampleControllerクラスのメソッドとして、sampleAction()を定義し、その中に変数定義などの処理とビューの呼び出しを記述する。

ルーティングでのアクションの定義

ルーティングの無名関数で処理を記述していた部分を、アクション呼び出しの書き方に変更する。

このように変更することで、ルーティングはURLとメソッドをアクションに結びつけることに専念し、シンプルになる。

 

Laravel – レイアウト

概要

  • 複数のビューで共通の部分がある場合、それらをまとめたビューを作って親とする(レイアウト)
  • 共通レイアウトの中で、個々のビューごとに内容が異なる部分に@yieldディレクティブを書く
  • 個々のビューの最初で、レイアウトとして使うビューを@extendsで指定する
  • レイアウトの中で@yieldを書いた部分の具体の内容を@sectionディレクティブで書く
  • 異なるレイアウトでまとめられる部分がある場合は親のレイアウトにまとめて、異なる部分を親レイアウトの@yieldと子レイアウトの@sectionで書き、階層化する

レイアウトとビュー

レイアウトもビューファイルだが、複数のビューで共通化できる部分をまとめたのがレイアウト。

個別のページごとの内容に対応する部分を、レイアウト中で@yieldディレクティブで名前を付けて仮置きしておく。

たとえば以下は各ページ共通のヘッダーをレイアウトに持たせて、個別ページのタイトルと内容はtitlecontentという名前で仮置きしている。

個別のページでは、

  • レイアウトとして使うビューを@extendsディレクティブで指定する
  • レイアウト中@yieldで仮置きした部分に対応する内容を@sectionディレクトリーで具体に書いていく

この例では、全体のレイアウトとして上で準備したビューファイルを指定して、タイトルと内容を@sectionディレクティブで具体に書いている。

@sectionディレクティブには以下の書き方がある。

  • 2つ目の引数で内容を渡す方法
  • @section@endsectionの間に具体の内容を書く方法

レイアウトの階層化と継承

レイアウトが一部共通部分を持ちながら、いくつかの種類に分けられるような場合、レイアウトを階層化する。

例えばログイン前のページ、ログイン後のページが複数あり、ログイン前後でヘッダーメニューの構成が変わる場合。

ログイン前後でヘッダーメニューの内容は異なるが、ヘッダーメニューがあるという点は共通。

共通レイアウト

まず、大元のlayouts/common.blade.phpを以下のように準備する。

このレイアウトでは、タイトル、ヘッダー、内容の3つを@yieldでプレースホルダーとしている。

個別レイアウト

次に、ログイン前とログイン後それぞれのレイアウトを準備する。

全体構造は共通のcommonから@extendsで継承し、それぞれで異なる内容となる@yield('header')に対応する部分だけを具体に書いていく。

個々のページによって異なる@yield('title')@yield('content')についてはここでは対応せず、具体のビューで内容を埋める。

以下はログイン前のレイアウト。

また、以下はログイン後のレイアウト。

個別ビュー

個別のビューでは、大元の共通レイアウトを継承したログイン前/後いずれかのレイアウトを指定する。そして未対応@yield('title')@yield('content')に対応する内容を@sectionで埋めていく。

たとえばログイン前のログインページの例。

またログイン後のトップページの例は以下の通り。

 

Laravel – ビューの基礎

基本的なビューの表示方法

概要

routes/viewsディレクトリー下かそのサブディレクトリー下にビューファイルを置き、ルーティングでそれを指定する。

ビューファイル名には.blade.phpが付加され、HTML以外にLaravelの機能を持たせるための記述を含む、Bladeテンプレートとして扱われる。

  • ビューファイルは
    • resources/viewsディレクトリー下、あるいはそのサブディレクトリー下に置く
    • ファイル名は[ビュー名].blade.phpにする
  • ルーティングでビューファイルを指定するときは
    • 無名関数の処理内容をreturn view('ビュー名');とする
      • ビュー名はビューファイル名から.blade.phpを除いたもの
    • ビューファイルをサブディレクトリー下に配置した場合、resources/viewより下のパスを、デリミターを'.'として記述する

例1

Laravelプロジェクト生成直後に表示される”Laravel”の初期ページ。ルーティングファイルに以下だけ記述されている。

また、resource/viewsディレクトリーにはwelcome.blade.phpファイルのみ準備されている。

内容は以下のとおり。

例2

resourcesディレクトリーの下にsamplesディレクトリーをつくり、その中にview_sample.blade.phpというファイル名で以下の内容のファイルを作成する。

routes/web.phpファイルに以下のルーティングを追加する。

サーバーが起動している状態でブラウザーからドメイン/view_sampleにアクセスすると、view_sample.blade.phpがパースされて表示される。

この場合のビューファイルとview()メソッドでの指定の仕方は以下のとおり。

  • ビューファイルをviewsディレクトリーのサブディレクトリーsamples下に作成
    • views/samples/view_sample.blade.php
  • view()メソッドで呼び出すときは'.blade.php'を除き、パスのデリミターを'.'にした形で指定
    • samples.view_sample

URIの/view_sampleとファイル名のview_sample.blade.phpは必ずしも同じである必要はない。

変数の展開

概要

ビューファイル内に、PHPの変数を埋め込んで内容を反映させることができる。

  • ビューに対して変数を渡すときは、[変数名]=>[内容]を要素とする連想配列で渡す
  • ビュー側では、連想配列のキーが変数名、値が内容として解釈される
  • ビュー内で{{ 変数 }}とすると変数の内容が展開され、HTMLに埋め込まれる

resources/samplesディレクトリー下に、ファイル名blade_sample.blade.phpで以下の内容のファイルを作成する。

このビューに対して、routes/web.php内で以下の様にルーティングを設定。

ビューファイルのパース時に変数が展開され、内容がHTMLに埋め込まれるため、ブラウザーでの表示結果は以下のようなイメージになる。

bladeテンプレートでの変数展開
  • 連想配列をview()の第2引数に渡す
  • それを受け取ったビューでは、キーが変数名、値が変数の内容となる

出力エスケープ

変数埋め込みで内容を展開する際、HTML特殊文字はエンティティーに変換されるが、エスケープを抑制してHTML特殊文字をそのまま出力する方法もある。

概要

  • ビューで{{ ... }}とするとHTMLの特殊文字はLaravelによってエスケープされる
  • {!! ... !!}とするとHTMLの特殊文字はエスケープされず、HTMLとして機能する

ルーティングファイルweb.phpに以下の2行を追加する。

また、先に作成したビューファイルblade_sample.blade.phpに以下の2行を追加する。

この場合のブラウザーの表示結果は以下のイメージ。

bladeテンプレートでの変数展開
  • 連想配列をview()の第2引数に渡す
  • それを受け取ったビューでは、キーが変数名、値が変数の内容となる

HTML特殊文字は<strike>自動的に</strike>エスケープされる

{{…}}}ではなく{!!…!!}で囲むとエスケープされるされない

コメント

Bladeテンプレート内にコメントを書くことができ、HTMLへのパース時にはコメント行は無視される。

概要

  • Bladeテンプレートのコメントは{{-- ... --}}で記述する
  • Bladeのコメントはパース後のHTMLには現れない

最初に使ったview_sample.blade.phpファイルに以下の2行を追加する。

これがパースされた後のHTMLソースは以下の様になり、Blade用のコメントはソースに反映されていない。

ディレクティブ

概要

Bladeテンプレート内に条件分岐やループなどを行うディレクティブを書くことができる。

  • ディレクティブはBladeテンプレートに記述し、ロジック制御やレイアウト処理などPHPとしての処理を埋め込む
  • ディレクティブは@キーワード...のように記述する

まず、ルーティングでビューに配列を渡す。

ビューでは、配列の要素を一つずつ取り出して表示させている。

ここで使われている@foreach@endforeachがディレクティブで、ビューの中でPHPの処理・制御をしたり、レイアウトを扱ったりすることができる。

ディレクティブの詳細はこちら

レイアウト

レイアウトに関するディレクティブを使って、ファイルの共通のレイアウトをまとめることができる。

概要

  • 共通レイアウトのビューを親とする
    • プレースホルダーとして@yieldディレクティブを書く
    • @yieldごとにその場所に入るべきセクション名を指定
  • 共通レイアウトを利用するビューを子とする
    • 親とするレイアウトビューを@extendsディレクティブで指定する
    • 親の各@yieldに対応するセクションを@sectionディレクティブで定義し、その内容を記述する

共通のレイアウトとして、views/layouts/common.blade.phpを以下の内容で準備する。

  • titlle要素に'title'セクションの内容を反映
  • main要素に'content'セクションの内容を反映
  • header要素の部分は、このページが変わっても同じ内容が表示される

この共通レイアウトを使うページを、views/samples/layout_sample.blade.phpとして以下の内容で準備する。

  • @extendsディレクティブで、レイアウトとして使うビューを指定している
  • 1つ目の@sectionディレクティブでtitleセクションに反映させる内容を$title変数で与えている
  • 2つ目の@sectionディレクティブでcontentsセクションに反映させる内容を記述している

これらについて以下のルーティングを設定し、ブラウザーからアクセスする。

出力イメージは以下の様になる。

共通レイアウトに各ページ共通のヘッダーなどを置けます
bladeテンプレートでの変数展開

3は3の倍数
5は5の倍数
6は3の倍数
9は3の倍数
10は5の倍数

スタイル

概要

  • publicディレクトリー下、あるいはそのサブディレクトリー下にCSSファイルを配置する
  • linkタグでCSSファイルを指定する

publicディレクトリー以下に配置されたファイルをlinkタグで指定するには、以下の様に記述する。

たとえばpublicディレクトリー下にcssディレクトリーを作成し、その下にstayles.cssを作成、CSSを記述したとする。

このファイルをビューから呼び出すには、以下の様に記述する。

 

Larave – ディレクティブ

概要

ディレクティブ(directive)はBladeテンプレート内に記述し、テンプレート内でPHPの処理・制御をおこなったり、共通のレイアウトを扱うといった処理を指示する。

ディレクティブは@キーワードのように書き、そのキーワードに応じて必要な表現が続く。

ロジック制御系ディレクティブ

分岐系ディレクティブ

@if

@unless

@empty

@isset

ループ系ディレクティブ

@for

@foreach

@forelse…@empty

@while

@break

PHPのbreakと同じ使い方。

@continue

PHPのcontinueと同じ使い方。

$loop変数

$loop->index 現在のインデックス(0, 1, 2, …)
$loop->iteration 現在の繰り返し数(1, 2, 3, …)
$loop->remaining あと何回繰り返すか
$loop->count 配列の要素数
$loop->first 繰り返しの最初かどうか
$loop->last 繰り返しの最後かどうか
$loop->depth 繰り返しのネストの深さ
$loop->parent ネストしている場合の親のループ変数

共通化・再利用関係ディレクティブ

レイアウト関係ディレクティブ

レイアウト関係はこちらにまとめている。

@extends/@yields/@section

  • @extendsでレイアウトとして使う親のビューを指定
  • @yieldで個別ビューで埋めるべきプレースホルダーを指定
  • 個別ビューやサブレイアウトで@sectionを指定し、対応する@yieldを具体の内容で埋める

@show

@parent

部分HTML関係ディレクティブ

@include

@includeディレクティブは、別に準備された共通の部分ビューをその場所に読み込む。第2引数に連想配列を指定して、引数を渡すことができる。

例として、以下は共通して読み込まれる部分ビュー。

そして以下は、@includeで上のHTMLを読み込むビュー。

@component/@slot

@includeと同じように共通の部分ビューを読み込むが、変数を指定するのに連想配列で渡す方法と@slotディレクティブで指定する方法がある。

以下は@componentで読み込まれる部品側のファイル。

そして以下は、この部品を読み込んで使う親のファイル。

@each

@eachディレクティブは、配列やコレクションの内容を取り出しながら、その内容を繰り返してビューに適用していく。

ビュー2はコレクションが空のときに使われるビュー。

たとえば以下のような部分ビューを準備しておいて、

以下のように@eachを使うことで、配列の要素1つずつに同じ部分ビューの内容を適用させることができる。

この結果、@componentの時と同じようなリストが配列の要素に対応して作られる。

@import/@component/@eachの使い分け

これら3つを使い分けるシーンについて、以下のように考えてみた。

@import
ある程度の規模の定型部分ビューの一部を変数で与えながら再利用する場合。
@component
個別ビューでHTMLの一部を設定しながら一定の構造を持たせる場合。
@each
コレクションの内容に応じたリスト項目の表示など、部分HTMLに対して定型で内容が変化する場合。