ページビューの合計

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アプリ開発のコースに行くでしょうね。

2023年2月8日水曜日

Laravel書籍

Laravelの書籍です。

まあ陳腐化が激しくてすぐに使い物にならなくなりますが、最初にざっと全体を見る、気になるところだけ読み返すとかは、やっぱり書籍ですね。

PHPフレームワークLaravel入門

一度では理解できませんでしたが、何度か読むと分かってきました。

PHP, Laravel用のVSCodeプラグイン

VSCodeで十分にLaravelを使ったWebアプリの開発が可能です。

ただ、各種プラグインをインストールするとより効率的に開発ができるようになります。
 

PHP用のVSCodeプラグイン

PHP Intelephense

PHPのコーディングや開発全般を、効率よく簡単にしてくれる機能です。

php cs fixer

PHPのフォーマッタです。

Laravel用のVSCodeプラグイン

EditorConfig for VS Code

公式サイト:https://editorconfig.org/

ファイルごとのテキスト形式のルールを決めるプラグインです。
タブの種類(タブか空白か)、インデントの大きさ、改行コードの種類、文字コードなどを統一できます。

以下のサイトが詳しいです。
https://www.asobou.co.jp/blog/web/editorconfig

.editorconfigに記述すれば良いみたいですね。Gitで管理しとけば問題ないでしょう。

Laravel Snippets

Laravelのコードの自動補完やハイライト等をしてくれます。

Laravel Blade Snippets

Laravelで使われるテンプレート「Blade」のコードの自動補完やハイライト等をしてくれます。

Laravel goto view

コントローラーなどで定義されている、ビューをクリックすると、そのビューのファイルを開いてくれます。

Laravel-goto-controller

Routeなどで指定している、コントローラーのファイル名をクリックすると、そのコントローラーのファイルを開いてくれます。

この名前では見つかりませんでした。Laravel Goto Controllerを代わりにインストールしました。

Bracket Pair Colorizer 2

括弧'()’ ‘{}’の範囲が目視可能になります。
ネストしてると混乱するし、エラーになってもどこが間違ってるか分かりずらいですかね。
範囲がはっきりすると良いですね。

VS Codeで標準対応したので非推奨になりました。


この拡張機能は、この機能が現在VS Codeに組み込まれているので非推奨です。この機能を使用するには、これらの設定を構成して下さい。
と表示されます。

設定をクリックすると設定画面に飛びます。


既にColorizationはEnableになっています。

その下のGuides: Bracket Pairsはfalseになっています。trueにすると左側に色付きガイドが表示されます。 

実際どうなるかは以下のサイトが分かりやすいです。

Visual Studio Codeで対応する括弧に色を付けて見やすくする環境設定


Laravel開発、実行環境

Laravelの開発に当たって使用するツール類

Windowsで動作させる前提です 

1.IDE

Visual Studio Code

統合開発環境です。単なるエディタのみならずターミナルを開いたり、Gitへのコミットなどができます。

2.実行&デバッグ環境

XAMPP(Apache, MariaDB, PHP, and Perl)

上記の通り、Webアプリを動作させるのに必要なアプリが1セットになっています。

3.DB

PostgreSQL

XAMPPをインストールするとMariaDBが自動的にインストールされます。
要件によってはPostgreSQLが必要な場合もあります。
単純にインストールして以下の手順でXAMPPと連携するようにするだけです。

記事では「クライアント認証でパスワード要求をしないように設定します(面倒なので…)。」
とありますが不要です。
単純にパスワードをきちんと指定すれば良いだけです。
 

4.DB管理

Oracle, MySQL, PostgreSQLなどに対応しています。
テーブル定義の管理ができてExcelの形式で出力もできます。

pgAdmin
PostgreSQLの管理ツールです。PostgreSQLに付随している場合もあります。

 

5.GIT

Git SCM

言わずと知れたGitです。いまどきソースコード管理をしないことはほぼ無いので入れておきましょう。
 

6.Gitのリポジトリ操作

Sourcetree
 
Gitの操作を効率的に扱うGUIツールです。
Gitのブランチ・ツリーやソースコードの変更なども視覚的に見ることができます。
 
 
 

Laravelチュートリアル

この手の開発フレームワークを学ぶ時には、

  • 公式サイト
  • チュートリアル
  • 書籍

を参照することにしています。

 「習うより慣れよ」という言葉があります。

ただこういったIT系の場合、初心者だとそもそも開発環境自体が構築できない、良くわからないけどとりあえず言われる通りにコマンド打ってやってみたけど何してるか分からないという状態に陥りがちです。

手を動かさないと習得できないのは事実ですが、少し俯瞰から開発フレームワークはどういう思想で設計されていて、それを使った開発のためにどういう知識が必要かを考えてみるのも良いと思います。

いくつかチュートリアルサイトを探してみました。

ドットインストール

有名なサイトですね。
まずは概要から入り、公式サイトなどの紹介があります。
1本辺り3分程度の短い動画で要点が分かるのが良いですね。
Laravelの動画もあります。 
検索すると6件のレッスンと58件のレッスン動画があるようです。
古い版もあります、古いのはざっと見るくらいでいいかもしれません。

 

Laravelの教科書

40代からプログラミングを始めたJunkoさんのサイト

プログラマの旦那さんとの掛け合いが面白い。超初心者からでも大丈夫です。

https://bit.ly/3qonId4 Youtube 「Laravel超入門」


Laravel学習帳

初心者向けでよさげですが、ちょっと記事が探しづらいですね。
 

入門 laravelのチュートリアル

ToDo アプリを開発する手順を通して Web 開発のエッセンスを学ぶサイト 

【初心者向け】Laravelを始めよう

全体像の概要が書いてあって詳細は別ページになっています。


 YouTube

 【Laravelチュートリアル決定版】初心者でも作れるノートアプリを現役Laravelエンジニアが解説

 

PHP Laravel Tutorial for Beginners

全29回、英語ですが基礎から一通りの内容です。 



 

Laravelはじめ

Laravelについてのメモ

第1回目です。

自分用のメモなので他の人にとっては冗長だったりするかもしれませんが気にせずに進めていきます。

Laravelとは

PHPでWebアプリケーションを開発する際のフレームワークになります。

ランキングを探すとTop5の中の一位のようです。

第1位:Laravel
第2位:CakePHP
第3位:Symfony
第4位:Codelgniter
第5位:FuelPHP

この辺のトレンドは年々変わるのであまり気にしなくても良いでしょう。
上記はどれも一度は聞いたことがあるものですね。
ただ第4位のCodelgniterだけは日本ではあまり聞かないですね。本屋でも書籍を見た気がしません。
他の4つはバージョンを問わなければどれも本屋で書籍を見かけます。
あくまで私見ですがもともとCakePHPやFuelPHPなどが流行していて、最近Laravelの名前を良く聞くようになった気がします。
 
どのフレームワークもMVC(Model, View, Controller)モデルを採用しています。
最近だとMVVM(Model, View, ViewModel)というのもあるようですが、まずはMVCをマスターすることを優先することにします。 

Laravel公式サイト

この手のものを扱うにはまず公式サイトを参照するに限ります。
 
日本語
http://laravel.jp/

オンラインドキュメント:9.x
https://readouble.com/laravel/9.x/ja/

FBグループ日本語

Laravelの開発履歴

Wikipediaによれば
2011年6月にバージョン1がリリースされたそうです。12年前ですね。
バージョン4(2013年5月)ではコードがゼロベースから書き直され、当時スタンダードになりつつあったパッケージ管理システムのComposerを採用し、PHPの歴史のあるフレームワークであるSymfonyのコンポーネントを利用するなど、抜本的な変更が行われた。
とあります、この辺から今のLaravelの基礎ができたっぽいですね。 

Laravelの開発者

マイクロソフトの.NETの開発に関わっていたTaylor Otwell が開発し、Taylorを中心としたコミュニティーが活発な開発を続けている
だそうです。
またLaravelという名前は「 ナルニア国物語に登場するナルニア国の王都、ケア・パラベルにちなむ」らしいです。
以下TwitterでLaravelという名前は魔法少女ララベルから来ているのかという(日本人からの)質問に対してTaylorさんが答えています。
 

PHPとは

今更ですがPHPとは”PHP: Hypertext Preprocessor”という再帰的に略したものだそうです。
再帰的に略したもの:PHP自体が名前の中に入っていて略語に含まれている。
PHP: Hypertext Preprocessor
 
現在の最新版は8.2.2のようです。

公式ドキュメント:https://www.php.net/manual/ja/index.php
日本語化されています。助かりますね。

PHPの歴史

結構昔からある開発言語のイメージです。

現在 PHP として知られているものは、かつて PHP/FI と呼ばれていたソフトウェアの後継です。 1994 年に Rasmus Lerdorf が生み出したいちばん最初の PHP はシンプルな CGI バイナリ群で、C 言語で書かれていました。

だそうです。29年も前になりますね。

当然もう当時とは全く違うものになっているでしょうがこれだけ続いているのがすごいことです。


Laravel再学習

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