🐳
Laravel Sailで作成したプロジェクトをGitHub Codespacesで扱う
状況
Laravel Sail で作成したプロジェクトが存在する.GitHub でコードを管理しているので Codespaces で扱いたい.
が、Sail のコンテナを起動しても URL が localhost で固定されているため,最初のページ以外 Codespaces からアクセスできない.
解決策
Sail コンテナの起動
まず Codespaces でプロジェクトを開いてプロジェクトを動かす.
# 必要なディレクトリを用意
mkdir -p storage/framework/cache/data/
mkdir -p storage/framework/app/cache
mkdir -p storage/framework/sessions
mkdir -p storage/framework/views
# 依存関係のインストール
docker run --rm \
-u "$(id -u):$(id -g)" \
-v $(pwd):/var/www/html \
-w /var/www/html \
laravelsail/php82-composer:latest \
composer install --ignore-platform-reqs
# .envファイルの作成
# .envの内容は作成したプロジェクトに合わせておく.
cp .env.example .env
# コンテナの起動
./vendor/bin/sail up -d
# キーの生成とマイグレーション
./vendor/bin/sail php artisan key:generate
./vendor/bin/sail php artisan migrate
.env ファイルの修正
このままだとアプリケーションの URL が localhost になって最初のページ以外読み込まないので以下のように修正する.
-
.env
ファイルのAPP_ENV
をcodespaces
に変更 -
.env
ファイルのAPP_URL
を Codespaces の URL(コンテナ起動した時に出てくる URL)に変更
APP_NAME=Laravel
APP_ENV=codespaces
APP_KEY=base64:hogehogefugafuga
APP_DEBUG=true
APP_TIMEZONE=UTC
APP_URL=https://hoge-fuga-piyo-80.app.github.dev/
Provider の修正
このままだと、なぜか .env
ファイルの内容が反映されないので app/Providers/AppServiceProvider.php
の boot
メソッドに以下のコードを追加する.
public function boot(): void
{
if (config('app.env') === 'codespaces') {
URL::forceRootUrl(config('app.url'));
if (str_contains(config('app.url'), 'https://')) {
URL::forceScheme('https');
}
}
}
内容を反映
最後に以下のコマンドを実行して設定を反映させる.
./vendor/bin/sail artisan config:cache
INFO Configuration cached successfully.
まとめ
なぜか .env
ファイルの内容が反映されない現象が起きてハマった. Provider で強制的に URL を変更することで解決した.他に影響が出たらまた追記する.
以上だ( `・ω・)b
Discussion