laravel-sail(docker)でlaravel+vue環境を作る方法
Windows環境でlaravel+vue開発環境をサクッと作るための方法です。
事前準備
まずは下記が使える環境を作る必要があります。
- WSL2が使える環境を準備
- Docker Desktopをインストール
- Visual Studio Codeに拡張機能として「Remote – WSL」インストール
ひな形作成
Windows TerminalをWSL2(例:Ubuntu-20.04)で起動し、アプリを作りたいディレクトリに移動
※ /mnt/c/…だと動作が遅いので、/home/username/…に作るのがおすすめ
※devフォルダの下にmyappを作りたい場合は、devフォルダで下記を実行
curl -s https://laravel.build/<アプリ名> | bash
https://qiita.com/kai_kou/items/0e773aaf50698dd5a93f#windows
https://laravel.com/docs/8.x/installation#getting-started-on-windows
不要なサービス停止&phpMyadminを有効化
docker-compose.ymlを編集します。Visual Studio Code(以下、code)を起動し、左下の「WSL」をクリックして上記で作成したアプリフォルダを開きます。その中にあるdocker-compose.ymlを下記のように編集します。
# For more information: https://laravel.com/docs/sail
version: '3'
services:
laravel.test:
build:
context: ./vendor/laravel/sail/runtimes/8.1
dockerfile: Dockerfile
args:
WWWGROUP: '${WWWGROUP}'
image: sail-8.1/app
extra_hosts:
- 'host.docker.internal:host-gateway'
ports:
- '${APP_PORT:-80}:80'
environment:
WWWUSER: '${WWWUSER}'
LARAVEL_SAIL: 1
XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
volumes:
- '.:/var/www/html'
networks:
- sail
depends_on:
- mysql
# - redis
# - meilisearch
# - selenium
mysql:
image: 'mysql/mysql-server:8.0'
ports:
- '${FORWARD_DB_PORT:-3306}:3306'
environment:
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
MYSQL_ROOT_HOST: "%"
MYSQL_DATABASE: '${DB_DATABASE}'
MYSQL_USER: '${DB_USERNAME}'
MYSQL_PASSWORD: '${DB_PASSWORD}'
MYSQL_ALLOW_EMPTY_PASSWORD: 1
volumes:
- 'sail-mysql:/var/lib/mysql'
networks:
- sail
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
retries: 3
timeout: 5s
# redis:
# image: 'redis:alpine'
# ports:
# - '${FORWARD_REDIS_PORT:-6379}:6379'
# volumes:
# - 'sail-redis:/data'
# networks:
# - sail
# healthcheck:
# test: ["CMD", "redis-cli", "ping"]
# retries: 3
# timeout: 5s
# meilisearch:
# image: 'getmeili/meilisearch:latest'
# ports:
# - '${FORWARD_MEILISEARCH_PORT:-7700}:7700'
# volumes:
# - 'sail-meilisearch:/data.ms'
# networks:
# - sail
# healthcheck:
# test: ["CMD", "wget", "--no-verbose", "--spider", "http://localhost:7700/health"]
# retries: 3
# timeout: 5s
# mailhog:
# image: 'mailhog/mailhog:latest'
# ports:
# - '${FORWARD_MAILHOG_PORT:-1025}:1025'
# - '${FORWARD_MAILHOG_DASHBOARD_PORT:-8025}:8025'
# networks:
# - sail
# selenium:
# image: 'selenium/standalone-chrome'
# volumes:
# - '/dev/shm:/dev/shm'
# networks:
# - sail
phpmyadmin:
image: phpmyadmin/phpmyadmin
links:
- mysql:mysql
ports:
- ${MYADMIN_PORT:-8080}:80
environment:
MYSQL_USERNAME: '${DB_USERNAME}'
MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
PMA_HOST: mysql
networks:
- sail
networks:
sail:
driver: bridge
volumes:
sail-mysql:
driver: local
sail-redis:
driver: local
sail-meilisearch:
driver: local
上記の例では、redis・meilisearch・mailhog・seleniumをストップし、phpMyadminをいれています。そのあと、codeのターミナルでdockerを動かせばOKです。phpmyAdminへのログイン情報は.envに記載されているDB_USERNAME、DB_PASSWORDを参照。
cd <該当アプリフォルダ>
./vendor/bin/sail up -d
割と時間かかります(/home/username/…であれば割と速い)
他にsailで稼働させているcontainerがあるとポートバッティングで動作しないので、他をsail downさせておく。
バックグラウンドで起動しているので、止める場合は下記コマンド。
./vendor/bin/sail stop
laravel起動テスト
この状態でもlaravelの基本ページは表示できるように名ているので、「http://localhost/」 へアクセスすると立ち上がっていることが確認できます。
Windows上からWSL2で作成したファイルを見る場合は「\\wsl$\Ubuntu-20.04」を開ければ、開けばいいのだがエラーでうまく開けない場合はネットワークドライブに割り当てることで開くことが可能(https://github.com/microsoft/WSL/issues/5718)
毎回./vendor/bin/sail と記載するのが面倒なのでエイリアス設定をして短縮することができます!
alias sail='[ -f sail ] && bash sail || bash vendor/bin/sail'
https://readouble.com/laravel/8.x/ja/sail.html
Vue3 & vue-routerインストール
最新Vue3をインストールして進めます。
sail npm install vue@next
webpack.mix.jsを下記のように編集します。(codeでctrl+p→webpack.mix.js)
mix.js('resources/js/app.js', 'public/js')
.postCss('resources/css/app.css', 'public/css', [
//
]).vue();
npmでビルドします。
sail npm run dev
この処理の中でpackage.jsonにvue-loaderが追加されるので再度npmでビルドします。
sail npm run dev
ここまででvue3がインストールされたので続いて、vue3に対応したvue-routerをインストールします。
sail npm install vue-router
resource/jsにroutes.jsを作成します。
import HomeComponent from './components/Home.vue';
import { createRouter, createWebHistory } from 'vue-router';
const routes = [
{
path: "/",
component: HomeComponent,
name:'home',
},
];
const router = createRouter({
routes, // short for `routes: routes`
history: createWebHistory(),
})
export default router;
ルーティング先のvueファイルをresource/js/componentsに配置するようにしたいので、resource/jsにcomponentsフォルダを作成します。そのフォルダの中にHome.vueを作成します。
<template>
<h1>Home Page</h1>
</template>
app.jsを下記のように修正します。
require('./bootstrap');
import router from "./routes";
import { createApp } from 'vue';
const app = createApp({}).use(router).mount('#app');
この状態ではlaravelのweb.phpによりルーティングされて、welcome.blade.phpが呼び出されるのでvueが表示できるように修正します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>Example</title>
<link rel="stylesheet" href="{{ mix('css/app.css') }}">
</head>
<body>
<div id="app">
<div id="nav">
<router-link to="/">Home</router-link>
</div>
<router-view/>
</div>
</div>
<script src="{{ mix('js/app.js') }}"></script>
</body>
</html>
https://chigusa-web.com/blog/laravel-vue3/
vue起動テスト
sail npm run dev
エラーがなければ、ブラウザから「http://localhost/」でアクセスしてみて表示されればOKです!
Xdebugによるデバッグ環境構築
codeで拡張機能「PHP Debug」をインストールします。
最新のsailにはすでにXdebugが組み込まれているので、そのまま使うことが可能です!
codeの「実行とデバッグ」で「lanch.sonファイルを作成」をクリックし、PHPを選択し、下記のように修正してください。
{
// IntelliSense を使用して利用可能な属性を学べます。
// 既存の属性の説明をホバーして表示します。
// 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"stopOnEntry": true,
"port": 9003,
"pathMappings": {
"/var/www/html": "${workspaceFolder}"
},
"hostname": "localhost",
"xdebugSettings": {
"max_data": 65535,
"show_hidden": 1,
"max_children": 100,
"max_depth": 5
}
},
{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 0,
"runtimeArgs": [
"-dxdebug.start_with_request=yes"
],
"env": {
"XDEBUG_MODE": "debug,develop",
"XDEBUG_CONFIG": "client_port=${port}"
}
},
{
"name": "Launch Built-in web server",
"type": "php",
"request": "launch",
"runtimeArgs": [
"-dxdebug.mode=debug",
"-dxdebug.start_with_request=yes",
"-S",
"localhost:0"
],
"program": "",
"cwd": "${workspaceRoot}",
"port": 9003,
"serverReadyAction": {
"pattern": "Development Server \\(http://localhost:([0-9]+)\\) started",
"uriFormat": "http://localhost:%s",
"action": "openExternally"
}
}
]
}
続いてSailのデバッグ設定として、.envファイルに下記の一行を追加します。
SAIL_XDEBUG_MODE=develop,debug
.envを編集後にsailを再スタートさせます。
laravelで実装したAPI等のテストをする場合は、URLパラメータに下記を付ける必要があります。
「?XDEBUG_SESSION_START=session_name」
実際に使う場合は、codeでブレークポイントを設定し、F5を押してデバッグ状態にします。
https://chigusa-web.com/blog/laravel-sail-xdebug/
ttps://qiita.com/nnaoi/items/7f21623de61fa612ba97
データベースを作る
- sail artisan make:migration create_users_table
※Usersテーブルを作る場合のマイグレーションファイル作成 - 既にあるやつはいったん消す(他のマイグレーションファイル)
- 0から新規作成→ sail artisan migrate:fresh
参考:https://readouble.com/laravel/5.3/ja/migrations.html (数とかいろいろあって便利)
参考:https://qiita.com/rope19181/items/c7862f9a0a22443ddb48
参考:https://qiita.com/somebody_gp/items/c41a2fc68205a850ff96
マイグレーションでカラムを追加する場合は、マイグレーションファイルのcreateをtableに変更
初期データを作る
参考URLの内容で各コマンドにsailを付けて実行
sail artisan make:seeder xxxxTableSeeder
database/seeders/の中に、xxxxTableSeeder.phpが作成されるので、下記を追加。
上部に
use Illuminate\Support\Facades\DB;
run()内に
DB::table('xxxx')->insert([ ["カラム名"=>"値"] ]);
DatabaseSeeder.phpに新規作成したやつを追加する。
$this->call(xxxxTableSeeder::class);
そのあとは下記のコマンドで、データベースと初期データが作成されます。
sail artisan migrate:fresh
sail artisan db:seed
全般的なところ
- 初期化したり、データを作ったタイミングでコミットしておきたい
- Laravelのバージョンを確認する➡sail artisan –version
モデルでデータベース操作
読み出し方法は下記を参考に。モデルを使うときは設定が必要。
- https://nebikatsu.com/7070.html/
- https://nebikatsu.com/8211.html/
- https://qiita.com/toro_ponz/items/b33c757cb7ba5bb48ed4
mixhostでlaravelを動かす
お試しであれば下記の方法でもよいかも。。ただし、時間がかかる。
laravelでスケジューラを設定してcron処理
コマンドを作成して、スケジューラを設定することでlaravelでcron処理をしました。laravelにたいして、サーバー上でcronからlaravelに設定する必要あり。スケジューリングはlaravel側で実施。
また、タイムゾーン設定によっては0時きっかりに処理等がされないため、タイムゾーンを設定する必要あり。
https://reffect.co.jp/laravel/laravel-task-schedule-cron
ローカル環境でスケジューラ動作を試す際には、Laravel Sailのコンテナ内でcronを設定するよりlaravel8から追加された「php artisan schedule:work」を使うとフォアグラウンドで実行されます。Laravel Sailで使うのであれば↓になります。
sail artisan schedule:work
https://laravel.com/docs/8.x/scheduling#running-the-scheduler-locally
ディスカッション
コメント一覧
まだ、コメントがありません