ページビューの合計

2023年2月24日金曜日

React.jsに関して

さきほどReact.jsに関するYoutube動画に関して投稿しました。

React.jsについては以前の会社で導入したことがありました。
と言っても私ではなくその当時のブランチマネージャが導入を決めて簡単な機能から実装して試してから本番プロジェクトでも適用するようにしたようです。
2016年ごろですから、彼は先見の明があったのでしょう。
(React.jsがオープンソースとして発表されたのは2013年)
 
改めてReact.jsとは何かと調べ直してみました。

 
上記に記事にもあるようにReact.jsはフレームワークではなくJavaScriptライブラリであるということですね。
またUI(ユーザーインターフェース)の作成に特化しているということです。 
 
フレームワークだと1つのエコシステムになっているので改変したり他のものを組み込むのは難しいでしょう。
それがライブラリであれば比較的自由に自分の開発環境に組み込むことができるのでしょう。

例えばLaravelではViewはBladeと呼ばれるテンプレートエンジンを使っています。
そこを置き換えあるいは組み込むことが比較的容易なのだと思います。
 
日本語のチュートリアルもあります。

React.js開発当時のFacebook社内の評価を振り返る

当初はFacebook社内でもオープンソース化後も評価が悪かったようですね。
それでも一定の評価を受けるようになってブレイクしたようです。

React.js開発当初、「そんなものが使えるはずがない」とFacebook社内で評価されていた。React.jsの開発経緯を振り返る「React.js: The Documentary」YouTube公開

Youtubeの動画はこちら

日本語字幕は付いていません。
英語字幕から日本語へ機械翻訳を行えば大体理解できると思います。 



PHP8.2のリリース

PHPの8.2がリリースされたようです。

1年ぶりにリリースしたPHP 8.2──気になる新機能は? 型やクラス定義の強化ポイントも解説 

PHPの本家からダウンロードできます。

リリースノートによると2023年2月14日のリリースだったようです。

色んなデータ型のサポートなど機能追加がされていますね。


2023年2月23日木曜日

Laravle: サービスコンテナ

 サービスコンテナ

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

 

イントロダクション

Laravelサービスコンテナは、クラスの依存関係を管理し、依存注入を実行するための強力なツールです。依存の注入は、本質的にこれを意味する派手なフレーズです。クラスの依存は、コンストラクターまたは場合によっては「セッター」メソッドを介してクラスに「注入」されます。
ん?
依存注入って言うとDI(Dependency Injection)のことですかね?
以前、BEAR.SundayというPHPフレームワークでDIのことは初めて知った気がします。
 
 AというクラスがBというクラスを使うときにAの内部でBをインスタンス化せずに外部からBのインスタンスを受け取って(コンストラクタあるいはセッター)内部の変数に格納しておくというものだったはず。
そしてどのクラスをインスタンス化を知っていて実際にインスタンス化して注入する(といってもコンストラクタを呼ぶとかセッターを呼ぶだけ) 役割がDIコンテナだったかな?
 
 
だいたい合ってそうです。
 
サンプルのソースコードでは、UserRepository $usersをコンストラクタで受け取って内部変数に格納しています。
そしてshow()メソッドで受け取ったパラメータ$idを使って検索した結果をビューに渡してリターンしています。
$usersオブジェクトの中で$idに一致するものを検索して返すんでしょうね。
 
 
 
 

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ですか、これも知らないですね。

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

 

 

2023年2月21日火曜日

Laravel: ディレクトリ構成 app

appディレクトリ

appディレクトリは、アプリケーションのコアコードを配置します。このフォルダの詳細は、この後に説明します。

https://readouble.com/laravel/9.x/ja/structure.html

となっています。

重要なので別記事で書いておくことにします。

アプリケーションの主要な部分は、appディレクトリ内に配置します。このディレクトリはデフォルトで、App名前空間のもとに置かれており、PSR-4オートローディング規約を使い、Composerがオートロードしています。
サブディレクトリは以下の5つです。

  • Console
  • Exceptions
  • Http
  • Models
  • Providers  

重要なのはHttpでしょうね。

Httpディレクトリはコントローラやフィルター、リクエストにより構成されています。

クラス生成のためのmake Artisanコマンドを使用することで、さまざまなディレクトリがappディレクトリ内に作成されます。たとえば、app/Jobsディレクトリは、ジョブクラスを生成するmake:job Artisanコマンドを実行するまで存在していません。

ああ、あくまで初期状態では全てのディレクトリが存在するわけではなく、必要に応じてArtisanコマンドで生成するんですね。

使用可能なコマンドを確認するには、php artisan list makeを実行すれば良いそうです。以下を参照して下さい。

Available commands for the "make" namespace:
  make:cast          Create a new custom Eloquent cast class
  make:channel       Create a new channel class
  make:command       Create a new Artisan command
  make:component     Create a new view component class
  make:controller    Create a new controller class
  make:event         Create a new event class
  make:exception     Create a new custom exception class
  make:factory       Create a new model factory
  make:job           Create a new job class
  make:listener      Create a new event listener class
  make:mail          Create a new email class
  make:middleware    Create a new middleware class
  make:migration     Create a new migration file
  make:model         Create a new Eloquent model class
  make:notification  Create a new notification class
  make:observer      Create a new observer class
  make:policy        Create a new policy class
  make:provider      Create a new service provider class
  make:request       Create a new form request class
  make:resource      Create a new resource
  make:rule          Create a new validation rule
  make:scope         Create a new scope class
  make:seeder        Create a new seeder class
  make:test          Create a new test class

 

最初から存在するディレクトリ

Consoleディレクトリ

 アプリケーションの全カスタムArtisanコマンドで構成します。これらのコマンドクラスはmake:commandコマンドにより生成されます。コンソールカーネルもこのディレクトリ内にあり、カスタムArtisanコマンドや、タスクのスケジュールを登録します。

 

Exceptionsディレクトリ 

アプリケーションの例外ハンドラで構成します。また、アプリケーションから投げる例外を用意するにも適した場所でしょう。例外のログやレンダ方法をカスタマイズしたい場合は、このディレクトリのHandlerクラスを修正してください。

 

Httpディレクトリ 

コントローラ、ミドルウェア、フォームリクエストを設置します。アプリケーションへのリクエストを処理するロジックは、ほぼすべてこのディレクトリ内に設置します。

 

Modelsディレクトリ 

すべてのEloquentモデルクラスを設置します。Laravelが提供するEloquent ORMは、データベースを操作するための美しくシンプルなActiveRecordの実装を提供しています。各データベーステーブルには、そのテーブル操作に使う対応する「モデル」があります。モデルを使用し、テーブル内のデータをクエリしたり、テーブルに新しいレコードを挿入したりできます。

 

Providersディレクトリ

アプリケーションの全サービスプロバイダにより構成します。サービスプロバイダは、サービスをコンテナと結合、イベントの登録、もしくはアプリケーションへやってくるリクエストを処理するために必要な用意をするタスクを実行するなど、アプリケーションの事前準備を行います。

インストール直後のアプリケーションでも、このディレクトリは多くのプロパイダーを含んでいます。必要に応じて、自分のプロバイダを自由に追加してください。

 

Artisanコマンドで生成するディレクトリ

Broadcastingディレクトリ

アプリケーションの全ブロードキャストチャンネルクラスで構成します。これらのクラスは、make:channelコマンドで生成されます。このディレクトリはデフォルトでは存在しませんが、最初にチャンネルを生成したときに作成されます。チャンネルについての詳細は、イベントブロードキャストのドキュメントで確認してください。

 

Eventsディレクトリ
 
event:generatemake:event Artisanコマンド実行時に作成されます。Eventsディレクトリは、イベントクラスを設置する場所です。イベントは特定のアクションが起きたことをアプリケーションの別の部分へ知らせるために使われ、柔軟性と分離性を提供しています。
 
Jobsディレクトリ
 
make:job Artisanコマンドを実行すると作成されます。Jobsディレクトリはアプリケーションのキュー投入可能なジョブを置いておく場所です。Jobsはアプリケーションによりキューに投入されるか、もしくは現在のリクエストサイクル中に同期的に実行されます。現在のリクエストサイクル中に同期的に実行するジョブは、コマンドパターンを実装しているため、時に「コマンド」と呼ばれることがあります。


Listenersディレクトリ
 
event:generatemake:listener Artisanコマンドを実行すると、作成されます。Listenersディレクトリには、eventsイベントを処理するクラスを設置します。イベントリスナはイベントインスタンスを受け取り、発行されたイベントへ対応するロジックを実行します。たとえば、UserRegistered(ユーザー登録)イベントは、SendWelcomeEmail(ウェルカムメール送信)リスナにより処理されることになるでしょう。
 
 
Mailディレクトリ
 
make:mail Artisanコマンドを実行すると作成されます。Mailディレクトリには、アプリケーションから送信されるすべてのメールを表すクラスを設置します。メールオブジェクトを使用すると、メールを作成するすべてのロジックを、Mail::sendメソッドを使用して送信できる単一の単純なクラスにカプセル化できます。 
 
 
Notificationsディレクトリ
 
make:notification Artisanコマンドを実行すると作成されます。Notificationsディレクトリには、アプリケーション内で発生するイベントに関する簡単な通知など、アプリケーションが送信するすべての「トランザクション」的な通知を設置します。Laravelの通知機能は、電子メール、Slack、SMSなどのさまざまなドライバを介して通知を送信したり、データベースに保存したりすることを抽象化しています。
 
 
Policiesディレクトリ
 
make:policy Artisanコマンドを実行すると作成されます。Policiesディレクトリには、アプリケーションの認可ポリシークラスを設置します。ポリシーは、ユーザーがリソースに対して特定のアクションを実行できるかどうかを判断するために使用されます。
 
 
Rulesディレクトリ
 
make:rule Artisanコマンドを実行すると、作成されます。Rulesディレクトリは、アプリケーションが使用するバリデーションルールオブジェクトで構成します。ルールは複雑なバリデーションロジックをシンプルなオブジェクトへカプセル化するために使用します。詳細は、バリデーションのドキュメントで確認してください。

 

ずいぶんとたくさんのディレクトリがありますね。

とりあえずMVCに関連するところから始めて、徐々に理解していくことにします。


2023年2月20日月曜日

Laravel: ディレクトリ構成

ディレクトリ構成

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


Laravelのデフォルトアプリケーション構造はアプリケーションの大小にかかわらず、素晴らしいスタートを切ってもらえることを意図しています。アプリケーションは皆さんのお好みに応じ、自由に体系立ててください。クラスがComposerによりオートローディングできるならば、Laravelはクラスをどこに配置するか強制することはまずありません。

だそうです。

以下のようなフォルダがプロジェクトの配下に存在します。

重要そうなディレクトリに★を付けてみました。

 

appディレクトリ★★★

アプリケーションのコアコードを配置します。アプリケーションのほとんど全部のクラスは、このディレクトリの中に設定されることを覚えておいてください。

だそうです。さらに以下のサブディレクトリがあります。

  • Console
  • Exceptions
  • Http
  • Models
  • Providers 

 

bootstrapディレクトリ

フレームワークを初期起動処理するapp.phpファイルを設置しています。このディレクトリには、ルートやサービスのキャッシュファイルなど、パフォーマンスを最適化するためのフレームワークで生成されたファイルを含むcacheディレクトリも含んでいます。通常、このディレクトリ内のファイルを変更する必要はありません。

だそうです。app.phpは以前ちらっとLaravelアプリの起動してるところを追っかけたときに見た気がしますが、とりあえず今後は放置ということで。

 

configディレクトリ★

名前が示す通り、アプリケーションの全設定ファイルを設置しています。全ファイルに目を通し、設定可能なオプションに慣れ親しんでおくのは良い考えでしょう。

色んな設定項目があるのでざっと見ておくとよさそうです。 


databaseディレクトリ★★

データベースのマイグレーションとモデルファクトリ、初期値設定(シーディング)を配置しています。

 開発当初のDB構築や開発中のテーブル追加、構造変更などで使いそうですね。

 

langディレクトリ★★

アプリケーションのすべての言語ファイルを格納します。

 メッセージやラベルの多言語化などで使いそうですね。

デフォルトだと"en"というサブディレクトリにファイルが置いてあります。言語毎にサブディレクトリを作ってファイルを置くのでしょう。

 

publicディレクトリ★★★

アプリケーションへの全リクエストの入り口となり、オートローディングを設定するindex.phpファイルがあります。また、このディレクトリにはアセット(画像、JavaScript、CSSなど)を配置します。

ここが外部に公開されているフォルダでしたね。

resourcesディレクトリ★★★

ビューや、CSS、JavaScriptなどのコンパイルしていない、素のアセットを格納します。
 
?publicフォルダにもCSS, JavaSciptも置くようだけどresourcesと何が違うんだろう?
ビューはとても重要な要素ですね。以下に説明があります。
 

routesディレクトリ★★★

アプリケーションのすべてのルート定義を配置しています。デフォルトでルートファイルをいくつかLaravelは用意しています。web.php、api.php、console.php、channels.php。
 
Webアプリを開発するのであれば一番重要なのはweb.phpでしょうね。以下が説明になります。
 
web.phpファイルは、RouteServiceProviderwebミドルウェアグループへ配置するルートを記述します。これにより、セッション状態、CSRF保護、およびクッキー暗号化が提供されます。アプリケーションがステートレスのRESTful APIを提供しない場合は、すべてのルートがweb.phpファイルでほぼ定義されるでしょう。


storageディレクトリ

ログ、コンパイル済みBladeテンプレート、ファイルベースのセッション、ファイルキャッシュ、およびフレームワークが作成したその他のファイルが含まれます。

このディレクトリは、appframeworklogsディレクトリに分離されています。appディレクトリは、アプリケーションが作成したファイルを保存するために使用できます。frameworkディレクトリは、フレームワークが作成したファイルとキャッシュを保存するために使用します。最後に、logsディレクトリにはアプリケーションのログファイルを保存しています。

確かアプリがアップロードしたファイルがstorage\app\publicに保存されるんじゃなかったかな?

storage/app/publicディレクトリは、プロファイルアバターなど、一般にアクセス可能である必要のあるユーザー生成ファイルを保存するために使用します。このディレクトリを指すシンボリックリンクをpublic/storageに作成する必要があります。php artisan storage:link Artisanコマンドを使用してリンクを作成できます。 

シンボリックリンクって思いっきりUNIX(Linux) 系なんだけどWindowsでもできるのかな?

プロジェクトファイルのpublicの下でコマンドを実行してみます。
エラーになりました。どうやらディレクトリが間違っているようです。
プロジェクトファイルの直下で実行すると成功しました。

C:\xampp\htdocs\example-app\public> php artisan storage:link
Could not open input file: artisan
C:\xampp\htdocs\example-app\public> cd ..
C:\xampp\htdocs\example-app> php artisan storage:link

   INFO  The [C:\xampp\htdocs\example-app\public\storage] link has been connected to [C:\xampp\htdocs\example-app\storage\app/public].
   

VSCodeのターミナルで見てみると

d----l という属性でstorageというディレクトリが出来ています。

$echo AAA > test.txt

とか適当にファイルを作ってみると

  • public\storage\test.txt
  • storage\app\public\test.txt

同じものができますね。

コマンドラインでDIRを実行すると<JUNCTION>という謎の表示とstrageの後に絶対パスで"C:\xampp\htdocs\example-app\storage\app\public"と表示されています。

 

ググるとすぐに見つかりました。へーWindowsにそんな機能があるんですね。

Windowsのジャンクション、ハードリンク、シンボリックリンクの違いについて解説

ジャンクション + ハードリンク = シンボリックリンク

だそうです。

Windowsのジャンクション(junction)とシンボリックリンク(symblic link)違い

 ジャンクションの方が一般ユーザ権限で使えて簡単そうです。その代わりファイルへのリンクが出来ない、ネットワーク先へのリンクへが出来ないという制限がありますが、こういった用途であれば十分でしょう。

ログに関して

storage\logs\laravel.logにログがガンガン溜まっていきますね。

適当に消したいところです。良いサイトがあったので下にリンクを張っておきます。

Laravelのログを日別でローテーションさせる( +自動削除 )

config\logging.phpに設定項目があります。

    'default' => env('LOG_CHANNEL', 'stack'),
        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => env('LOG_LEVEL', 'debug'),
            'days' => 14,
        ],

デフォルトではstackになっているのでこれをdailyに変えます。

またdailyの中に'days'という項目があります。これで保存期間の設定ができるようです。

 

testsディレクトリ

自動テストを設置します。たとえば、PHPUnitユニットテストと機能テストは、はじめから提供されています。各テストクラスには、Testという接尾辞を付ける必要があります。phpunitまたはphpvendor/bin/phpunitコマンドを使用してテストを実行できます。または、テスト結果をより詳細で美しい表現にしたい場合は、php artisan test Artisanコマンドを使用してテストを実行してください。
 
Unitテスト関連のファイルはここに置くようです。
 

vendorディレクトリ

Composerによる依存パッケージが配置されます。
 
アプリケーションで使うパッケージが保存されるディレクトリですね。
ディレクトリを見ると山ほどサブディレクトリとファイルがありますね。
サイズは57.5MB、けっこうありますね。
 
これってGitで管理したら大変だろうなと思ってぐぐったら、vendorディレクトリはGitで管理するなだそうです。
 
 
composer.jsonとcomposer.lockをGitで管理しておいて、composer installを実行するのがよさそうです。
 
composer update ではなく composer install を使った方がいいですね。

ざっくり言うと、前者は依存パッケージの最新バージョンをその場で探してインストールするのに対し、後者は composer.lock に記録されたバージョンをインストールします。こうすることで、開発環境と完全に一致したバージョンをインストールすることを保証します。
 
 
  • composer.json:必要とするライブラリの種類と、必要なバージョンの条件が記載
  • composer.lock:ライブラリをローカル環境でインストールしたときに、実際にインストールされたライブラリの種類とそれぞれのバージョンが記載
composer.lockがあれば実際にインストールされたライブラリとバージョンが分かるようです。
であればGitと同じものがローカルで再現できるようですね。
 
なので
  • Gitを使わず、vendor以下も含めて丸ごとアーカイブしてコピーするか
  • Gitを使って、composer.jsonとcomposer.lockを共有してcomposer installを実行して同じものを再現するか
の二択ですかね。
 
これでプロジェクトフォルダの直下にあるディレクリの構造がある程度わかりました。
 

Laravel: Laravel 10がリリース

 Laravel 10が2023年2月14日にリリースされたそうです。

 Laravel10リリース!新機能・変更点・注意点10個ご紹介

にまとまっています。

  1.  Laravel10はPHP8.1以上が必要 【重要度★★★】
  2. ひな形ファイルに型宣言が追加【重要度★★★】
  3. 型を宣言しないとどうなるのか?
  4. Makeコマンドにおせっかい機能が搭載【重要度★★】
  5. Invocableバリデーションルールがデフォルトに【重要度★★】
  6. Processファサードの追加【重要度★★】
  7. Laravel Pennant【重要度 ★★】
  8. Testにprofileオプション追加【重要度★★】
  9. パスワード作成【重要度★★】
  10. HorizonとTelescopeのデザインが変わった【重要度★】
  11. Laravel9での非推奨メソッドを除外【重要度★】

 



2023年2月17日金曜日

Laravel: 独自設定を読み込む

またENVネタです。

キャッシュは

  • 本番環境では高速のため実行すべき
  • 開発環境では頻繁に変わる可能性があるので実行すべきではない

とのことでした。
とは言ってもいざ本番環境でエラーになることがないように開発環境でもどこかのタイミングで実行はして確認しておくのが良いでしょう。

ただ設定のキャッシュって結局はプロジェクトフォルダ\bootstrap\cach\config.phpを作ってるだけで別にメモリ上にあるわけでもなさそうです。
そんなに効果あるんだろうか?と思いました。

少し古い版ですが高速化検証した記事がありました。
Laravel 5.6の高速化検証・artisanコマンド3つのキャッシュ

実行時間が30%ほども少なくなりましたとのことです。
意外と効果ありますね。本番環境では実行しておいた方が良いでしょう。
本番環境ではデプロイ時に自動的に実行するような仕組みを考えた方が良さそうです。

独自の設定項目

今回のネタはこっからです。
設定ファイルはアプリやプロジェクト独自の項目を設定することもあるはず。

手順的には

  1. .envに他と重複しないキーと設定値を書く
  2. configの下にファイルを追加して、そのファイルの中でenv()を使って値を取得するように実装する
  3. アプリからconfig()を使って値を取得する。


こんな感じでしょうか。

じゃ一覧画面のページネーションの数を設定できる感じにします。
.envで以下のように書いておきます。

  PAGINATION=50

configの下にmyconfig.phpというファイルを作って
内部でenv()を使って取得しておきます。
<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Pagination settings
    |--------------------------------------------------------------------------
    |
    | Here, set the number of items to be displayed on the screen of the list screen.
    |
    */

    'pagination' => env('PAGINATION', 10),

];
 
アプリからは以下のように$config_value = config('myconfig.pagination');
といった感じで値が参照できるはず。
    <body class="antialiased">
            <p>Test get original setting values</p>
            @php
                $env_value = env('PAGINATION', 'NotFound'); 
                $config_value = config('myconfig.pagination');
            @endphp
            <h1>DB_CONNECTION(env): {{ $env_value }}</h1>
            <h1>DB_CONNECTION(config): {{ $config_value }}</h1>
    </body>


想定した通りに値が取れてますね。

わざとキーを変えて存在しないものにすると、それぞれデフォルトを表示しています。


2023年2月16日木曜日

Laravel: .envの値はconfig()で取得する

ひとつ前のブログで.envのことを書きました。 
ただググっているとなんかenv()を使っちゃいけないって検索結果にヒットしたので確認しました。
ひとつ前のブログでは思いっきりenv()使って設定値を取得してました。


【Laravel】実装コード上で.envの値はconfig()で取得する

なんかめんどくさい。
config()経由で取得しろって、別にenv()で良いじゃんって思いましたが
config:cacheを実行した環境だとNULLが帰ってくるらしいです。
$ php artisan config:cache

config/*.phpの情報は取得できるのですが、
.envの情報は秘匿され、取得することができません。
え?それってキャッシュじゃないじゃん。
隠すなよ。
キャッシュされてるので、.envを変更してもキャッシュの方を読みますならわかる。

解決方法
では、どうすればよいのか。
それは、configディレクトリに新たなファイルを作成し、
そのファイル内でenv()をコールして、
.envの情報をconfigに持たせることです。

これにより、config()で取得することができます。
えー、いちいちそんなことすんのと思ったら既にありました。
プロジェクトルートの下のconfigの下にたくさんのPHPファイルがあります。

例えばdatabase.phpの中で
'default' => env('DB_CONNECTION', 'mysql'),

というようにdefautのDBコネクションをenvを使って取得しています。

なので
$default_connection = config('database.default');

とすれば良さそうです。

簡単にソースコードを書いて試してみます。

同じものをenv()とconfig()を使って取得して表示するだけです。

    <body class="antialiased">
            <p>Test env and config</p>
            @php
                $env_value = env('DB_CONNECTION', 'NotFound'); 
                $config_value = config('database.default');
            @endphp
            <h1>DB_CONNECTION(env): {{ $env_value }}</h1>
            <h1>DB_CONNECTION(config): {{ $config_value }}</h1>
    </body>

 

1. キャッシュを実行する前

env()でもconfig()でも同じものを表示します。


【Laravel】開発環境では「php artisan config:cache」をするべきではない 

  $ php artisan config:cache

   INFO  Configuration cached successfully.

確かにキャッシュを実行すると
プロジェクトフォルダ\bootstrap\cach\config.php
が生成されて中に設定が格納されています。
 
キャッシュ実行後の\bootstrap\cach


そしてこの状態でenvでデータを取得しようとするとキーが見つかりませんね。
config経由だと問題ありません。


でこの状態で.envの値を修正してもキャッシュには反映されないと。

DB_CONNECTION=Production2

なので、この状態では2択

  1. php artisan config:cacheを実行してキャッシュに.envの内容を反映させる。
  2. php artisan config:clearを実行してキャッシュを消して.envの方をみるようにする。

順にやってみます。

1.もう一度キャッシュコマンドを実行する

  $ php artisan config:cache

   INFO  Configuration cached successfully.

想定通り、修正した.envの内容を表示していますね(キャッシュに反映している)。


2.キャッシュを消す

.envの内容を再度変更して

DB_CONNECTION=Production3

キャッシュを消す

  $ php artisan config:clear

   INFO Configuration cache cleared successfully. 

 

想定通り.envの内容を表示していますね。

キャッシュが消えたのでenv()でも問題なく表示できています。


ということで今回のまとめとしては

  1. .envの設定を参照する場合はconfig()を使う
  2. 開発環境でキャッシュコマンドは実行しない
  3. 本番環境でキャッシュコマンドを実行すべき。ただ実行忘れを防止するためにデプロイ時に自動的に実行するような仕組みにしておくと良い。

くらいですかね。以下のサイトが良くまとまっています。

 【Laravel】.envとphp artisan config:cacheを正しく理解する

 

Laravle: .envの扱いに関して

https://readouble.com/laravel/9.x/ja/configuration.html
設定を読んでいましたが環境ファイルのところは重要なので別にすることにしました。

.envの扱いに関して

ぐぐってたら、プチ炎上してるの掲示板を見つけました。
https://teratail.com/questions/l9i2i08pzhw12p

.envの後ろに付ける修飾子は

  • local
  • production
  • testing

というキーワードでもう決まっているようです。
なので
.env.local
.env.production
.env.testing
という名前でENVファイルを作れば良いのでしょう。

プロジェクトを生成した場合はプロジェクトのルートフォルダに「.env」と「.env.example」
というファイルがあり、中身は全くの同一です。

実際のプロジェクトを想定して、
.env  本番用の設定でGitで管理する
.env.local 開発用の設定でGitで管理しない

というようにシンプルにできないかと思います。
https://kaki-engine.com/laravel-env-file-referenced/
このサイトの案3のような感じ。

上記の掲示板で言及されているように既にフレームワークにある機能を自分で実装する必要はないでしょう。

公式マニュアルによると

追加の環境ファイル
アプリケーションの環境変数を読み込む前に、LaravelはAPP_ENV環境変数が外部から提供されているか、もしくは--env CLI引数が指定されているかを判断します。
その場合、Laravelは.env.[APP_ENV]ファイルが存在すれば、それを読み込もうとします。存在しない場合は、デフォルトの.envファイルを読み込みます。
デフォルトが「.env」で環境変数「APP_ENV」にマッチしたものが存在すればそれを読み込むようです。


確かにLoadEnvironmentVariables.phpの中で環境変数"APP_ENV"とマッチする設定ファイルをロードしていますね。

  1. --env CLI引数が指定されていれば該当するものを読み込む
  2. APP_ENVが指定されていなければリターン(デフォルトを使用)
  3. APP_ENVが指定されていれば該当するものを読み込む


なので
.envを.env.localにコピー
.env.localの内容を編集
.env.localはGitで管理しないようにする(.gitignoreに書く)
環境変数APP_ENVに"local"を設定する
という感じにすれば、ローカル用の設定を別ファイルにしつつ間違って本番環境を壊したりしなくすむでしょう。

簡単にアプリを作ってみます。
envを使って.envの内容を表示するものです。

    <body class="antialiased">
            <p>Check env</p>
            @php
                $value = env('DB_CONNECTION', 'NotFound'); 
            @endphp
            <h1>DB_CONNECTION(env): {{ $value }}</h1>
    </body>
.env
DB_CONNECTION=Production
.env.local
DB_CONNECTION=local

 

以下の4パターン

1..envのみで環境変数APP_ENVは設定しない
本番用の.envが読み込まれるはず:OK

2..envと.env.localがあるが環境変数APP_ENVは設定しない
本番用の.envが読み込まれるはず:OK

3..envと.env.localがあり環境変数APP_ENVに"local"を設定する
ローカル用の.env.localが読み込まれるはず:NG

あれ?変わらない。
PCリブートしました。 
その後だと.env.localの方を読み込みましたね。
環境変数の設定だけではダメらしいです。


4..envのみがあり環境変数APP_ENVに"local"を設定する
環境変数は設定されているが.env.localはないので.envが読み込まれるはず:OK

ということで3.のパターンでやればOKっぽいですね。

Bloggerでソースコードを綺麗に表示する。

 Web系のブログなのでソースコードをブログ上に貼ることがあります。
ただテキストだと味気ないしフォーマットができない、いちいちスクショを撮って貼るのもめんどくさい。

そういえば他の人のブログでソースコードを綺麗に表示してるのを見かけたのでググってみるとあっさり見つかりました。

Google-code-prettifyというのがあるそうです。

https://www.note65536.com/2020/08/blogger.html
ここに書いてある通りです。

ブログのレイアウトでガジェットを追加して以下をコンテンツ欄に張ります。
<script src='https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=sons-of-obsidian'/></script>



skin=に設定することで見た目をいろいろ変えれるようです。

指定したときの見た目はここを参照して下さい。

  • desert
  • sunburst
  • sons-of-obsidian
  • doxy
全行に行番号を表示するときは、”sons-of-obsidian”じゃないとダメみたいです。
それ以外のスタイルは5行毎に行番号が表示されます。 

ソースコードが横に長い場合は以下のようにすれば横スクロールを付けれます。
style="overflow:auto; overflow-y:hidden;"

後はHTMLビューに切り替えてpreタグで書くだけ

ただし"<" ">"などは直接書けなくて&lt;とか&gt;にしないとだめらしいです。

クラスはprettyprint、言語はlang-xxxx、行番号を表示するにはlinenumsで行番号を指定したいときはコロン:で区切って指定します。

使える言語指定は以下に詳細があります。
http://www.yamamo10.jp/yamamoto/internet/WEB/regulation/GCP/index.php

サンプル
<pre class="prettyprint lang-html linenums:252">
DocumentRoot "C:/xampp/htdocs"<br />&lt;Directory "C:/xampp/htdocs"&gt;
</pre>

<pre class="prettyprint lang-html linenums:252">
DocumentRoot "C:/xampp/htdocs/example-app/public"<br />&lt;Directory "C:/xampp/htdocs/example-app/public"&gt;
</pre>

実際の画面では以下のように表示されます。

もう本当はもう少し明るい色調が好きですが、変えるにはCSSをいじらないといけないようです。

とりあえずこのままでいきます。

 

2023年2月14日火曜日

Laravel: URLからpublicを除外する

 Laravelはプロジェクトの配下のpublicが公開フォルダと決まっているそうです。
なのでブラウザでアクセスするときにURLにpublicを付けないといけません。
http://localhost/example-app/public/

ただこれってどうもカッコ悪いですね。
ぐぐったら削除する方法がいくつかヒットしました。

https://wynes.info/techblog/archives/5250

やり方としては以下の3つ    

  1. ウェブサーバーの設定でドキュメントルートを設定する
  2. .htaccessを作成して設置する
  3. Laravelのディレクトリを移動してシンボリックリンクを張る


(1) ウェブサーバーの設定でドキュメントルートを設定する

ドキュメントルート自体を"example-app/public/"に設定します。
http://localhost
にアクセスするだけでアプリケーションにアクセスできます。

レンタルサーバなどでドキュメントルートが変更できない場合があります。
そうでなければドキュメントルートを変えてやるのが一番お手軽のようです。

C:\xampp\apache\conf\httpd.confを編集します。

252,253行に設定があります。

DocumentRoot "C:/xampp/htdocs"
<Directory "C:/xampp/htdocs">

DocumentRoot "C:/xampp/htdocs/example-app/public"
<Directory "C:/xampp/htdocs/example-app/public">
Apacheが起動している場合は再起動します。

http://localhost/
だけでLaravelアプリケーションが起動しました。


(2) .htaccessを作成して設置する

これなんですが、参照したサイトが古いみたいですね。
RewriteRule ^ server.php
とありますがpublicフォルダの下にserver.phpなんてありません。

【Laravel 9対応】URLからpublicをなくす
https://zakkuri.life/laravel-remove-public-from-url/

というサイトがLaravel 9に対応した内容が書いてありました。

サーバのルート直下と/publicの下にそれぞれ.htaccessを置けば良いらしい。

まずは最初にやったC:\xampp\apache\conf\httpd.confの編集を元に戻す。

C:/xampp/htdocs/example-appの下に以下の内容の".htaccess"を置く

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteRule ^(.*)$ public/$1 [L]
</IfModule>
色々やったんですが結局ダメでした。
404エラーになってhttp://localhost/example-app/ではアクセスできません。

これ以上は無理っぽいので一旦ここで止めます。

2023年2月13日月曜日

Laravel: 設定

設定

公式ドキュメントにしたがって順番に読んでいきます。
 

イントロダクション

Laravelフレームワークの全設定ファイルは、configディレクトリに保存されています。各オプションには詳しいコメントが付いているので、各ファイルを一読し、使用できるオプションを把握しておきましょう。

これら設定ファイルを使用すると、データベース接続情報、メールサーバ情報、およびアプリケーションのタイムゾーンや暗号化キーなどの他のさまざまなコア設定値などを設定できます。

 なるほど、config以下に様々な設定ファイルがありますね。


アプリケーションの概要

php artisan about
このコマンドで以下のセクションに関する現在の設定値が分かるようです。
Environment
Cache
Drivers
 
特定のセクションのみを表示させたい場合は"--only="オプションを付ければ良いそうです。
php artisan about --only=environment 

 

環境設定

ENV関連は別ブログにて記述しました。 

アプリケーションを使用する開発者/サーバごとに異なる環境設定が必要になる可能性があるため、.envファイルをアプリケーションのソース管理にコミットしないでください。さらに、機密性の高い資格情報が公開されるため、侵入者がソース管理リポジトリにアクセスした場合のセキュリティリスクになります。

しかしながら、Laravelの組み込みの環境の暗号化を使用して、環境ファイルを暗号化することも可能です。暗号化した環境ファイルは、安全にソース管理下に置けます。

 

そうなのか、でもそうするとどうやって.envファイルを管理、実環境にデプロイするんだろう?

環境の暗号化をすることで守られるけど、暗号化時のキーが複合化時に必要なので結局キーをどう管理するのかってことになりそうです。

 

2023年2月10日金曜日

Laravel: リクエストのライフサイクル

リクエストのライフサイクル

https://readouble.com/laravel/9.x/ja/lifecycle.html 

公式ドキュメントにしたがって順番に読んでいきます。

最初はリクエストのライフサイクルです。

イントロダクション

このドキュメントの目的は、Laravelフレームワークがどのように機能するかについての概要を説明することです。フレームワーク全体をよりよく理解することで、すべてが「魔法」ではなくなり、アプリケーションの構築に自信が持てるようになります。

良いですね。以前も書いたように「習うより慣れよ」も大事ですがそれだといずれ行き詰まる気がするんですよね。

まずは俯瞰からフレームワークになにができるか、どんな構造なのか、どう機能するのかをまず概要レベルで知っておくことは大切だと思います。 

 

最初のステップ

Laravelアプリケーションへのすべてのリクエストのエントリポイントはpublic/index.phpファイルです。すべてのリクエストは、Webサーバ(Apache/Nginx)設定によってこのファイルに送信されます。
 
ふむ、以前もXAMPPで「http://localhost/example-app/public/」に対してアクセスしましたね。
 
エントリポイントとはOSやプログラムが最初に実行する場所を指すようです。
OSだとMBRでしょうし、C言語だとmain関数ですね。 

Laravelの場合はpublic/index.phpがエントリポイントになるようです。
 
index.phpファイルには多くのコードが含まれていません。むしろ、フレームワークの残りの部分をロードするための開始点と言えるでしょう。

index.phpファイルは、Composerで生成したオートローダー定義をロードし、Laravelアプリケーションのインスタンスをbootstrap/app.phpから取得します。Laravel自体が取る最初のアクションは、アプリケーション/サービスコンテナのインスタンスを作成することです。

 
 index.php自体はさらに多段でここから各種処理を呼びだすようです。
 確かに56行しかありません。
 
ざっと見ていきます。
8行目からメンテナンスモードに関する記述があります。
”/../storage/framework/maintenance.php”が存在するか確認していますね。
該当フォルダを探しましたが存在しませんでした。
 
 
メンテナンスモード
初めて聞きました、何でしょう?
 
この仕組みを使うと、運用中のシステムをメンテナンスする際に、一時的にユーザーをシステムにアクセスできないように制限することができます。
 
へえー、そんなことが出来るんですね。
じゃ実際にメンテナンスモードにしてみましょう。
 
まずは「http://localhost/example-app/public/」にアクセス
問題なく表示できます。
 

 
VSCodeでターミナルを開いて
php artisan downを実行します。

 
 
ブラウザで再度アクセスすると
503 Service Unavailable
と表示されます。

 確かにstorage/framework/maintenance.phpというファイルが生成されています。
 

maintenance.phpというファイルは79行ほどの短いファイルです。
同じフォルダの"down"というJSONファイルを読み込んで何かしてます。
 

php artisan upを実行します。
maintenance.phpとdownが削除されました。
その後は普通に画面が表示されます。 
(追記)
コマンドはドキュメントルートで実行しないとダメらしいです。
違うフォルダで実行すると
”Could not open input file: artisan”
というエラーメッセージが表示されました。
maintenance.phpのパスが多分固定なんでしょうね。
 
 
自作のメンテナンスページを表示する
さっきは503 Service Unavailableという味もそっけもないメッセージでした。
独自画面を表示できるみたいですね。
 
resources/views/errors/
の下に画面を置けば良いようです。
errorsフォルダはないので作って以下を置きます。
 

php artisan downコマンドに-renderオプションを付けて作成した503.blade.phpを指定します。
php artisan down --render="errors::503"

ブラウザでアクセスすると想定した画面が表示されます。

 

メンテナンス中でも特定のユーザーはアクセスできるようにする

そんなことができるんですね。
php artisan upで元に戻してから

php artisan down --secret="naisyo"
でメインテナンスモードしてから

http://localhost/example-app/public/naisyo
でアクセスしてみます。

http://localhost/example-app/public
にリダイレクトされて通常画面が表示されました。

downというJSONファイルを見てみると
"secret"にさきほど設定した値が格納されています。
こうやって制御しているんですね。

 


 

 ちょっと脱線しましたがソースコードに戻ります

 index.phpファイルは、Composerで生成したオートローダー定義をロードし、Laravelアプリケーションのインスタンスをbootstrap/app.phpから取得します。Laravel自体が取る最初のアクションは、アプリケーション/サービスコンテナのインスタンスを作成することです。
 
index.htmlでのautoloader.phpの要求

 
 /../vendor/autoload.phpを要求していますね。

オートローダを使うことで外部の機能を使うときにrequireを使ってファイルを指定する必要がなくなるそうです。
 
 最後に”/../bootstrap/app.php”を要求しています。
 
index.htmlでのアプリケーションインスタンスの取得

 
 Laravelのインスタンス作成
 Laravelインスタンスの実態は以下ですね。
vendor/laravel/framework/src/illuminate/Foundation/Application.php


 
app.phpでのApplicationのインスタンス生成部分
 
 
Laravelインスタンスに対してHttpとConsoleのKernelをバインドしています。
最後に例外ハンドラをバインドしていますね。

app.phpでの重要なインターフェースのバインド

HTTPカーネルのhandleメソッドの引数は非常に単純です。Requestを受け取り、Responseを返します。カーネルをアプリケーション全体を表す大きなブラックボックスであると考えてください。HTTPリクエストを取り込み、HTTPレスポンスを返します。
ふむふむKernelのhandleメソッドを見ると、受け取ったrequestに対してresponseを返していますね。
Illuminate\Foundation\Http\Kernel.phpのhandleメソッド

 

サービスプロバイダ

最も重要なカーネル初期起動処理アクションの1つは、アプリケーションのサービスプロバイダをロードすることです。サービスプロバイダは、データベース、キュー、検証、ルーティングコンポーネントなど、フレームワークのさまざまなコンポーネントをすべて初期起動する責務を担っています。

Laravelが提供する基本的なすべての主機能は、サービスプロバイダによって初期起動および設定されます。フレームワークによって提供される非常に多くの機能を初期起動し設定するため、サービスプロバイダはLaravel初期起動プロセス全体の最も重要な側面です。

と書いてあります。
ざっとソース見たけどサービスプロバイダーをロードしてるところが分かりませんでした。
とりあえず「サービスプロバイダ」によってLaravelの主な機能が提供されているとメモして次へ進みます。
 

ルート

アプリケーションで最も重要なサービスプロバイダの1つは、App\Providers\RouteServiceProviderです。このサービスプロバイダは、アプリケーションのroutesディレクトリ内に含まれるルートファイルをロードします。どうぞRouteServiceProviderコードを開いて解析し、それがどのように機能するかを確認してください!
とのことなので開いてみます。
が良く分かりません。これもスキップ

 
App\Providers\RouteServiceProvider.php

 
アプリケーションが初期起動され、すべてのサービスプロバイダが登録されると、Requestがルータに渡されてディスパッチされます。ルータは、ルートまたはコントローラへリクエストをディスパッチし、ルート固有のミドルウェアを実行します。

以下のような状態遷移ってことですな。
クライアントからHTTPリクエストを送る
アプリケーションが初期起動する
サービスプロバイダを登録する
HTTPリクエストをルータに渡す
ルート固有のミドルウエアを実行する
 
ミドルウエアとは
ミドルウェアは、アプリケーションに入るHTTPリクエストをフィルタリングまたは検査するための便利なメカニズムを提供しています。たとえば、Laravelには、アプリケーションのユーザーが認証されているかを確認するミドルウェアが含まれています。ユーザーが認証されていない場合、このミドルウェアはユーザーをログイン画面にリダイレクトします。そしてユーザーが認証されている場合、ミドルウェアはリクエストをアプリケーションへ進めることを許可します。

アプリケーションに入る前にHTTPリクエストを色々処理できる機能のようですね。
例としてユーザ認証が挙げられていますね。
例えばURLを直打ちした場合でもアプリケーションに入る時点で認証がされているかどうかを確認して、もし認証がされていなければログイン画面へリダイレクトするような機能を実装することだと思います。
 
リクエストが一致したルートへ割り当てられたすべてのミドルウェアをパスした場合は、ルートまたはコントローラメソッドが実行され、ルートまたはコントローラメソッドが返すレスポンスがルートのミドルウェアチェーンを介して返送されます。
 
多分こんな感じの流れかな?
クライアントからHTTPリクエストを送る
アプリケーションが初期起動する
サービスプロバイダを登録する
HTTPリクエストをルータに渡す
ルート固有のミドルウエアを実行する
ルートまたはコントローラメソッドを実行する
ルートまたはコントローラメソッドの結果を返す
ルート固有のミドルウエアの実行結果を返す
クライアントがHTTPレスポンスを受け取る
 

サービスプロバイダに注目

サービスプロバイダは、Laravelアプリケーションを初期起動するための真の鍵です。アプリケーションインスタンスが作成され、サービスプロバイダが登録され、リクエストが初期起動を終えたアプリケーションに渡されます。とても簡単です!
Laravelアプリケーションがどのように構築され、サービスプロバイダを介して初期起動されるかをしっかりと把握することは非常に価値があります。アプリケーションのデフォルトのサービスプロバイダは、app/Providersディレクトリに保存されます。

デフォルトのAppServiceProviderはほとんど空です。このプロバイダは、アプリケーション独自の初期起動処理およびサービスコンテナ結合を追加するのに最適な場所です。大規模なアプリケーションの場合、アプリケーションで使用する特定のサービスに対して、それぞれがよりきめ細かい初期処理を備えた複数のサービスプロバイダを作成することをお勧めします。
確かにAppServiceProvider.phpはスッカスカですね。
アプリケーション独自で機能を追加していくのでしょう。
 
app/Providers/AppServiceProvider.php

 
 

Laravel最初のプロジェクト

Laravelの開発始め

開発環境

以前書いたツールをインストールしておきます。
基本的に環境にあったインストーラをダウンロードして起動するだけです。
Dockerを使った方法もあるようですが、まずはWindows上に直接構築していきます。
開発環境は既にあるという前提です。

プロジェクトフォルダ
XAMPPが動作、デバッグ環境になります。以下がプロジェクトフォルダのトップになります。
この配下にプロジェクト名でフォルダを作っていきます。
C:\xampp\htdocs

https://readouble.com/laravel/9.x/ja/installation.html
これに従って現在最新のLaravel9系をインストールしてきます。

最初のLaravelプロジェクトを作成する前に、ローカルマシンにPHPとComposerをインストールしていることを確認してください。
とあります。PHPはXAMPPでインストール済なのでComposerをインストールします。

1.Composerのインストーラ

Composerは一般的には作曲家を指す言葉です。
PHPにおいては、パッケージやライブラリの依存管理ツールです。

なのでLinuxにおけるRPMやNode.jsにおけるnpmに相当するものだと思います。https://getcomposer.org/
2.5.2が最新のようです。
素直にインストーラをダウンロードして起動します。

 
Developer Modeとか意味不明のチェックボックスが表示されます。

これをチェックするとアンインストーラーがダウンロードされないようです。
なんかややこしい、デフォルトのままチェック無しで良いでしょう。

Nextボタンを押下します。
PHPのフォルダパスを自動的に補完してくれます。そのままNextボタンを押します。
C:\xampp\php\php.exe



?このままだとエラーになるので、Add This PHP to your path?にチェックを入れます。

Proxy Settings
別にProxyを経由してインターネットアクセスしてるわけではないのでそのままNextを押します。

Ready to Install
最終確認画面です、問題なければIntallボタンを押します。

インストールが開始されます。


インストールが完了します。


Nextボタンを押します。

セットアップが終わりました。
Finishボタンを押します。

終わったらコマンドプロンプトでcomposer -vを実行して以下のようになれば成功です。
Ver 2.5.2がインストールされていますね。

 

2.最初のLaravelプロジェクト

Composerの"create-project"コマンドで新規プロジェクトを作成します。
C:\xampp\htdocs の直下で以下のコマンドを実行します。

$ composer create-project laravel/laravel example-app

以下のエラーになりました。


どうもZIPコマンドがないって言ってるらしい。
Failed to download xxxx: The zip extension and unzip/7z commands are both missing, skipping
The php.ini used by your command-line PHP is: C:\xampp\php\php.ini

Ctrl + c連打でバッチを止める。
ついでにフォルダも削除

 
php.iniの952行が以下のようになっていました。
;extension=zip
コメントアウトを外します。

もう一度コマンドを実行します。
問題なくダウンロードが開始されます。


問題なくLaravelがインストールされました。

 

所定の場所にLaravel関連のフォルダとファイルが配置されたようです。



Laravelローカル開発サーバを起動してみます。
artisanていう機能でいろいろできるみたいですね。
artisan自体は職人という意味です。

$ cd example-app
$ php artisan serve

ローカルサーバが起動しました。Ctrl + Cを押せば止まるようです。



ブラウザでhttp://127.0.0.1:8000にアクセスしてみます。
Laravelの画面が表示されますね。
Laravel v9.51.0 (PHP v8.2.0) だそうです。

Ctrl + Cでローカルサーバを止めます。

次にXAMPPの環境です。
XAMPP Contral Panelを起動してApacheとMySQLを起動します。

http://localhost/example-app/public/にアクセスします。
同じ画面が表示されます。

 

LaravelとDocker

この章はさっくり飛ばします。
1点だけ、
LaravelではSailという、Dockerを使用してLaravelプロジェクトを実行する組み込みソリューションを提供しています。
Sailって名前はどっかで聞いたことがあります。
Dockerの開発環境を作るための仕組みのみたいですね。
以下が分かりやすいです。
https://biz.addisteria.com/00laravel_sail/

初期設定

Laravelフレームワークのすべての設定ファイルは、configディレクトリに格納されています。
とりあえずVSCodeでフォルダを開いてみます。


app.php
auth.php
:
:
view.php
までたくさんの設定ファイルがありますね。
 

「Laravelでは、初期の追加設定はほとんど必要ありません。すぐに開発を始められます。しかし、config/app.phpファイルとそのコメントを確認することをお勧めします。」
ということなので、config/app.phpだけはざっと見ておきます。

他で気になったのはdatabase.phpですね。
connectionというところに
sqlite
mysql
pgsql
sqlsrv
というエントリがあります。
それぞれのDB用の個別の設定項目です。
値自体はenvで取得するようです、”.envファイル"にキーと値で書いておくのでしょう。

.envに以下の設定がありました。
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

これを書き換えて実際のDBへのコネクションができるようになるはずです。
この辺はデータベースとマイグレーションのところに書いてありました。


次のステップ

「Laravelプロジェクトを設定し終えて、次に何を学ぶべきか迷っているかもしれません。まず、以下のドキュメントを読み、Laravelの仕組みを理解することを強く推奨いたします。」

だそうです。順番に読むことにします。

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


「Laravelをどのように使用するかにより、旅の次の行き先も決まります。Laravelを使用するにはさまざまな方法があります。以下では、フレームワークの2つの主要なユースケースについて説明します。」

  1. Laravelフルスタックフレームワーク
  2.  Laravel APIバックエンド

普通は1でWebアプリ開発のコースに行くでしょうね。

Laravel再学習

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