Laravel9でcreate projectしてからコードを描き始めるまでの自分的ルーティン

# この記事は？

表題の通りですが、最近Laravel触っていないので、急に触るときに「あれこれどうやってセットアップしてたっけ？」が増えてきたので、まとめておきます。

# 環境

- OS
    - macOS Monterey 12.6.2
- PHP
    - 8.0.x
- Laravel
    - 9.46.0
- IDE
    - PhpStorm 2022.3.1

さくらのサーバがかたくなにPHP8.1に対応してくれないので、今回は8.0をターゲットに書きます。

# 各種セットアップ

## PHPのインストール

自分はanyenv経由でphpenvを入れ、homebrewでインストールしたPHPの各種バージョンをphpenvのディレクトリにシンボリックリンクして使っています。簡単にやり方をまとめます。

## anyenv, phpenvのインストール

まとまっているサイトが沢山あるので省略。

https://qiita.com/hamakou108/items/4744818dd166191c3e6b

このQiita記事にも書かれていますが、ビルドをすると大量のエラーが出るので、いつの頃からかビルド(phpenv install x.x.x)するのを止めてしまいました。

## PHPのインストール

以下のようにしてhomebrewでPHPの各バージョンをインストールします。

```terminal
brew install php@7.4
brew install php@8.0
brew install php@8.1
brew install php
```

## phpenvへの設定の反映

phpenvの設定が終わっていると、`~/.anyenv/envs/phpenv/versions`というディレクトリが出来ているはずです。出来ていない場合は設定をしてから`phpenv versions`を実行してみてください。
それでは設定を反映させます。バージョン番号はその時のHomebrewでインストールされる最新の物に読み替えてください。

```terminal
cd ~/.anyenv/envs/phpenv/versions/
ln -s /usr/local/Cellar/php@7.4/7.4.32
ln -s /usr/local/Cellar/php@8.0/8.0.26
ln -s /usr/local/Cellar/php@8.1/8.1.13
ln -s /usr/local/Cellar/php/8.2.0
phpenv global 8.0.26
```

この状態で`phpenv versions`を実行すると以下のような表示になるはずです。

```terminal
phpenv versions
  system
  7.4.32
* 8.0.26 (set by /Users/foobar/.anyenv/envs/phpenv/version)
  8.1.13
  8.2.0
```

同じく`php -v`の結果。

```terminal
php -v       
PHP 8.0.26 (cli) (built: Nov 28 2022 11:39:58) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.26, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.26, Copyright (c), by Zend Technologies
```

これでビルドエラーに悩まされずにphpenvが利用出来ます。composerも自動で入れてくれるので便利です。

ただ一点欠点がありまして、`brew upgrade`をしてPHPのバージョンがアップデートされると、phpenv/versions配下のシンボリックリンクが切れてしまいます。そう言うときは、切れたシンボリックリンクを削除して、改めてシンボリックリンクを張り`phpenv global`や`phpenv local`を実行してください。

## composer create-project

では実際にLaravelのプロジェクトを作成します。先ほどインストールしたPHPは実はこのプロジェクト作成＋α程度にしか利用していません。残りはLaravel Sail内のPHPに任せてしまいます。

```terminal
composer create-project laravel/laravel foo_bar_test
```

## 初回git周りのあれこれ

表題の通りです。git周りのあれこれを済ませていまいます。

```terminal
git init
git add .
git commit -a -m 'First commit.'
```

.gitignoreの末尾に https://www.toptal.com/developers/gitignore/api/intellij+all,visualstudiocode,vim,emacs,macos,windows,laravel で得られる結果を追加して、`git commit`しておきます。
ディレクトリなどの重複でアラートが出ますので、適宜コメントアウトしてください。

## Laravel Sailの設定

dockerを使って開発を進めるので、Laravel Sailを利用する事にします。現在はLaravel Sailは標準でインストール済みですので、有効化して設定を変更します。ここで有効にするサービスを選びます。サービス名も指定出来るようですが、数字でカンマ区切りが便利かと思います。

```terminal
php artisan sail:install

 Which services would you like to install? [mysql]:
  [0] mysql
  [1] pgsql
  [2] mariadb
  [3] redis
  [4] memcached
  [5] meilisearch
  [6] minio
  [7] mailhog
  [8] selenium
 > 0,7,8

Sail scaffolding installed successfully.
（中略）
Sail build successful.
```

この状態だと、デフォルトでPHP8.1が利用されるので、今回はPHP8.0にする方法をまとめます。`docker-compose.yml`の`8.1`を`8.0`に書き換えて、docker imageをビルドし直すだけです。

```diff:docker-compose.yml
-            context: ./vendor/laravel/sail/runtimes/8.1
+            context: ./vendor/laravel/sail/runtimes/8.0

-        image: sail-8.1/app
+        image: sail-8.0/app
```

```terminal
./vender/bin/sail build
```

ついでに`~/.zshrc`か`~/.zprofile`にalias設定をしておきます。

```text:~/.zprofile
alias sail='[ -f sail ] && bash sail || bash vendor/bin/sail'
```

これで`./vendor/bin/sail`と入力しなくても`sail`だけでコマンドが使えるようになりました。

以下のコマンドで起動しておきます。終了は`Ctrl+C`です。

```text
sail up
```

## 地域・ローカライズ周りの設定

### `config/app.php`の変更

タイムゾーンとロケールを変更します。

```diff:config/app.php
-    'timezone' => 'UTC',
+    'timezone' => 'Asia/Tokyo',

 
-    'locale' => 'en',
+    'locale' => 'ja',


-    'faker_locale' => 'en_US',
+    'faker_locale' => 'ja_JP', 
```

### Laravel-Lang周りの設定

多言語対応のため、Laravel-Lang/langを利用します。設定にはLaravel-Lang/publisherを用います。このとき、sail経由で行う事でLaravel Sail内のPHPのバージョンに合ったパッケージがインストールされます。

```text
sail composer require laravel-lang/publisher laravel-lang/lang --dev
```

パッケージをインストールしたので、artisan経由で日本語関係のファイルをインストールします。

```text
sail artisan lang:add ja
```

## Laravel UIのインストールと設定

Laravel Breezeなど色々な認証系パッケージがありますが、今回は昔ながらのLaravel UIを使います。

```text
sail composer require laravel/ui
sail artisan ui bootstrap --auth
```

`routes/web.php`に`Auth::routes()`と`Route::get('/home', [略]);`が追加されます。意外と知られていないようなのですが、`Auth::routes()`は引数に配列で設定を指定する事が出来ます。ルートの追加を設定でオンオフする事が可能です。以下の設定がデフォルトとなっています。必要無いページはfalseにしておきましょう。

```php:route/web.php
Auth::routes([
    'login'    => true, // ログインページの有無
    'logout'   => true, // ログアウト動作の有無
    'register' => true, // 登録ページの有無
    'reset'    => true, // パスワードリセットページの有無
    'confirm'  => true, // パスワードの再確認ページの有無
    'verify'   => true, // メールアドレスの確認ページの有無
])
```

続けてアセット類のビルドです。

```terminal
sail npm install
sail npm run build
```

最後にDBマイグレーションをしておきます。

```terminal
sail artisan migrate
```

# まとめ

自分の備忘録的な投稿でした。今度はもうちょっと実のある投稿をしたい物です。