【Laravel】@ifをもとにviewとcontrollerの関係性を考えた

なにこれ

laravelのbladeテンプレートを眺めていたときに、@ifがやたら使われていてbladeテンプレートなのにロジックじみていたので、@ifをもとにviewとcontrollerの関係性を考えてみました。

ViewとControllerの責務について

まず、ViewとControllerの責務について考えていきたいと思います。

MVCモデルに関してはこちらをご参照ください。

https://tech-tech.blog/php/laravel/mvc/

以前にまとめた上記の記事によると、ViewとControllerはこのように責務を定義できます。

Controller・・・リクエストに応じて処理を振り分ける責任を持つ

View・・・情報の出力部分に責任を持つ

今回はviewがbladeテンプレートになるので、bladeテンプレートに使われてる変数も考慮した上で責務を考えると以下のように考えられるかなと思います。

Controller・・・リクエストに応じてBladeテンプレートを指定し、必要があれば変数を渡す。

View・・・Controllerから渡ってきた変数を利用して、出力するhtmlを作成する。

@ifが使われるケース

次に、@ifが使われるケースを見ていきます。

今回は大きく2つのケースに分けてみました。

1つ目は、変数によって出力される値が変わるケースです。

以下性別の例になります。

@if ($gender == 0)
  <p>男</p>
@elseif ($gender == 1)
  <p>女</p>
@else
  <p>その他</p>
@endif

このように変数によって@ifで分岐を作成し、出力される値が変わるケースが考えられるかと思います。

2つ目は、変数によって出力されるhtmlが変わるケースです。

以下例になります。

@if ($is_login)
 <button>ログアウト</button>
@else
 <p>ログインしてください</p>
 <a href="">ログイン</a>
@endif

このように変数によって@ifで分岐を作成し、出力されるhtml自体が変わるケースが考えられるかと思います。

ViewとControllerの関係性について

いよいよ本題です。

上記の@ifの2つのケースは似ているように見えて、違いがあります。

1つ目のケース

1つ目のケースは、controllerから渡された変数によって、if文を利用して対応する値を返していると考えることができます。

これを角度を変えて考えてみると、変数によって新たな変数を作成していると考えることができるかと思います。

変数を作成すると考えると、その責務はcontrollerにあります。

つまり、1つ目のケースはbladeテンプレートで@ifを使用するのではなく、controllerで変数を作成してそれをbladeテンプレートに渡すのが責務の分離的には正しいです。

ただ、何でもかんでもcontrollerに書くとファットコントローラーの原因になってしまうので、実際はView ComposerやPresenterなどを利用することになるかなと思います。

2つ目のケース

2つ目のケースは、controllerから渡された変数によって、htmlを返しています。

htmlを作成するということは、viewの責務になります。

つまり、2つ目のケースは@ifを利用してviewに書くのが責務の分離的には正しいです。

逆に、controllerからhtmlを文字列で返すなどはviewの責務をcontrollerで行ってしまっているので、責務の分離的には誤っていると思います。

 

このように@ifの使い方1つとっても、viewとcontrollerの関連性や責務の分離を考えることができました。

最後に、今回の考えや使い方は個人の感想になりますので、これが絶対ではないですし別の考え方もあるかと思います!

 

以上!!!!!!!