ずぼらなLaravel職人生活の一部始終

## はじめに
めんどくさいことが嫌いです。

めんどくさいことを避けるために、日々努力を怠らず生きてきました。

Laravelを触り始めて１年半くらいになったので、その生活の一部始終を紹介したいとおもいます。

LaravelのVersionは6系です。

## 1. migrationの変更がめんどくさい

migrationでテーブル定義を変更するとき、変更用のmigrationを作るのがめんどくさい。
migrations以下のファイルが爆裂的に増えてしまうし、いちいち`xxxxx->change()`とか書きたくない。

### 1-A. 解決策
変更したいmigrationを直で編集する。

編集後は下のコマンドを実行する。

```php:path/your/project
php artisan migrate:fresh --seed // db:seedも必要な場合
php artisan migrate:fresh // db:seedが要らない場合
```
これで一旦DBが削除されて(`php artisan db:wipe`)、もう一度migrateされるため、変更が反映されます。

ちなみに、`refresh`だと一旦ロールバックするため、履歴を正しく管理していない場合怒られるので`fresh`を使っています。

## 2. `php artisan config:cache`がめんどくさい

configを変更するたびにコマンドを入力しなきゃいけないだなんて。。

### 2-A. 解決策
キャッシュを使わない。

すでにキャッシュがある場合は下のコマンドで削除する。

```php:path/your/project
php artisan optimize:clear
```

キャッシュはなければ読みに行ってくれます。
`config`だけではなく、`routes`についても同様です。

開発中は些細なパフォーマンスを気にする必要がないので、このほうがいいですね。
キャッシュなんて要らなかったんや。。

本番環境ではちゃんとキャッシュを使いましょう。

```php:path/your/project/production
php artisan optimize
```
[OPcache](https://qiita.com/morimorim/items/fb39ae7d673a8b88f413)も導入したほうがいいみたいですね。
参考：[OPcache導入してみた！（速さ検証もあるよ！） \- Qiita](https://qiita.com/morimorim/items/fb39ae7d673a8b88f413)

## 3. `php artisan make:XXXXX`がめんどくさい

平凡なCRUD作るのにも、

- Model
- Controller
- migration
- seed
- factory

など、たくさんファイルを作らなかきゃいけないのでだるい。

### 3-A. 解決策

以下のコマンドで一撃作成できる。

```shell:path/your/project
php artisan make:model Models/HogeHoge -a // ModelsフォルダにModelを設置している
php artisan make:model Models/HogeHoge -a --api // API用のコントローラーが欲しい場合

# 以下が作成される
app/Http/Controllers/HogeHogeController.php
app/Models/HogeHoge.php
database/factories/HogeHogeFactory.php
database/migrations/2020_12_25_000000_create_hoge_hoges_table.php
database/seeds/HogeHogeSeeder.php
```

あとはルーティングを追加するだけで準備OKですね。

```php:route/api.phpなど
Route::resouce('hogehoges','HogeHogeController'); 
Route::apiResouce('hogehoges','HogeHogeController'); // API用
```

どかんと初期投入or複数追加したいときは[LaravelDB.com](https://laraveldb.com/index.php)を使わせてもらっています！
参考：[Laravel DB\.com 操作マニュアル。 〜コード書かずに超スピード開発（DEMO動画あり）〜 \- Qiita](https://qiita.com/daisu_yamazaki/items/068595670bdc2b6fe3fc)

## 4. テスト用データの`db:seed`がめんどくさい

モデル数が増えてくると`db:seed`も結構な時間がかかってしまうのでダルい。。

### 4-A-1. 解決策１

テスト用データを分けずに`DatabaseTransactions`トレイトを使う。

```tests/TestCase.php
...
use Illuminate\Foundation\Testing\DatabaseTransactions; // 追加

...
abstract class TestCase extends BaseTestCase
{
    ...
    use DatabaseTransactions; //追加
    ...
}
```

`DatabaseTransactions`トレイトを使うと、テストコード中に含まれるDB操作がテスト終了後に戻される。
※ 内部的にはテスト内の処理がトランザクションで囲われる

DBが汚れることがなく`db:seed`をやり直す必要がなくていいですね。

### 4-A-2. 解決策２（テスト用データを分けたい場合）

テスト用データを分けたい場合は、必要なときだけ`migrate:fresh --seed`してからやはり`DatabaseTransactions`トレイトを使う。

※ 以下、テスト用データの分け方。

```php:config/database.php
        ...
        'mysql' => [
            ...
        ],
        'mysql_testing' => [
            // 'mysql'の内容をCopyして以下のみ変更 （※ mysqlを使う場合）
            'database' => 'hogehoge_testing',
        ],
```

```xml:phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
         bootstrap="vendor/autoload.php"
         colors="true">
    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>

        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
        </whitelist>
    </filter>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="DB_CONNECTION" value="mysql_testing"/> <!-- 追加 -->
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
    </php>
</phpunit>
```

```shell:path/your/project
php artisan migrate:fresh --database=mysql_testing --seed # テスト用データを用意
./vendor/bin/phpunit --testdox # テスト実行
```

`RefreshDatabase`トレイトを使うと毎回空になっちゃってめんどいのです。


## 5. とにかくコマンド打つのががめんどくさい

- `composer dump-autoload`
- `php artisan migrate:fresh --seed`
- `./vendor/bin/phpunit --testdox`

などのコマンドを打つ場面があり、だるい。

### 5-A. 解決策

gulpで対象フォルダの変更を監視して、トリガーされたら必要なコマンドを実行する。

```shell:path/your/project
# インストール
npm i -D gulp gulp-shell
```

```javascript:gulpfile.js
var gulp = require('gulp');
var shell = require('gulp-shell');

gulp.task('default', function() {
  // database以下の変更を監視
  var dbWatcher = gulp.watch(
    [
      'database/**/*.php',
    ]
  );
  dbWatcher.on('change',shell.task('composer dump-autoload && php artisan migrate:fresh --seed'));

  // tests以下の変更を監視
  var testWatcher = gulp.watch(
    [
      'tests/**/*.php',
    ]
  );
  testWatcher.on('change',shell.task('./vendor/bin/phpunit --testdox'));
});
```

```shell:path/your/project
# 監視タスクのスタート
npx gulp 
```

これなら編集後にいつも勝手に必要なコマンドを実行するのでよいです。

無理やりすぎですが。

## (番外編) POSTMANでリクエストを作るとき、AcceptやTokenの編集がめんどくさい

Laravelではないですが、APIサーバー用のリクエストを作るときに、

1. HeaderのAcceptを`application/json`にするのがめんどくさい。

2. ログインしたときに、返ってきたTokenをAuthorizationに設置するのがめんどくさい。

といった問題があります。

### 番外編1の解決策
コレクションフォルダの`EDIT COLLECTION`で以下の`Pre-request Script`を記述

```javascript
pm.request.headers.upsert({key: "Accept", value: "application/json"})
```

これでコレクションフォルダごとHeaderのAcceptを`application/json`にできる。

なんか、設定の仕方を知らないだけな気がしていますが。。

### 番外編2の解決策
リクエストの`Tests`に以下のコードを記述し、環境変数を使う。

```javascript:リクエストのTests
// bearerがheaderで返ってくる場合。それぞれの認証方式に合わせて編集してください
pm.test("Set access token", function () {
    var auth = pm.response.headers.get('Authorization');
    var bearer = auth.split(' ');
    pm.environment.set("user_access_token", bearer[1]);
});
```

ログインが必要なリクエストのAuthorizationを以下のようにする。
![スクリーンショット 2020-11-28 23.16.37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888169/19eb049c-f2ca-8591-682c-a51fa99be76e.jpeg)

返ってきたTokenを環境変数`user_access_token`に入れて、ログインが必要なリクエストのAuthorizationでそれを使っています。

Tokenの有効期限をなくすだけだとユーザーを変えられないが、これなら変えられるので開発が楽になる！