【Laravel】Viewの冗長なコードを `@include` でスッキリ整理！  

## はじめに  

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

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

---

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

```php
<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` を作成し、先ほどのコードを共通化します。

```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` を呼び出します。

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

---

## **メリット**  

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

### **✅ コードの重複を排除できる**  
`select` を使うたびに12行書いていたものが、**たった1行の `@include` で済む** ようになります！  

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

**リファクタリング前**  
```php
// 12行 × 3 = 36行
```

**リファクタリング後**  
```php
// 1行 × 3 = 3行
```

**驚異の約90%削減！**  

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

### **✅ 他のフォーム要素にも応用可能！**  
この方法は `input`、`checkbox`、`date`、`submit` などにも適用可能！  
たとえば `input` フィールドを `@include('common.form.input')` にまとめることで、**管理画面全体のリファクタリングが劇的に進む** でしょう。  

---

## **対応バージョン**  

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

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

---

## **まとめ**  

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

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

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

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