見出し画像

[lavavel8] viewの基礎

ユーザーのブラウザで表示されるHTMLで構成されるviewを見ていきます。

viewファイル

laravelで使われるテンプレートのファイルは

resources/views/

のディレクトリの下に保存されています。

Laravelをインストールした直後には

resources/views/welcome.blade.php

が自動的に作られます。

基本的にはここのディレクトリにあるファイルが、あなたのサイトを見にきたユーザーが見るページになります。

すでに気づいているかもしれないですが、viewのファイルは

welcome.phpではなくwelcome.blade.phpになります。

もちろんwelcome.phpでも使えるのですが、laravelのテンプレートエンジンのbladeを最大限利用するために .blade.phpをつけています。

例えばphpの文字力の出力は

<?= $title; ?>

もしくは

<?php echo $title; ?>

と書きますが、bladeでは

{{ $title }}

と簡潔に書くことができます。

Laravelではbladeが使われると~.blade.phpのファイルはバニラphp(素のphpのみの)ファイルにコンパイルされます。

laravelのプロジェクトの

storage/framework/views

のディレクトリを見てみるとコンパイルされたviewのテンプレートが保存されています。

エスケープ

上で示した変数の出力方法

{{ $title }}

は、$titleはエスケープされて表示されます。この理由は$titleの変数にjavascriptのタグなど開発者が望んでいない変数が入ってきても対処できるようにです。

例を見てみましょう。

$title = '<script>alert("alert....");</script>';
<h1>{{ $title }}</h1>

としてブラウザで見るとどうなるでしょうか?

スクリーンショット 2021-05-08 11.04.51

javascriptのalertが発せられるわけではなく、エスケープされ文字列として出力されていますね。

laravelではデフォルトでこの機能が付いています。

しかし、ユーザーにタグを入力してもらいそれを表示させたい時もあります。

たとえばブログのエディターを作って、<p>のタグを入力された時も

スクリーンショット 2021-05-08 11.02.15

このようにエスケープを望んでいない時もエスケープされてしまいます。

laravelではエスケープしないで出力させる時も想定されていて、以下のようにして使用することができます。

{!! $title !!}

{{ }} の代わりに {!! !!} を使用することでエスケープしないで文字列を出力させることができます。


bladeディレクティブ

Laravelではbladeのファイルの中で使えるbladeディレクティブと呼ばれるIf文やループの構文のようなものがあります。

ここではよく使われるいくつかのbladeディレクティブを確認します。

@if

@if(条件)
 条件がtrueの時に出力される
@endif

もちろん elseも使えます。

@if(条件)
 条件がtrueの時に出力される
@else
 条件がfalseの時に出力される
@endif

@unless

@ifの真逆のunless

@unless(条件)
 条件がfalseの時に出力される
@endif

@foreach

例えばブログ記事の一覧を表示する時にも使います。

$posts に記事の一覧が入っているとして

@foreach($posts as $post)
  処理
@endforeach

などと記述し、それぞれの記事を表示したりできます。

また foreachでは$loop変数も準備されていて、

@foreach($posts as $post)
  @dd($loop)
@endforeach

としてみるとよくわかります。

ここのddディレクティブはlaravelでよくデバッグに使われるdd関数です。   ddはdump and dieの意味でデバッグで変数の中身などを出力し、その場で実行を止めて確認する場合などにとても便利です。

上の$loopは

{#999 ▼
 +"iteration": 1
 +"index": 0
 +"remaining": 0
 +"count": 1
 +"first": true
 +"last": true
 +"odd": true
 +"even": false
 +"depth": 1
 +"parent": null
}
$loop->iteration : 何回目の繰り返しか(1から始まる)
$loop->index : 元の配列またはコレクションのindex
$loop->remaining : あと何回繰り返しが残っているか
$loop->count : 元の配列またはコレクションの要素数
$loop->first : 最初の繰り返しかどうか (boolean)
$loop->last : 最後の繰り返しかどうか (boolean)
$loop->odd : iterationが奇数かどうか(boolean)
$loop->even: iterationが偶数かどうか(boolean)
$loop->depth : 繰り返しのネスト数
$loop->parent : ネストしている時、親の繰り返しのループ変数を示す

このloop変数を使用すれば、例えばブログの記事の一つおきに背景の色を変更するなどもできます。

    @foreach($posts as $post)
       <article class="{{ $loop->even ? 'greyColor' : '' }}">

       </article>
   @endforeach

最後に

今回はlaravelviewの基本的なところを確認しました。次回はviewファイルのレイアウトを確認していきます。


この記事が気に入ったらサポートをしてみませんか?