ページビューの合計

2023年2月22日水曜日

Laravel: フロントエンド

フロントエンド

  1. リクエストのライフサイクル
  2. 設定
  3. ディレクトリ構成
  4. フロントエンド
  5. サービスコンテナ
  6. ファサード

 

イントロダクション

Laravelは、ルーティングバリデーションキャッシュ, キュー, ファイルストレージなど、最新のウェブアプリケーション構築に必要となる全ての機能が提供されているバックエンド・フレームワークです。しかし、私たちはアプリケーションのフロントエンドを構築するための強力なアプローチを含む、美しいフルスタック体験を開発者に提供することも重要であると考えています。

Laravelでアプリケーションを構築する場合、フロントエンドの開発には主に2つの方法があります。どちらの方法を選択するかは、PHPを活用してフロントエンドを構築するか、VueやReactなどのJavaScriptフレームワークを使用するかにより決まります。以下では、こうした選択肢について説明し、あなたのアプリケーションに最適なフロントエンド開発のアプローチの情報を十分に得た上で、決定してもらえるようにします。

 PHPでの開発というとバックエンド側に目がいきがちですが、ここではフロントエンド側にフォーカスしているようです。

1.PHPを使う


以前、ほとんどのPHPアプリケーションでは、リクエスト時にデータベースから取得したデータを表示するため、PHPのecho文を散りばめた単純なHTMLテンプレートを使用し、ブラウザでHTMLをレンダしていました。
HTMLテンプレートにDBのデータをecho文で出力してる感じですね。
 
このHTML表示の手法を使う場合、LaravelではビューBladeを使用して実現できます。Bladeは非常に軽量なテンプレート言語で、データの表示や反復処理などに便利な、短い構文を提供しています。

ビュー

ビューは、コントローラ/アプリケーションロジックをプレゼンテーションロジックから分離し、resources/viewsディレクトリに格納されます。
 
アプリケーションの主要な部分は、appディレクトリ内に格納されていますが、ビューだけは分離してresources/viewsディレクトリ内に保存するようです。
 
Blade
Laravelを使用する場合、ビューテンプレートは通常、Bladeテンプレート言語で記述します。単純なビューは以下のようになります。
<!-- View stored in resources/views/greeting.blade.php -->

<html>
    <body>
        <h1>Hello, {{ $name }}</h1>
    </body>
</html>
 
Bladeテンプレート言語を使うようです。
実質はHTMLファイルそのものです。その中に変数を直接埋め込む(echo文は使わず)ことができるようです。
 
Bladeはいわゆるテンプレートエンジンと呼ばれるものですね。せっかくなので調べてみました。
色んなサイトの説明を読んだのですがピンときませんね。
ここでいう機能やロジックというのは、MVCにおけるビジネスロジックのことですかね?
 
もしそうなら確かに分離していますが、それはテンプレートエンジンの機能というよりMVCモデルにおける役割の分離じゃないですかね?
画面表示で言えば、Mで取得したデータをVに渡して最終的にHTMLにレンダリングされるという流れです。
PHPの便利なツールで、機能を記述する部分と画面の表示部分を分割する事が出来ます。
テンプレートエンジンとは、「機能を記述する内容(PHP)」と「画面の表示内容(HTML&CSSなど)」を分けて管理できるツールです。HTMLの中に埋め込められるPHPは、初心者にも扱いやすいのが大きなメリットですが、PHPとHTMLが混在したファイルは、2つのルールが一緒に書かれているので読み取りにくいのが難点でした。修正を行う場合はページ数が多いほど膨大な時間がかかり、保守やメンテナンスが行き届きません。
そんな状況を回避するために、テンプレートエンジンは誕生しました。処理内容と表示内容を分けて作成できます。
PHPでは、HTMLページ内に<?php ?>タグで括る事によって、 HTML(デザイン部分)とプログラム(ロジック部分)を同一ページに記述できます。しかし、同じファイル内にデザイン部分とロジック部分を記述するとメンテナンスが非常に困難となります。
PHP では、Template Engineという技術によってデザイン部分とロジック部分を分離させメンテナンスを向上させることができるようになりました。
とてもシンプルなデータの埋め込み(変数を<h1>タグで囲って表示するだけ)ならいざ知らず、ループで一覧を表示したり、画面遷移やステータスによっては表示するものを変えたりロジックというか処理を書かないといけない気がします。
単純に
  • ビュー:結果表示だけ、デザイナーの担当
  • モデル(ビジネスロジック):プログラマーの担当
なんて分離できない気がするんですが?
とりあえず、スルーしておきます。
 
 マニュアルに戻って
この方法でアプリケーションを構築する場合、フォーム送信や他のページへの操作は、通常サーバから全く新しいHTMLドキュメントを受け取り、ページ全体をブラウザで再レンダします。現在でも多くのアプリケーションは、シンプルなBladeテンプレートを使い、この方法でフロントエンドを構築するのが、最も適していると思われます。
なるほど、昔ながらのHttpRequestに対してページ全体をブラウザ側で再描画するってことですね。
SPA(Single Page Application)とかも流行りらしいですが、まずはシンプルなWebアプリの作り方を学ぶことにします。



高まる期待

しかし、Webアプリケーションに対するユーザーの期待値が高まるにつれ、多くの開発者がよりダイナミックなフロントエンドを構築し、洗練した操作性を感じてもらう必要性を感じてきています。そのため、VueやReactといったJavaScriptフレームワークを用いた、アプリケーションのフロントエンド構築を選択する開発者もいます。

一方で、自分が使い慣れたバックエンド言語にこだわる人たちは、そのバックエンド言語を主に利用しながら、最新のWebアプリケーションUIの構築を可能にするソリューションを開発しました。たとえば、Rails のエコシステムでは、Turbo や[Hotwire]、Stimulus などのライブラリ作成が勢いづいています。

Laravelのエコシステムでは、主にPHPを使い、モダンでダイナミックなフロントエンドを作りたいというニーズから、Laravel LivewireAlpine.jsが生まれました。


うーん、良く分からないです。
 
Laravelに慣れていない方は、ビューBladeの基本的な使い方に、まず慣れることをお勧めします。その後、公式のLaravel Livewireドキュメントを参照し、インタラクティブなLivewireコンポーネントでアプリケーションを次のレベルに引き上げる方法を学んでください。
ということでまずは従来通りの開発の方法を学ぶことにします。

2.VueやReactを使う

LaravelやLivewireを使用してモダンなフロントエンドを構築することは可能ですが、多くの開発者はVueやReactなどのJavaScriptフレームワークのパワーを活用することをまだ好んでいます。このため、開発者はNPMを使い、利用可能なJavaScriptパッケージやツールの豊富なエコシステムを活用できます。
ふむふむ

しかし、LaravelとVueやReactを組み合わせるには、クライアントサイドのルーティング、データハイドレーション、認証など、様々な複雑な問題を解決する必要があり、追加のツールがなければLaravelを使うことはできません。クライアントサイドのルーティングは、NuxtNextなど主義的なVue/Reactフレームワークを取り入れて簡素化されていることが多いですが、Laravelなどのバックエンドフレームワークとこれらのフレームワークを組み合わせる場合、データのハイドレートと認証で、複雑で面倒な問題が残ります。

さらに、開発者は2つの別々のコードリポジトリを管理することになり、しばしばメンテナンス、リリース、デプロイメントを両方のリポジトリにまたがって調整する必要が起きます。こうした問題は克服できないものではありませんが、アプリケーションを開発する上で、生産的で楽しい方法とは思えません。

うーん、めんどくさいですね。

Inertia

幸運にも、Laravelは両方の世界の最良を提供しています。Inertiaは、LaravelアプリケーションとモダンなVueまたはReactフロントエンドの間のギャップを埋めるもので、VueやReactを使って本格的でモダンなフロントエンドを構築しながら、ルーティング、データハイドレート、認証にLaravelルートとコントローラを活用できます。すべて単一のコードリポジトリ内で行えます。このアプローチではどちらのツールの能力も損なうことなく、LaravelとVue/Reactの両能力を享受することができます。

また新しい機能が出てきました。

アセットの結合

BladeとLivewire、Vue/ReactとInertiaのどちらを使用してフロントエンドを開発するにしても、アプリケーションのCSSをプロダクション用アセットへバンドルする必要があるでしょう。もちろん、VueやReactでアプリケーションのフロントエンドを構築することを選択した場合は、コンポーネントをブラウザ用JavaScriptアセットへバンドルする必要があります。

Laravelは、デフォルトでViteを利用してアセットをバンドルします。Viteは、ローカル開発において、ビルドが非常に速く、ほぼ瞬時のホットモジュール交換(HMR)を提供しています。

今度はViteですか、これも知らないですね。

とりあえずメモっておいて、後で時間があったらキャッチアップすることにします。

 

 

0 件のコメント:

コメントを投稿

Laravel再学習

フロントエンド系の方に興味が行っていましたがまたバックエンド系に戻ってきました。 Laravelです。 かなり忘れてます、自分のブログを見ながらもう一度です。 今回はMVCパターン、そして Eloquentを使えるようになるのが目的です。 まずはプロジェクト作成から 1. Com...