10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ジーズアカデミー Advent Calendar 2020

Day 3

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

Last updated at Posted at 2020-12-02

はじめに

めんどくさいことが嫌いです。

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

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

LaravelのVersionは6系です。

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

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

1-A. 解決策

変更したいmigrationを直で編集する。

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

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. 解決策

キャッシュを使わない。

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

path/your/project
php artisan optimize:clear

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

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

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

path/your/project/production
php artisan optimize

OPcacheも導入したほうがいいみたいですね。
参考:OPcache導入してみた!(速さ検証もあるよ!) - Qiita

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

平凡なCRUD作るのにも、

  • Model
  • Controller
  • migration
  • seed
  • factory

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

3-A. 解決策

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

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ですね。

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

どかんと初期投入or複数追加したいときはLaravelDB.comを使わせてもらっています!
参考:Laravel DB.com 操作マニュアル。 〜コード書かずに超スピード開発(DEMO動画あり)〜 - Qiita

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

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

4-A-1. 解決策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. 解決策2(テスト用データを分けたい場合)

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

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

config/database.php
        ...
        'mysql' => [
            ...
        ],
        'mysql_testing' => [
            // 'mysql'の内容をCopyして以下のみ変更 (※ mysqlを使う場合)
            'database' => 'hogehoge_testing',
        ],
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>
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で対象フォルダの変更を監視して、トリガーされたら必要なコマンドを実行する。

path/your/project
# インストール
npm i -D gulp gulp-shell
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'));
});
path/your/project
# 監視タスクのスタート
npx gulp 

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

無理やりすぎですが。

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

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

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

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

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

番外編1の解決策

コレクションフォルダのEDIT COLLECTIONで以下のPre-request Scriptを記述

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

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

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

番外編2の解決策

リクエストのTestsに以下のコードを記述し、環境変数を使う。

リクエストの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

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

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

10
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?