はじめに
LaravelのBladeとRailsのERB(Embedded Ruby)は、それぞれのフレームワークにおける標準的なテンプレートエンジンです。両者はサーバーサイドのHTML生成を効率化しますが、使い方や特徴には違いがあります。本記事では、公式ドキュメントを参考にしながら、BladeとERBの違いや共通点を解説します。
BladeとERBの基本
Bladeの特徴(Laravel)
拡張子:Bladeテンプレートファイルは .blade.php
という拡張子を使用します。
構文の簡潔さ:Bladeでは、{{ }} で変数を出力し、@if
や @foreach
のようなディレクティブで制御構文を記述します。
コンパイル:Bladeテンプレートは、実行時にPHPコードにコンパイルされます。
レイアウトの継承:@extends
や @section
を使って、レイアウトを簡単に継承できます。
ERBの特徴(Rails)
拡張子:ERBテンプレートファイルは .html.erb
という拡張子を使用します。
Rubyコードの埋め込み:<%= %>
や <% %>
を使って、Rubyコードを直接埋め込むことができます。
シンプルさ:ERBは特別なディレクティブを持たず、Rubyコードをそのまま利用できます。
レイアウトの継承:yield
や content_for
を使って、レイアウトの構造を定義します。
比較ポイント
1. 変数の出力
Blade: {{ $variable }}
→ 自動でHTMLエスケープされます。
ERB: <%= variable %>
→ エスケープされないため、エスケープが必要な場合は h(variable)
または ERB::Util.html_escape(variable)
を使用します。
例: Blade:
<h1>{{ $title }}</h1>
ERB:
<h1><%= title %></h1>
2. 条件分岐
Blade: @if
, @elseif
, @else
, @endif
ERB: <% if %>
, <% elsif %>
, <% else %>
, <% end %>
例: Blade:
@if ($isLoggedIn)
<p>ログインしています。</p>
@else
<p>ログインしていません。</p>
@endif
ERB:
<% if is_logged_in %>
<p>ログインしています。</p>
<% else %>
<p>ログインしていません。</p>
<% end %>
3. 繰り返し処理
Blade: @foreach
ERB: <% for %>
または .each
例: Blade:
<ul>
@foreach ($items as $item)
<li>{{ $item }}</li>
@endforeach
</ul>
ERB:
<ul>
<% items.each do |item| %>
<li><%= item %></li>
<% end %>
</ul>
4. レイアウトの継承
Blade: @extends
, @section
, @yield
ERB: layout
, yield
, content_for
例: Blade: layouts/app.blade.php
:
<html>
<head>
<title>@yield('title')</title>
</head>
<body>
@yield('content')
</body>
</html>
home.blade.php
:
@extends('layouts.app')
@section('title', 'ホームページ')
@section('content')
<h1>Welcome!</h1>
@endsection
ERB: layouts/application.html.erb
:
<html>
<head>
<title><%= yield(:title) %></title>
</head>
<body>
<%= yield %>
</body>
</html>
home.html.erb
:
<% content_for :title do %>ホームページ<% end %>
<h1>Welcome!</h1>
結論
BladeとERBは、それぞれのフレームワークに最適化されたテンプレートエンジンですが、基本的な用途は共通しています。
Bladeは比較的学習コストが低く、PHPの知識があればすぐに使えます。
ERBはRubyコードをそのまま活用でき、Rubyの柔軟性を最大限に引き出します。
プログラミング初心者にとっては、どちらのテンプレートエンジンも直感的に使える設計になっているため、フレームワークの選択に応じてスムーズに習得できるでしょう。