PHP
laravel
docker
LaraDock

LaravelとLaradockでプロジェクトを始めるときに見るメモ

絶賛追記中です。

概要

Laravelで新規プロジェクトを立ち上げる機会が多くなり、
毎回「最初にこれ考えとけばよかった!」ってのが出てくるので、まとめて見ました!

以下の環境で作ります。

  • Mac
  • Laravel 5.7
  • Laradock
  • heroku

開発の進め方

以下の手順で進めていきます。

  • 開発環境構築
  • Laravelで開発前に決めておくべきこと
  • DBマイグレーションファイルの作成
  • Seederの作成
    • リレーションを意識してSeederを最初に作っておくと以下の利点があります。
    • DB設計不備を発見できる。型やサイズ、リレーションなど。
    • Modelにリレーションを記述する必要があるので、開発中に同時にModelに手が入る事が少なくなる。
    • リレーションのサンプルが出来るので、それを参考にメンバーが開発しやすくなる。
  • 開発
  • デプロイ

開発環境構築

Laradockを利用します。
Vagrantで構築するより軽いのと、ミドルウェアを疎結合にして、実際の本番環境の近づけるためです。

サンプルはこちら
https://github.com/naoki0531/template-laravel

構成

本番へアップするソースになるべく不純物を入れたくないので、以下のような構成にします。
開発環境用リポジトリを作り、srcフォルダ内へLaravelのソースリポジトリをクローンする形にします。

開発環境用リポジトリ
└ laradock/
└ src/
└ data/

ファイル名 用途
aradock/ laradockリポジトリ
src/ Laravelのソースリポジトリ
data/ mysqlなどのデータ永続化フォルダ
README.md 手順を記載
.env.laradock laradock用の.envファイル

前準備

  • git
  • docker for mac
  • docker-compose
  • 開発環境用リポジトリ
  • Laravelソースリポジトリ

開発環境用リポジトリの作成

$ mkdir {プロジェクト名}
$ cd {プロジェクト名}
$ git init

永続化dataディレクトリの作成

laradockで実行されるmysqlなどのデータがここに格納されます。

$ mkdir data
$ touch data/.gitkeep

gitignore作成

dataディレクトリの直下のデータとsrcディレクトリをgitの管理外へ。
他、エディタの設定ファイルなどあればここへ追加。

$ vi .gitignore
src
data
!data/.gitkeep

# phpstormの設定ファイル
.idea

envファイル作成

手順をなるべく減らしたいので、laradockの.envの雛形を開発用リポジトリに入れておきます。

$ git submodule add https://github.com/laradock/laradock.git
$ cp laradock/env-example .env.laradock
$ vi .env.laradock
# ソースと永続化データフォルダのパス変更
APP_CODE_PATH_HOST=../src
DATA_PATH_HOST=../data

# NGINXのポートを変更
NGINX_HOST_HTTP_PORT=8080

# MYSQL
MYSQL_DATABASE={データベース名}
MYSQL_USER={ログインユーザー名}
MYSQL_PASSWORD={パスワード}

READMEの作成

上から実行していくだけで環境が見れる状態を作ります。

$ vi README.md

バックスラッシュは削除してください。

# initial setting
\```bash
$ git clone {開発環境用リポジトリURL}
$ cd {開発環境用ディレクトリ}
$ git submodule init
$ git submodule update
$ git clone {Laravelのソースリポジトリ} src
$ cp src/.env.example src/.env
$ cp .env.laradock laradock/.env
$ cd laradock
$ docker-compose up -d --build nginx mysql workspace
$ docker-compose exec workspace composer install
$ docker-compose exec workspace npm install
$ docker-compose exec workspace php artisan key:generate
\```
http://localhost:8080/

以下のファイルをコミット

.env.laradock
.gitignore
.gitmodules
README.md
data/.gitkeep
laradock

Laravelリポジトリの作成

laradock実行

$ cp .env.laradock laradock/.env
$ cd laradock
$ docker-compose up -d --build nginx mysql workspace

Laravelプロジェクトの作成

$ docker-compose exec workspace composer create-project laravel/laravel .

Laravelソースリポジトリへコミット

$ cd ../src
$ git init
$ git add .
# 以下省略

動作確認

$ cp .env.example .env
$ cd ../laradock
$ docker-compose exec workspace composer install
$ docker-compose exec workspace php artisan key:generate

http://localhost:8080/

Laravelで開発前に決めておくべきこと

Modelの場所

スクリーンショット 2018-10-13 17.57.45.png

デフォルトではこの位置ですが、自分は好みでModelsフォルダを作成してそこへ格納しています。

以下のようにnamespaceの修正を忘れずに。

User.php
<?php

namespace App\Models;

// ・・・

Serviceクラスの有無

正解はありませんので、アプリ特性を考えて作るか作らないか判断すべきかと思います。
WEBやAPIなどで使い回すロジックが多い場合は作ったほうが良いかもしれません。

ViewComposerの利用

FormValidationの利用

データベース

Laravelのmigrationを利用します。
直接作成するのではなく、Laravelのライブラリを利用して、DBから自動生成する形を取りたいと思います。

準備

まずDBを作るためのER図をMysqlWorkBench を利用して作成します。

  • [File] > [New Model] > [Add Diagram] を選択。
  • 左カラムの [mydb] をダブルクリックして、データベース名を.envで指定したものに変えておきましょう。

スクリーンショット 2018-10-13 12.15.06.png

ER図の作成

画像のアイコンをクリックし、作成していきます。

スクリーンショット 2018-10-13 12.18.21.png

必ずこうしなければならないというわけではないですが、わかりやすいのでORMのデフォルトルールに従って作っていきましょう。

  • データベース名は複数形にする。
  • 中間テーブル以外はAutoincrementのidカラムを作る。
  • アプリケーションの利用で増えていくテーブルにはcreated_atupdated_atdeleted_atをつけておく。
  • 中間テーブルはORMのdetachで物理削除されるのでtimestamp系はつけない。

スクリーンショット 2018-10-13 17.31.18.png

ER図からDBにテーブルを作成

  • [Database] > [Forward Engineer] を選択
  • DBの接続情報を入力して進めると、テーブルが作成されます。

スクリーンショット 2018-10-13 17.21.11.png

できました!

DBからmigrationファイルを作成

  • デフォルトで用意されているuserのマイグレーションファイルを削除。
src
$ rm database/migrations/2014_10_12_000000_create_users_table.php
  • Laravel Migrations Generatorのインストール
laradock
$ docker-compose exec workspace composer require --dev "xethron/migrations-generator"
  • config/app.phpへ追記
app.php
'providers' => [

    // 省略・・・

    Way\Generators\GeneratorsServiceProvider::class,
    Xethron\MigrationsGenerator\MigrationsGeneratorServiceProvider::class,
]
  • app/Providers/AppServiceProvider.phpへ追記
AppServiceProvider.php
    public function register()
    {
        if ($this->app->environment() !== 'production') {
            $this->app->register(\Way\Generators\GeneratorsServiceProvider::class);
            $this->app->register(\Xethron\MigrationsGenerator\MigrationsGeneratorServiceProvider::class);
        }
    }
  • 作成
laradock
$ docker-compose exec workspace php artisan migrate:generate
  • 完成!

スクリーンショット 2018-10-13 17.42.01.png

  • 確認

一応、流せる事を確認しておきましょう。freshで全てのテーブルを削除してから実行してくれます。

laradock
$ docker-compose exec workspace php artisan migrate:fresh

開発

ログイン画面

特に理由がないならば、LaravelのAuthをカスタムしていくのがとても便利です。

Auth実行

laradock
$ docker-compose exec workspace php artisan auth

https対応

ローカルではhttp、
本番ではhttpsにしたいかと思います。
asset()関数をそのまま使うと、全てhttpになってしまいますし、
secure_asset()などに書き換えるのも面倒です。

そこで以下のファイルを書き換えることで、動的に対応されるようになります。

app/http/Middlewares/TrustProxies.php

TrustProxies.php
protected $proxies = '**';

デプロイ

heroku

簡単に公開できるので、よく利用しています。
herokuで公開する手順。

procfileの作成

以下のファイルを作成してmasterへコミット。

laravel/src
$ echo 'web: vendor/bin/heroku-php-apache2 public/' > Procfile