さきほどReact.jsに関するYoutube動画に関して投稿しました。
ページビューの合計
2023年2月24日金曜日
React.jsに関して
React.js開発当時のFacebook社内の評価を振り返る
Youtubeの動画はこちら
PHP8.2のリリース
PHPの8.2がリリースされたようです。
1年ぶりにリリースしたPHP 8.2──気になる新機能は? 型やクラス定義の強化ポイントも解説
PHPの本家からダウンロードできます。
リリースノートによると2023年2月14日のリリースだったようです。
色んなデータ型のサポートなど機能追加がされていますね。
2023年2月23日木曜日
Laravle: サービスコンテナ
サービスコンテナ
- リクエストのライフサイクル
- 設定
- ディレクトリ構成
- フロントエンド
- サービスコンテナ
- ファサード
イントロダクション
Laravelサービスコンテナは、クラスの依存関係を管理し、依存注入を実行するための強力なツールです。依存の注入は、本質的にこれを意味する派手なフレーズです。クラスの依存は、コンストラクターまたは場合によっては「セッター」メソッドを介してクラスに「注入」されます。ん?
UserRepository $users
をコンストラクタで受け取って内部変数に格納しています。2023年2月22日水曜日
Laravel: フロントエンド
フロントエンド
- リクエストのライフサイクル
- 設定
- ディレクトリ構成
- フロントエンド
- サービスコンテナ
- ファサード
イントロダクション
Laravelは、ルーティング、バリデーション、キャッシュ, キュー, ファイルストレージなど、最新のウェブアプリケーション構築に必要となる全ての機能が提供されているバックエンド・フレームワークです。しかし、私たちはアプリケーションのフロントエンドを構築するための強力なアプローチを含む、美しいフルスタック体験を開発者に提供することも重要であると考えています。
Laravelでアプリケーションを構築する場合、フロントエンドの開発には主に2つの方法があります。どちらの方法を選択するかは、PHPを活用してフロントエンドを構築するか、VueやReactなどのJavaScriptフレームワークを使用するかにより決まります。以下では、こうした選択肢について説明し、あなたのアプリケーションに最適なフロントエンド開発のアプローチの情報を十分に得た上で、決定してもらえるようにします。
PHPでの開発というとバックエンド側に目がいきがちですが、ここではフロントエンド側にフォーカスしているようです。
1.PHPを使う
以前、ほとんどのPHPアプリケーションでは、リクエスト時にデータベースから取得したデータを表示するため、PHPのecho
文を散りばめた単純なHTMLテンプレートを使用し、ブラウザでHTMLをレンダしていました。
このHTML表示の手法を使う場合、LaravelではビューとBladeを使用して実現できます。Bladeは非常に軽量なテンプレート言語で、データの表示や反復処理などに便利な、短い構文を提供しています。
ビュー
resources/views
ディレクトリに格納されます。resources/views
ディレクトリ内に保存するようです。<!-- View stored in resources/views/greeting.blade.php --> <html> <body> <h1>Hello, {{ $name }}</h1> </body> </html>
PHPの便利なツールで、機能を記述する部分と画面の表示部分を分割する事が出来ます。
テンプレートエンジンとは、「機能を記述する内容(PHP)」と「画面の表示内容(HTML&CSSなど)」を分けて管理できるツールです。HTMLの中に埋め込められるPHPは、初心者にも扱いやすいのが大きなメリットですが、PHPとHTMLが混在したファイルは、2つのルールが一緒に書かれているので読み取りにくいのが難点でした。修正を行う場合はページ数が多いほど膨大な時間がかかり、保守やメンテナンスが行き届きません。
そんな状況を回避するために、テンプレートエンジンは誕生しました。処理内容と表示内容を分けて作成できます。
PHPでは、HTMLページ内に<?php ?>タグで括る事によって、 HTML(デザイン部分)とプログラム(ロジック部分)を同一ページに記述できます。しかし、同じファイル内にデザイン部分とロジック部分を記述するとメンテナンスが非常に困難となります。とてもシンプルなデータの埋め込み(変数を<h1>タグで囲って表示するだけ)ならいざ知らず、ループで一覧を表示したり、画面遷移やステータスによっては表示するものを変えたりロジックというか処理を書かないといけない気がします。
PHP では、Template Engineという技術によってデザイン部分とロジック部分を分離させメンテナンスを向上させることができるようになりました。
- ビュー:結果表示だけ、デザイナーの担当
- モデル(ビジネスロジック):プログラマーの担当
この方法でアプリケーションを構築する場合、フォーム送信や他のページへの操作は、通常サーバから全く新しいHTMLドキュメントを受け取り、ページ全体をブラウザで再レンダします。現在でも多くのアプリケーションは、シンプルなBladeテンプレートを使い、この方法でフロントエンドを構築するのが、最も適していると思われます。なるほど、昔ながらのHttpRequestに対してページ全体をブラウザ側で再描画するってことですね。
高まる期待
しかし、Webアプリケーションに対するユーザーの期待値が高まるにつれ、多くの開発者がよりダイナミックなフロントエンドを構築し、洗練した操作性を感じてもらう必要性を感じてきています。そのため、VueやReactといったJavaScriptフレームワークを用いた、アプリケーションのフロントエンド構築を選択する開発者もいます。
一方で、自分が使い慣れたバックエンド言語にこだわる人たちは、そのバックエンド言語を主に利用しながら、最新のWebアプリケーションUIの構築を可能にするソリューションを開発しました。たとえば、Rails のエコシステムでは、Turbo や[Hotwire]、Stimulus などのライブラリ作成が勢いづいています。
Laravelのエコシステムでは、主にPHPを使い、モダンでダイナミックなフロントエンドを作りたいというニーズから、Laravel LivewireとAlpine.jsが生まれました。
Laravelに慣れていない方は、ビューとBladeの基本的な使い方に、まず慣れることをお勧めします。その後、公式のLaravel Livewireドキュメントを参照し、インタラクティブなLivewireコンポーネントでアプリケーションを次のレベルに引き上げる方法を学んでください。ということでまずは従来通りの開発の方法を学ぶことにします。
2.VueやReactを使う
LaravelやLivewireを使用してモダンなフロントエンドを構築することは可能ですが、多くの開発者はVueやReactなどのJavaScriptフレームワークのパワーを活用することをまだ好んでいます。このため、開発者はNPMを使い、利用可能なJavaScriptパッケージやツールの豊富なエコシステムを活用できます。
しかし、LaravelとVueやReactを組み合わせるには、クライアントサイドのルーティング、データハイドレーション、認証など、様々な複雑な問題を解決する必要があり、追加のツールがなければLaravelを使うことはできません。クライアントサイドのルーティングは、NuxtやNextなど主義的な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コマンドで生成するディレクトリ
アプリケーションの全ブロードキャストチャンネルクラスで構成します。これらのクラスは、make:channel
コマンドで生成されます。このディレクトリはデフォルトでは存在しませんが、最初にチャンネルを生成したときに作成されます。チャンネルについての詳細は、イベントブロードキャストのドキュメントで確認してください。
event:generate
かmake:event
Artisanコマンド実行時に作成されます。Events
ディレクトリは、イベントクラスを設置する場所です。イベントは特定のアクションが起きたことをアプリケーションの別の部分へ知らせるために使われ、柔軟性と分離性を提供しています。make:job
Artisanコマンドを実行すると作成されます。Jobs
ディレクトリはアプリケーションのキュー投入可能なジョブを置いておく場所です。Jobs
はアプリケーションによりキューに投入されるか、もしくは現在のリクエストサイクル中に同期的に実行されます。現在のリクエストサイクル中に同期的に実行するジョブは、コマンドパターンを実装しているため、時に「コマンド」と呼ばれることがあります。 event:generate
かmake:listener
Artisanコマンドを実行すると、作成されます。Listeners
ディレクトリには、eventsイベントを処理するクラスを設置します。イベントリスナはイベントインスタンスを受け取り、発行されたイベントへ対応するロジックを実行します。たとえば、UserRegistered
(ユーザー登録)イベントは、SendWelcomeEmail
(ウェルカムメール送信)リスナにより処理されることになるでしょう。 make:mail
Artisanコマンドを実行すると作成されます。Mail
ディレクトリには、アプリケーションから送信されるすべてのメールを表すクラスを設置します。メールオブジェクトを使用すると、メールを作成するすべてのロジックを、Mail::send
メソッドを使用して送信できる単一の単純なクラスにカプセル化できます。 make:notification
Artisanコマンドを実行すると作成されます。Notifications
ディレクトリには、アプリケーション内で発生するイベントに関する簡単な通知など、アプリケーションが送信するすべての「トランザクション」的な通知を設置します。Laravelの通知機能は、電子メール、Slack、SMSなどのさまざまなドライバを介して通知を送信したり、データベースに保存したりすることを抽象化しています。make:policy
Artisanコマンドを実行すると作成されます。Policies
ディレクトリには、アプリケーションの認可ポリシークラスを設置します。ポリシーは、ユーザーがリソースに対して特定のアクションを実行できるかどうかを判断するために使用されます。make:rule
Artisanコマンドを実行すると、作成されます。Rules
ディレクトリは、アプリケーションが使用するバリデーションルールオブジェクトで構成します。ルールは複雑なバリデーションロジックをシンプルなオブジェクトへカプセル化するために使用します。詳細は、バリデーションのドキュメントで確認してください。
ずいぶんとたくさんのディレクトリがありますね。
とりあえずMVCに関連するところから始めて、徐々に理解していくことにします。
2023年2月20日月曜日
Laravel: ディレクトリ構成
ディレクトリ構成
- リクエストのライフサイクル
- 設定
- ディレクトリ構成
- フロントエンド
- サービスコンテナ
- ファサード
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ディレクトリ★★★
routesディレクトリ★★★
web.php
ファイルは、RouteServiceProvider
がweb
ミドルウェアグループへ配置するルートを記述します。これにより、セッション状態、CSRF保護、およびクッキー暗号化が提供されます。アプリケーションがステートレスのRESTful
APIを提供しない場合は、すべてのルートがweb.php
ファイルでほぼ定義されるでしょう。 storageディレクトリ
ログ、コンパイル済みBladeテンプレート、ファイルベースのセッション、ファイルキャッシュ、およびフレームワークが作成したその他のファイルが含まれます。
このディレクトリは、app
、framework
、logs
ディレクトリに分離されています。app
ディレクトリは、アプリケーションが作成したファイルを保存するために使用できます。framework
ディレクトリは、フレームワークが作成したファイルとキャッシュを保存するために使用します。最後に、logs
ディレクトリにはアプリケーションのログファイルを保存しています。
確かアプリがアップロードしたファイルがstorage\app\publicに保存されるんじゃなかったかな?
storage/app/publicディレクトリは、プロファイルアバターなど、一般にアクセス可能である必要のあるユーザー生成ファイルを保存するために使用します。このディレクトリを指すシンボリックリンクをpublic/storageに作成する必要があります。php artisan storage:link Artisanコマンドを使用してリンクを作成できます。
シンボリックリンクって思いっきりUNIX(Linux) 系なんだけどWindowsでもできるのかな?
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ディレクトリ
vendorディレクトリ
composer update ではなく composer install を使った方がいいですね。
ざっくり言うと、前者は依存パッケージの最新バージョンをその場で探してインストールするのに対し、後者は composer.lock に記録されたバージョンをインストールします。こうすることで、開発環境と完全に一致したバージョンをインストールすることを保証します。
- composer.json:必要とするライブラリの種類と、必要なバージョンの条件が記載
- composer.lock:ライブラリをローカル環境でインストールしたときに、実際にインストールされたライブラリの種類とそれぞれのバージョンが記載
- Gitを使わず、vendor以下も含めて丸ごとアーカイブしてコピーするか
- Gitを使って、composer.jsonとcomposer.lockを共有してcomposer installを実行して同じものを再現するか
Laravel: Laravel 10がリリース
Laravel 10が2023年2月14日にリリースされたそうです。
Laravel10リリース!新機能・変更点・注意点10個ご紹介
にまとまっています。
- Laravel10はPHP8.1以上が必要 【重要度★★★】
- ひな形ファイルに型宣言が追加【重要度★★★】
- 型を宣言しないとどうなるのか?
- Makeコマンドにおせっかい機能が搭載【重要度★★】
- Invocableバリデーションルールがデフォルトに【重要度★★】
- Processファサードの追加【重要度★★】
- Laravel Pennant【重要度 ★★】
- Testにprofileオプション追加【重要度★★】
- パスワード作成【重要度★★】
- HorizonとTelescopeのデザインが変わった【重要度★】
- Laravel9での非推奨メソッドを除外【重要度★】
2023年2月17日金曜日
Laravel: 独自設定を読み込む
またENVネタです。
キャッシュは
- 本番環境では高速のため実行すべき
- 開発環境では頻繁に変わる可能性があるので実行すべきではない
とのことでした。
とは言ってもいざ本番環境でエラーになることがないように開発環境でもどこかのタイミングで実行はして確認しておくのが良いでしょう。
ただ設定のキャッシュって結局はプロジェクトフォルダ\bootstrap\cach\config.phpを作ってるだけで別にメモリ上にあるわけでもなさそうです。
そんなに効果あるんだろうか?と思いました。
少し古い版ですが高速化検証した記事がありました。
Laravel 5.6の高速化検証・artisanコマンド3つのキャッシュ
実行時間が30%ほども少なくなりましたとのことです。
意外と効果ありますね。本番環境では実行しておいた方が良いでしょう。
本番環境ではデプロイ時に自動的に実行するような仕組みを考えた方が良さそうです。
独自の設定項目
今回のネタはこっからです。
設定ファイルはアプリやプロジェクト独自の項目を設定することもあるはず。
手順的には
- .envに他と重複しないキーと設定値を書く
- configの下にファイルを追加して、そのファイルの中でenv()を使って値を取得するように実装する
- アプリから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), ];
<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()で取得する
【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 |
そしてこの状態でenvでデータを取得しようとするとキーが見つかりませんね。
config経由だと問題ありません。
でこの状態で.envの値を修正してもキャッシュには反映されないと。
DB_CONNECTION=Production2
なので、この状態では2択
- php artisan config:cacheを実行してキャッシュに.envの内容を反映させる。
- 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()でも問題なく表示できています。
ということで今回のまとめとしては
- .envの設定を参照する場合はconfig()を使う
- 開発環境でキャッシュコマンドは実行しない
- 本番環境でキャッシュコマンドを実行すべき。ただ実行忘れを防止するためにデプロイ時に自動的に実行するような仕組みにしておくと良い。
くらいですかね。以下のサイトが良くまとまっています。
【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のような感じ。
上記の掲示板で言及されているように既にフレームワークにある機能を自分で実装する必要はないでしょう。
公式マニュアルによると
追加の環境ファイルデフォルトが「.env」で環境変数「APP_ENV」にマッチしたものが存在すればそれを読み込むようです。
アプリケーションの環境変数を読み込む前に、LaravelはAPP_ENV環境変数が外部から提供されているか、もしくは--env CLI引数が指定されているかを判断します。
その場合、Laravelは.env.[APP_ENV]ファイルが存在すれば、それを読み込もうとします。存在しない場合は、デフォルトの.envファイルを読み込みます。
確かにLoadEnvironmentVariables.phpの中で環境変数"APP_ENV"とマッチする設定ファイルをロードしていますね。
- --env CLI引数が指定されていれば該当するものを読み込む
- APP_ENVが指定されていなければリターン(デフォルトを使用)
- 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
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
後はHTMLビューに切り替えてpreタグで書くだけ
クラスは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 /><Directory "C:/xampp/htdocs">
</pre>
<pre class="prettyprint lang-html linenums:252">
DocumentRoot "C:/xampp/htdocs/example-app/public"<br /><Directory "C:/xampp/htdocs/example-app/public">
</pre>
実際の画面では以下のように表示されます。
もう本当はもう少し明るい色調が好きですが、変えるにはCSSをいじらないといけないようです。
とりあえずこのままでいきます。
2023年2月14日火曜日
Laravel: URLからpublicを除外する
Laravelはプロジェクトの配下のpublicが公開フォルダと決まっているそうです。
なのでブラウザでアクセスするときにURLにpublicを付けないといけません。
http://localhost/example-app/public/
ただこれってどうもカッコ悪いですね。
ぐぐったら削除する方法がいくつかヒットしました。
https://wynes.info/techblog/archives/5250
やり方としては以下の3つ
- ウェブサーバーの設定でドキュメントルートを設定する
- .htaccessを作成して設置する
- 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"Apacheが起動している場合は再起動します。
<Directory "C:/xampp/htdocs/example-app/public">
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フレームワークがどのように機能するかについての概要を説明することです。フレームワーク全体をよりよく理解することで、すべてが「魔法」ではなくなり、アプリケーションの構築に自信が持てるようになります。
良いですね。以前も書いたように「習うより慣れよ」も大事ですがそれだといずれ行き詰まる気がするんですよね。
まずは俯瞰からフレームワークになにができるか、どんな構造なのか、どう機能するのかをまず概要レベルで知っておくことは大切だと思います。
最初のステップ
public/index.php
ファイルです。すべてのリクエストは、Webサーバ(Apache/Nginx)設定によってこのファイルに送信されます。public/index.php
がエントリポイントになるようです。index.php
ファイルには多くのコードが含まれていません。むしろ、フレームワークの残りの部分をロードするための開始点と言えるでしょう。
index.php
ファイルは、Composerで生成したオートローダー定義をロードし、Laravelアプリケーションのインスタンスをbootstrap/app.php
から取得します。Laravel自体が取る最初のアクションは、アプリケーション/サービスコンテナのインスタンスを作成することです。
この仕組みを使うと、運用中のシステムをメンテナンスする際に、一時的にユーザーをシステムにアクセスできないように制限することができます。
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自体が取る最初のアクションは、アプリケーション/サービスコンテナのインスタンスを作成することです。
vendor/laravel/framework/src/illuminate/Foundation/Application.php
app.phpでのApplicationのインスタンス生成部分
Laravelインスタンスに対してHttpとConsoleのKernelをバインドしています。
最後に例外ハンドラをバインドしていますね。
HTTPカーネルのhandle
メソッドの引数は非常に単純です。Request
を受け取り、Response
を返します。カーネルをアプリケーション全体を表す大きなブラックボックスであると考えてください。HTTPリクエストを取り込み、HTTPレスポンスを返します。
サービスプロバイダ
最も重要なカーネル初期起動処理アクションの1つは、アプリケーションのサービスプロバイダをロードすることです。サービスプロバイダは、データベース、キュー、検証、ルーティングコンポーネントなど、フレームワークのさまざまなコンポーネントをすべて初期起動する責務を担っています。
Laravelが提供する基本的なすべての主機能は、サービスプロバイダによって初期起動および設定されます。フレームワークによって提供される非常に多くの機能を初期起動し設定するため、サービスプロバイダはLaravel初期起動プロセス全体の最も重要な側面です。
と書いてあります。
ざっとソース見たけどサービスプロバイダーをロードしてるところが分かりませんでした。
とりあえず「サービスプロバイダ」によってLaravelの主な機能が提供されているとメモして次へ進みます。
ルート
アプリケーションで最も重要なサービスプロバイダの1つは、App\Providers\RouteServiceProviderです。このサービスプロバイダは、アプリケーションのroutesディレクトリ内に含まれるルートファイルをロードします。どうぞRouteServiceProviderコードを開いて解析し、それがどのように機能するかを確認してください!とのことなので開いてみます。
アプリケーションが初期起動され、すべてのサービスプロバイダが登録されると、Requestがルータに渡されてディスパッチされます。ルータは、ルートまたはコントローラへリクエストをディスパッチし、ルート固有のミドルウェアを実行します。
以下のような状態遷移ってことですな。
ミドルウェアは、アプリケーションに入るHTTPリクエストをフィルタリングまたは検査するための便利なメカニズムを提供しています。たとえば、Laravelには、アプリケーションのユーザーが認証されているかを確認するミドルウェアが含まれています。ユーザーが認証されていない場合、このミドルウェアはユーザーをログイン画面にリダイレクトします。そしてユーザーが認証されている場合、ミドルウェアはリクエストをアプリケーションへ進めることを許可します。
アプリケーションに入る前にHTTPリクエストを色々処理できる機能のようですね。
リクエストが一致したルートへ割り当てられたすべてのミドルウェアをパスした場合は、ルートまたはコントローラメソッドが実行され、ルートまたはコントローラメソッドが返すレスポンスがルートのミドルウェアチェーンを介して返送されます。
サービスプロバイダに注目
サービスプロバイダは、Laravelアプリケーションを初期起動するための真の鍵です。アプリケーションインスタンスが作成され、サービスプロバイダが登録され、リクエストが初期起動を終えたアプリケーションに渡されます。とても簡単です!
Laravelアプリケーションがどのように構築され、サービスプロバイダを介して初期起動されるかをしっかりと把握することは非常に価値があります。アプリケーションのデフォルトのサービスプロバイダは、app/Providersディレクトリに保存されます。確かにAppServiceProvider.phpはスッカスカですね。
デフォルトのAppServiceProviderはほとんど空です。このプロバイダは、アプリケーション独自の初期起動処理およびサービスコンテナ結合を追加するのに最適な場所です。大規模なアプリケーションの場合、アプリケーションで使用する特定のサービスに対して、それぞれがよりきめ細かい初期処理を備えた複数のサービスプロバイダを作成することをお勧めします。
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においては、パッケージやライブラリの依存管理ツールです。
これをチェックするとアンインストーラーがダウンロードされないようです。
なんかややこしい、デフォルトのままチェック無しで良いでしょう。
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
コメントアウトを外します。
もう一度コマンドを実行します。
問題なくダウンロードが開始されます。
問題なく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を起動します。
LaravelとDocker
この章はさっくり飛ばします。
1点だけ、
LaravelではSailという、Dockerを使用してLaravelプロジェクトを実行する組み込みソリューションを提供しています。
Sailって名前はどっかで聞いたことがあります。
Dockerの開発環境を作るための仕組みのみたいですね。
以下が分かりやすいです。
https://biz.addisteria.com/00laravel_sail/
初期設定
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の仕組みを理解することを強く推奨いたします。」
だそうです。順番に読むことにします。
- リクエストのライフサイクル
- 設定
- ディレクトリ構成
- フロントエンド
- サービスコンテナ
- ファサード
「Laravelをどのように使用するかにより、旅の次の行き先も決まります。Laravelを使用するにはさまざまな方法があります。以下では、フレームワークの2つの主要なユースケースについて説明します。」
- Laravelフルスタックフレームワーク
- Laravel APIバックエンド
普通は1でWebアプリ開発のコースに行くでしょうね。
Laravel再学習
フロントエンド系の方に興味が行っていましたがまたバックエンド系に戻ってきました。 Laravelです。 かなり忘れてます、自分のブログを見ながらもう一度です。 今回はMVCパターン、そして Eloquentを使えるようになるのが目的です。 まずはプロジェクト作成から 1. Com...
-
この手の開発フレームワークを学ぶ時には、 公式サイト チュートリアル 書籍 を参照することにしています。 「習うより慣れよ」という言葉があります。 ただこういったIT系の場合、初心者だとそもそも開発環境自体が構築できない、良くわからないけどとりあえず言われる通りにコマンド打って...
-
PostgresSQLも使っているのですが、pgAdmin4を起動すると必ずマスターパスワードを聞かれて鬱陶しいので無効にする方法を探しました。 ググったら一発でした。 データベース - pgAdmin - マスタパスワード pgAdmin 4の起動時 自己責任と書いてあ...
-
ウェブ入門の続き: HTMLの基本 1.4 HTMLの基本 HTMLとは HTMLとは HyperText Markup Language、ハイパーテキスト・マークアップ・ランゲージです。 そしてどうでもいいかも知れませんがHTMLは開発言語ではなくマークアップ言語です。 【悲...