私的Laravelプロジェクトの始め方
はじめに
最近メンター業をやっています。そこでの気づきとしてLaravel始めてそんなに経ってない人には、いれておくべきパッケージとか、やっておくべき設定など基本的なことが知れ渡っていないのかなという印象を抱きました。そこで今回は、Laravelのプロジェクトを始める時に、私がどんな手順を踏んでいるかをご紹介したいと思います。もちろんこれが絶対的な正解という訳ではありません。必要に応じてアレンジ等していただければと思います。
前提
ここでは、会員登録ありのサービスの開発を行う前提で始めたいと思います。利用するPHP、Laravel、Composerのバージョンは以下の通りです。
- PHP7.4
- Laravel8.x
- Composer2.x
開発環境は以下を想定しています。
- Mac
- Docker
Laravelプロジェクトセットアップの流れ
laravel-installerのアップデート
まずはinstallerから。常に最新にしておいて良いと思います。巷では、composerを使ったLaravelのインストールを教えているところもあります。installerからだと常にLaravel最新版がインストールされてしまうため、Laravelのバージョンを指定してインストールしたい人は、composerを使ってインストールしましょう。
composer global require "laravel/installer:^4.0"
バージョン確認は以下のコマンド。
laravel --version
また今回が初めてのインストールであれば、パスが通ってないので環境変数を登録しておきましょう。
#zshの場合(Mac Mojave以降はこっちが標準)
echo 'export "PATH=$PATH:$HOME/.composer/vendor/bin"' >> ~/.zshrc
source ~/.zshrc
#bashの場合
echo 'export "PATH=$PATH:$HOME/.composer/vendor/bin"' >> ~/.bash_profile
source ~/.bash_profile
Laravelプロジェクトの作成
Laravelコマンドを使ってプロジェクトを作成します。この時会員登録/認証のスカフォールドとしてJetstreamをインストールします。使用するスタックはLivewireとします。シンプルなスカフォールドを使いたい人は、Laravel Breeze
がオススメですが、Livewireを併せてインストールでき、かつプロフィール画面も用意してくれるJetstreamの方が個人的には都合が良いためこちらを使います。
# myprojectの部分は自分のプロジェクト名を代入
# teamsはnoを指定する
laravel new {myproject} --jet --stack=livewire
# vueやreactなどフロントエンドも使いたい人はこっち
laravel new {myproject} --jet --stack=inertia
--gitと--githubオプション
laravel-installer4.2以降は、--git
と--github
オプションが使えるようになりました。PCに最新のgitコマンドとghコマンドが入っていれば、--git
を使うことでインストール時にローカルリポジトリを作成することができ、--github
を使うことでリモートプライベートリポジトリを作成することができます。後者を使う場合は、 あらかじめ gh auth login
でghからGitHubへの認証設定を済ませていることが条件となります。認証設定済みかどうかは、 gh auth status
で確認してください。
# ローカルリポジトリを作成する場合
laravel new {myproject} --jet --stack=livewire --git
# リモートプライベートリポジトリを作成する場合
laravel new {myproject} --jet --stack=livewire --github
初期設定
laravel-installerを使った場合、内部でartisan key:generate
とartisan storage:link
を実行してくれているので、この手順は割愛します。composer使ってインストールする場合は必要になります。
まずメールの送受信には50通までの受信なら無料で使えるメールサンドボックスサービスmailtrapを使用します。
なのでMailtrapのマイページにLaravel用の設定を出力できるので、コピーして、.env
の所定の場所に上書きしましょう。
さらに、.env
の以下のパラメータを漏れなく設定しておきます。今回は後述の通りLaravel Sail
は使わないので、APP_URLをlocalhostに書き換えておきます。
#変更前
MAIL_FROM_ADDRESS=null
APP_NAME=Laravel
APP_URL=http://hoge.test
#変更後
MAIL_FROM_ADDRESS=適当なメールアドレス
APP_NAME=サービスの名前
APP_URL=http://localhost
Laravel実行環境の導入
Docker用の実行環境としては、最近公式が発表したLaravel Sail
がありますが、まだ成熟しているとは言えないので、Laravel Sail
がインスパイアされたというVessel
を導入します。インストールと初期化をするだけで、簡単に起動します。
インストール
composer require shipping-docker/vessel --dev
php artisan vendor:publish --provider="Vessel\VesselServiceProvider"
初期化
bash vessel init
カスタマイズと起動
起動前にdocker-compose.ymlを編集し、appコンテナのimageの名前を変更しておきます。これはローカルで複数バージョンのPHPの案件を扱う時のトラブル防止のための措置です。
# docker-compose.yml
# 変更前
image: vessel/app
# 変更後
image: vessel/app74
yml編集後、vesselを起動します。初回ではvessel/app74イメージのビルドが走るため、少々時間がかかります。
./vessel start
あとはせっかくなのでキャッシュとセッションはredisを使う様に.env
の設定を変えておきます。
CACHE_DRIVER=redis
SESSION_DRIVER=redis
Jetstream有効化
vesselによる開発環境ができたら、Jetstreamの有効化を行います。今回の環境では、assetsのpublishをやってないと、livewire.jsを読み込めないので、プロフィール画面でNameやEmailが入力欄に表示されなくなります。Jetstreamのマニュアルには載ってないので、マニュアル見ながらセットアップしているとここでハマります(Livewireのマニュアルには載っているのでセーフ?)。
./vessel npm install
./vessel npm run dev
./vessel art livewire:publish --assets
./vessel art migrate
デバッグ用パッケージの導入
環境ができたら、Laravel実行時にデバッグできるようにします。最近、英語圏のLaravel界隈にて2,790円/年のRAYというツールが評判になっていますが、今回は無償で利用可能なbarryvdh/laravel-debugbarを導入します。
インストール
本番では使わないので--dev
オプションをつけてインストールしましょう。
composer require barryvdh/laravel-debugbar --dev
初期設定
Debugbarが有効になるよう.env
ファイルを以下のように書き換えます。
# 変更前
APP_DEBUG=false
# 変更後
APP_DEBUG=true
日本語化
当たり前ですが、Laravelのプロジェクトは英語圏で使うことを前提にしているため、日本語のプロジェクトとして使うにはいくつか設定を変更しなくてはいけません。このあたりは別の記事でまとめてあるので、そちらをご参照ください。
ロギング
Laravelでは特に何も設定しなくてもログ自体は取得できるわけですが、日ごとにファイルを分けたほうが調査するときに効率が良いので、設定を変更します。以下の変更により日次ファイルが作られます。ファイルは14日分保持され、それより古いものは削除されるようになります。
.envの変更
#変更前
LOG_CHANNEL=stack
#変更後
LOG_CHANNEL=daily
さいごに
最初こそ手順を読むのに時間がかかるし、やってみると手順通りに行かないぞってなるかもしれませんが、慣れてしまえばプロジェクトのセットアップは5-10分程度で済む(composerの頑張り次第ではある)ようになります。
そんなに何度もプロジェクトなんて作らないかもしれませんが、案外OSSコードリーディングついでに触ってみたり、個人開発でアプリを作ったり、最新のLaravelを試すってことがあり、セットアップのハードルを下げておくと学習が捗るのではないかと思います。
Discussion