2
0

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】Viewの冗長なコードを `@include` でスッキリ整理!

Posted at

はじめに

Laravelで管理画面を作成していると、似たようなフォームのコード を何度も書くことになりますよね。特に、selectinput などのフォーム要素は、Bootstrapと組み合わせるとコードが長くなりがち です。

例えば、以下のような select ボックスのコードを複数の画面で使う場合、コピー&ペーストを繰り返すとViewファイルがどんどん肥大化 してしまいます。


冗長な select ボックスのコード

<div class="col-3">
    <div class="input-group">
        <div class="input-group-prepend">
            <span class="input-group-text">カテゴリ</span>
        </div>
        <select class="form-control" id="category_id" name="category_id">
            @foreach ($category_ids as $k => $v)
            <option value="{{ $k }}" @if ($k==$category_id) selected @endif>@if ($k == '') {{ $v }} @else {{ $k }}:{{ $v }} @endif</option>
            @endforeach
        </select>
    </div>
</div>

このコードを何回も書くのは、メンテナンス性が低下するだけでなく、修正時の工数も増える ので非効率です。


@include を使ってスッキリ整理!

Laravelの @include を活用すると、共通のフォーム部品を別ファイルにまとめて管理 でき、記述量を大幅に削減できます!

① 共通の select コンポーネントを作成

まず、resources/views/common/form/select.blade.php を作成し、先ほどのコードを共通化します。

{{-- resources/views/common/form/select.blade.php --}}
<div class="col-md-{{$formSize}}">
    <div class="input-group">
        <div class="input-group-prepend">
            <span class="input-group-text">{{$caption}}</span>
        </div>
        <select class="form-control" id="{{$name}}" name="{{$name}}">
            @if ($flag===true)
            <option value="" @if ($value===null) selected @endif>指定なし</option>
            @endif
            @foreach ($keyValueMap as $k => $v)
            <option value="{{ $k }}" @if ($k==$value) selected @endif>
                @if ($k == '') {{ $v }} @else {{ $k }}:{{ $v }} @endif
            </option>
            @endforeach
        </select>
    </div>
</div>

@include を使って簡潔に記述

次に、Viewファイルでは以下のように @include を使って select を呼び出します。

@include('common.form.select', ['formSize' => 2, 'name' => 'category', 'caption' => 'カテゴリ', 'keyValueMap' => $categories, 'value' => $category ?? '', 'flag' => true])

メリット

この方法を使うことで、以下のようなメリットがあります。

✅ コードの重複を排除できる

select を使うたびに12行書いていたものが、たった1行の @include で済む ようになります!

例えば、同じ select を3回使う場合:

リファクタリング前

// 12行 × 3 = 36行

リファクタリング後

// 1行 × 3 = 3行

驚異の約90%削減!

✅ メンテナンスがしやすくなる

  • select のデザインや仕様を変更する際、1ファイルの修正だけでOK!
  • コードの見通しが良くなり、開発チーム全体の生産性も向上 します。

✅ 他のフォーム要素にも応用可能!

この方法は inputcheckboxdatesubmit などにも適用可能!
たとえば input フィールドを @include('common.form.input') にまとめることで、管理画面全体のリファクタリングが劇的に進む でしょう。


対応バージョン

Laravelの @includeLaravel 5.0 以降 で利用可能です。
Laravel 5 以降のBladeテンプレートでは、@include を使って別のBladeファイルを簡単に組み込むことができる ので、現在のLaravel 10 でも問題なく使えます!

⚠️ 注意点

  • Laravel 4以前 では @include は利用できません。
  • Laravel 5.8以降 では @includeIf@includeWhen などの便利なディレクティブも追加され、より柔軟な条件分岐が可能になっています。

まとめ

Laravelの @include を活用すると、管理画面のフォームコードを共通化 でき、開発効率と保守性が大幅に向上 します!

特に、Bootstrapを使ったフォームの作成 ではコードが冗長になりがちなので、積極的にコンポーネント化してスッキリ整理 していきましょう!

「同じようなコードを書いてるな…」と思ったら、すぐに @include でリファクタリング!

ぜひ試してみてください!

2
0
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?