Laravelまとめその1 Laravel Sailで11および10環境を構築しよう編

## はじめに
以前まではMWの導入、インストールなどインフラに関する自身のナレッジをアウトプットとしていましたが、どちらかというとアプリよりなPHPのFWであるLaravelを記事としてまとめます。

実務含めいくつかLaravelでプログラムを作ってみたのですが、慣れるまでは覚えることが多く大変でしたが、1度慣れてしまえば便利でとてもいい物だと感じています。

## 環境
今回Laravelを実行する環境はWSL2とDocker Desktopを使用したLaravel Sail環境を活用します。
それぞれの環境のバージョンは以下の通りです。
WSLとかまではバージョン書かなくてもいいような気もしましたが、折角なので残しておきます。

・Docker Desktop：4.32.0
・Docker Engine：27.0.3
・WSL2：2.2.4.0
・Ubuntu：22.04.4 LTS

## インストール前の余談
2024年7月現在ですと、Laravelは11がリリースされており、公式のインストール方法を利用すると、Laravel11がインストールされます。
今回はLaravel10のインストール方法も一緒に紹介(自分のために)します。

実はLaravel11は10に比べファイルの減少や設定などの記載個所がかなり変わったらしいのですが、自分のようにLaravelに対して理解が深くないと、その変更点が全く追いつけないです。
後述する本でLaravelの基礎を学んだのですが、10ベースとなっていて11の影響が整理できず、趣味でポチポチするときは10を明示的に使用するようにしています…。

### プロジェクトの作成
https://laravel.com/docs/11.x/installation#docker-installation-using-sail

Laravel公式サイトより、WindowsのSail環境では以下を実行せよと記載があります。
以下のコマンドの「example-app」部分は任意のプロジェクト名に変更してください。
今回私は「test-project」としています。
```ruby:コマンド
curl -s https://laravel.build/example-app | bash
```

インストールコマンドを実行すると、必要なコンテナがPullされます。
また、今回Laravelはv11.1.3がダウンロードされ、カレントディレクトリにプロジェクト名のディレクトリが生成されます。
途中でユーザのパスワードが聞かれた際は、入力してあげてください。
末尾の「Thank you! We hope you build something incredible. Dive in with: cd test-project && ./vendor/bin/sail up」という記載がでればインストールが正常に完了となります。

```ruby:コマンド
motuni@DESKTOP-RMGU015:~$ curl -s https://laravel.build/test-project | bash
latest: Pulling from laravelsail/php83-composer
8a1e25ce7c4f: Pull complete
5de14226e170: Pull complete
d5aaf617d1d2: Pull complete
d3ba065e262f: Pull complete
7d690bf89733: Pull complete
d18ec88a49f4: Pull complete
ce034f0d87ba: Pull complete
eb249b15c521: Pull complete
c76031fe6b29: Pull complete
388da3a0b0d5: Pull complete
d2c00c377202: Pull complete
084ef85ed4e8: Pull complete
4f4fb700ef54: Pull complete
c652e433ba18: Pull complete
6196d8f1a069: Pull complete
Digest: sha256:428fa9b2edf2cfc1be71a6c32f0d6723449e5edc6ae1c3eeaac5a31d89b0c9f2
Status: Downloaded newer image for laravelsail/php83-composer:latest
   WARN  TTY mode requires /dev/tty to be read/writable.

    Creating a "laravel/laravel" project at "./test-project"
    Installing laravel/laravel (v11.1.3)
      - Downloading laravel/laravel (v11.1.3)
      - Installing laravel/laravel (v11.1.3): Extracting archive
    Created project in /opt/test-project
~省略~
Please provide your password so we can make some final adjustments to your application's permissions.

[sudo] password for motuni:

Thank you! We hope you build something incredible. Dive in with: cd test-project && ./vendor/bin/sail up
```

### Laravel Sailの起動…の前に
プロジェクト作成の最後に、「cd test-project && ./vendor/bin/sail up」を実行してねという表記が出ていたかと思いますが、このコマンドを実行すれば各種コンテナが立ち上がりSailが起動しますが、その前にいくつかセットアップしておいた方がよい項目を紹介します。

#### エイリアスを作成してパスを通そう
先ほど「./vendor/bin/sail」というコマンドが出てきましたが、これを都度入力するのは面倒くさいです。
Laravel Sailではプロジェクト毎にsailコマンドを使用して設定やコンテナの起動停止を行うため、そのような作りになっています。

やることは単純で、自身の「.bashrc」ファイルに以下のエイリアスを作成するだけです。
末尾に記載してプロファイルの読み込みを行いましょう。
そうすると以降のコマンドは「./vendor/bin/sail」から「sail」と入力するだけでよくなります。
(ただしプロジェクトディレクトリ配下にはちゃんと移動しよう)
```ruby:.bashrc
alias sail='./vendor/bin/sail'
```

#### .envに記載のDB構成情報を修正しよう
自身のプロジェクト(今回で言えば「test-project」)ディレクトリ配下に、「.env」というファイルが存在します。
このファイルには各Laravelの設定などが記載されているのですが、この中にDBの情報も入っています。
この後DBを起動する際に、この情報を元にDB名やユーザが作成されるのですが、この情報を修正し忘れるとそのままの値が使用されてしまい、面倒くさいことになります。(私は都度プロジェクトを再作成していました…。)
今回この記事を書くのも、一連のプロジェクト作成の中でこの工程をすっ飛ばして、
毎回うわーーーーーーー！ってなるからなのでした…。

主に変更するのは以下の3点かと思います。
ここを変更すれば任意のDB名やユーザ、パスワードが設定できます。
コンテナ起動時の初回に、記載のDBやユーザを作成する処理が走るため、やらかすと面倒くさくなるのです…。
ちなみに「DB_HOST」はコンテナ環境なので変更する必要はないと思いますが、変えたければこの項目を変更すればよいです。
・DB_DATABASE
・DB_USERNAME
・DB_PASSWORD

```ruby:.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=sail
DB_PASSWORD=password
```
ちなみに今回は折角なので以下のように変更しています。
```ruby:.env (修正後)
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel-test
DB_USERNAME=test
DB_PASSWORD=test
```

### やっとこさ起動します
起動方法は先ほども紹介した通り、プロジェクトへ移動して起動コマンドを1発かますだけです。
なお、「sail up」だけだとターミナルが返ってこないので「-d」オプションを付けてバックグラウンド起動にしましょう。

```ruby:コマンド
motuni@DESKTOP-RMGU015:~$ cd test-project
motuni@DESKTOP-RMGU015:~/test-project$ sail up -d
[+] Running 10/10
 ✔ Network test-project_sail               Created        0.0s 
 ✔ Volume "test-project_sail-redis"        Created        0.0s 
 ✔ Volume "test-project_sail-meilisearch"  Created        0.0s 
 ✔ Volume "test-project_sail-mysql"        Created        0.0s 
 ✔ Container test-project-mailpit-1        Started        1.3s 
 ✔ Container test-project-selenium-1       Started        0.8s 
 ✔ Container test-project-redis-1          Started        1.3s 
 ✔ Container test-project-meilisearch-1    Started        1.0s 
 ✔ Container test-project-mysql-1          Started        1.3s 
 ✔ Container test-project-laravel.test-1   Started        1.5s 
 ```
Docker Desktopでもプロジェクト名のコンテナが起動できたことが確認できます。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/4234315a-e9d2-05ac-6a65-7f878f59adb2.png)

### Laravelのメイン画面へのアクセスしようと思ったら…
プロジェクトが起動していればメイン画面へアクセスできるはずです。
「http://<foo>localhost</foo>」へアクセスしてみましょう。
と記載しキャプチャ撮ろ～と思って「http://<foo>localhost</foo>」へアクセスした所、
「SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel-test.sessions'」というエラーが発生しました。
これ、エラーの内容自体はテーブルが無いよなんですが、Laravel10の時はそのままアクセスしてトップページ表示できたような気がしたんですが、Laravel11からここら辺の挙動が変わったんですかね…。

対応方法自体は単純で「migrate」というコマンドでDBのオブジェクトを生成してあげれば済みます。
エラーが発生せずにDONEが表示されてれば大丈夫です。
```ruby:コマンド
motuni@DESKTOP-RMGU015:~/test-project$ sail artisan migrate

   INFO  Preparing database.  

  Creating migration table ................................ 40.88ms DONE

   INFO  Running migrations.  

  0001_01_01_000000_create_users_table ................... 188.06ms DONE
  0001_01_01_000001_create_cache_table .................... 73.17ms DONE
  0001_01_01_000002_create_jobs_table .................... 161.71ms DONE
  ```


### 気を取り直し再度Laravelのメイン画面へのアクセス
「http://<foo>localhost</foo>」へアクセスしてみると無事Laravelの画面が出てきます！
私はすごい単純なので、何回やってもこの初期画面だったりHello Worldだったりが表示されたりすると感動しちゃいます。ITって楽しい～～！
しっかり最下部にバージョンも出てますね！
Laravel10と初期画面が異なってるので最初は何か間違えたのかとびっくりしました！
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/275136ba-aa74-f061-75c1-2db55f4f8521.png)

## おまけのLaravel10のプロジェクト作成方法
冒頭でも記載しましたが、Laravel10のプロジェクト作成方法を記載しておきます。
最新版の時の環境構築はコマンドを1発流して終わりだったのですが、過去のバージョンを指定する時は、OS上のcomposerを使用して1度プロジェクト作成後、Sailをインストールとなるようです。

コマンドは一応残していたのですが、間違っていたら申し訳ないです…。
もし他のパッケージが必要そうであれば追加取得などお願いします…。
```ruby:コマンド
# OS(WSL2のUbuntu)へPHPの導入
apt -y install php8.1-bcmath php8.1-mbstring php8.1-xml php8.1-zip php-curl
```

PHP導入後、以下のコマンドでComposerを導入します。
基本的に以下の公式のコマンドをそのままやればできるはずです。
https://getcomposer.org/download/

```ruby:コマンド
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/local/bin/composer
```
無事インストールできると以下のようにバージョンが表示できます。
```ruby:コマンド
motuni@DESKTOP-RMGU015:~$ composer -V
Composer version 2.7.7 2024-06-10 22:11:12
PHP version 8.1.2-1ubuntu2.18 (/usr/bin/php8.1)
Run the "diagnose" command to get more detailed diagnostics output.
```

composerが導入できれば以下のコマンドでプロジェクトをLaravel10で作成することができます。
末尾の「--prefer-dist "10.*"」でバージョンを指定しているのが重要です。
```ruby:コマンド
motuni@DESKTOP-RMGU015:~$ composer create-project laravel/laravel test-project-v10 --prefer-dist "10.*"
Creating a "laravel/laravel" project at "./test-project-v10"
Installing laravel/laravel (v10.3.3)
  - Installing laravel/laravel (v10.3.3): Extracting archive
Created project in /home/motuni/test-project-v10
```

先ほどと同じようにプロジェクトのディレクトリへ移動後、「php artisan sail:install」を実行すると、sailがインストールできます。
突然対話式になるので、上下キーで移動、対象を選択/解除したい場合はスペースキーでできます。
今回はDBを試しにmariadb11へ変更しています。

```ruby:コマンド
motuni@DESKTOP-RMGU015:~$ cd test-project-v10
motuni@DESKTOP-RMGU015:~/test-project-v10$ php artisan sail:install

 ┌ Which services would you like to install? ───────────────────┐
 │   ◻ mysql                                                  ┃ │
 │   ◻ pgsql                                                  │ │
 │   ◻ mariadb10                                              │ │
 │ › ◼ mariadb11                                              │ │
 │   ◻ redis                                                  │ │
 └────────────────────────────────────────────────── 1 selected ┘
~省略~

   INFO  Sail scaffolding installed successfully. You may run your Docker containers using Sail's "up" command.  
➜ ./vendor/bin/sail up
   WARN  A database service was installed. Run "artisan migrate" to prepare your database:  
➜ ./vendor/bin/sail artisan migrate
```

sailのインストールが完了すると、Laravel11と同じように、コマンドを実行せよと出てきます。
ちなみにここで「.env」を変更し忘れないようにしましょう。(1敗)

```ruby:.env
DB_DATABASE=laravel-test-v10
DB_USERNAME=test
DB_PASSWORD=test
```
```ruby:コマンド
motuni@DESKTOP-RMGU015:~/test-project-v10$ sail up -d
[+] Running 4/4
 ✔ Network test-project-v10_sail              Created                     0.0s 
 ✔ Volume "test-project-v10_sail-mariadb"     Created                     0.0s 
 ✔ Container test-project-v10-mariadb-1       Started                     0.4s 
 ✔ Container test-project-v10-laravel.test-1  Started                     0.7s 
motuni@DESKTOP-RMGU015:~/test-project-v10$ 
```
この段階でちゃんとTopページが開けたのでLaravel11から挙動変わったのかな？
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566232/a2f27899-8085-9bda-fafd-066744cb29fc.png)

sailコマンドも実行指示があったのでやってあげましょう。
無事Laravel10のSail環境も構築できました。
```ruby:コマンド
motuni@DESKTOP-RMGU015:~/test-project-v10$ sail artisan migrate

   INFO  Preparing database.  

  Creating migration table ....................................................... 19ms DONE

   INFO  Running migrations.  

  2014_10_12_000000_create_users_table ........................................... 42ms DONE
  2014_10_12_100000_create_password_reset_tokens_table ........................... 10ms DONE
  2019_08_19_000000_create_failed_jobs_table ..................................... 36ms DONE
  2019_12_14_000001_create_personal_access_tokens_table .......................... 56ms DONE
  ```

## 最後に
Laravelで簡単なWebアプリが作れるので色々楽しんで作っています。
また別記事で自身の備忘のために、Laravelの簡単な流れもまとめていく予定です。
最終的にはkubernetesでLaravelを起動させる所まで実験&記事に出来たらよいなと思っています。

## 参考サイト
・Installation - Laravel 11.x - The PHP Framework For Web Artisans
https://laravel.com/docs/11.x/installation#docker-installation-using-sail

・今更Laravel8+PHP7.4のプロジェクトを構築する
https://zenn.dev/kij/articles/7e6697e6c046bf

・Download Composer
https://getcomposer.org/download/