1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

この記事は、Laravelで使えるTemplate engine BLOCSの紹介です。

はじめに

BLOCSは、Laravelで使えるTemplate engineです。なぜBLOCSを開発するのか?「LaravelのBladeって結局プログラムをしないといけない感じがします」すべてはこの一言に集約されます。

Bladeのテンプレートでは、本の一覧表示などの繰り返し処理を以下のように記述します。せっかくHTMLは構造化されているのに、構造を活用せずにテンプレートを書くので「結局プログラムをしないといけない感」が出るのではと。HTMLの構造を活かすことで、Bladeのプログラムっぽさを減らせるのでは?と考え、BLOCSの開発を始めました。

example.blade.php
@foreach($books as $book)
    <tr>
        <td>{{ $book->id }}</td>
        <td>{{ $book->title }}</td>
        ...
        <td>
            @foreach($book->tags as $bookTag)
                <span>
                    {{ $bookTag->name }}
                    <br>
                </span>
            @endforeach
        </td>
        ...
    </tr>
@endforeach

BLOCSができること

HTMLを動的にする多くの場合、開始タグから終了タグまでを置換、表示・非表示、繰り返し表示などの処理をします。それなら、開始タグにデータ属性をつけて、開始タグから終了タグまでを処理をすればいいのではと考えました。BLOCSはデータ属性を開始タグに追加して、HTMLを動的に生成します。この記述方法をタグ記法と呼びます。

BLOCSを使うと、同様の処理を以下のように記述できます。テンプレートで指定したデータ属性data-*で、HTMLを動的に生成します。HTMLをくずさずに構造を活かして、シンプルに記述できるテンプレートエンジンを目指して、BLOCSを開発しています。

example.blocs.html
<tr data-loop=$books>
    <td>{{ $book->id }}</td>
    <td>{{ $book->title }}</td>
    ...
    <td>
        <span data-loop=$book->tags data-assign=$bookTag>
            {{ $bookTag->name }}
            <br>
        </span>
    </td>
    ...
</tr>

BLOCSはHTMLの構造を活かしてシンプルに書ける

他のテンプレートの読み込みや、条件によるHTML表示の制御など一通りのデータ属性をそろえてはおりますが、Laravelの標準テンプレートエンジンBladeとハイブリッドで使うことができるので、開発者の嗜好に合わせて楽になりそうな部分だけBLOCSを使ってください。

準備

Laravelがインストールされている環境に、composerでインストールしてください。

composer require blocs/blocs

テンプレートを書く

Bladeのファイル名は*.blade.phpですが、BLOCSのファイル名は*.blocs.htmlです。BLOCSテンプレートはHTMLとしてブラウジングできるので、拡張子を.htmlにしました。

BLOCSテンプレートは*.blocs.htmlで作る

タグ記法

それでは、よくあるエラーがあればメッセージを表示するテンプレートを作ってみましょう。Bladeで書くとこんな感じでしょうか。

example.blade.php
<html>
@if ($errorMessage)
    <div class="error">
        {{ $errorMessage }}
    </div>
@endif
</html>

BLOCSは、こんな感じで書けます。データ属性を開始タグに追加するだけなので、テンプレートにする前のHTMLをそのまま残しておくことができます。BLOCSテンプレートは、HTMLをくずさずにそのままブラウジングできることを目指しています。

example.blocs.html
<html>
<div class="error" data-exist=$errorMessage data-val=$errorMessage>
    errorMessage
</div>
</html>

BladeとBLOCSをハイブリッドで、下記のように書くこともできます。お好みでBLOCSとBladeを使い分けてください。

example.blocs.html
<html>
<div class="error" data-exist=$errorMessage>
    {{ $errorMessage }}
</div>
</html>

タグ記法はHTMLの開始タグに属性を追加する

コメント記法

他のテンプレートを読み込む時や、HTMLタグに属性を動的に追加する時にコメント記法で書きます。データ属性data-attributeは、コメント記法の次にあるHTMLタグの属性値を置換します。

それでは、よくあるエラーがあればclasserror、なければsuccessとするテンプレートは作ってみましょう。Bladeではこんな感じでしょうか?

example.blade.php
<html>
@if ($errorMessage)
  <div class="error">{{ $errorMessage }}</div>
@else
  <div class="success">Success</div>
@endif
</html>

BLOCSは、こんな感じで書けます。データ属性をコメントに書くので、HTMLをくずさずにそのままブラウジングできます。

example.blocs.html
<html>
<!-- data-attribute=class data-val="error" data-exist=$errorMessage -->
<div class="success" data-val=$errorMessage>Success</div>
</html>

data-attributeは以下のように省略することもできます。

example.blocs.html
<html>
<!-- :class="error" data-exist=$errorMessage -->
<div class="success" data-val=$errorMessage>Success</div>
</html>

data-attributeなどコメント記法で書くタグ属性もある

おわりに

最後まで読んでいただき、ありがとうございました。
Laravelは素晴らしいフレームワークです。Laravelと共に、BLOCSがプログラマー皆さんのアプリケーション開発をサポートできればいいなと思っています。

関連サイト

  1. サービスサイト
  2. GitHub
  3. Packagist
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?