はじめに
めんどくさいことが嫌いです。
めんどくさいことを避けるために、日々努力を怠らず生きてきました。
Laravelを触り始めて1年半くらいになったので、その生活の一部始終を紹介したいとおもいます。
LaravelのVersionは6系です。
1. migrationの変更がめんどくさい
migrationでテーブル定義を変更するとき、変更用のmigrationを作るのがめんどくさい。
migrations以下のファイルが爆裂的に増えてしまうし、いちいちxxxxx->change()
とか書きたくない。
1-A. 解決策
変更したいmigrationを直で編集する。
編集後は下のコマンドを実行する。
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 artisan optimize:clear
キャッシュはなければ読みに行ってくれます。
config
だけではなく、routes
についても同様です。
開発中は些細なパフォーマンスを気にする必要がないので、このほうがいいですね。
キャッシュなんて要らなかったんや。。
本番環境ではちゃんとキャッシュを使いましょう。
php artisan optimize
OPcacheも導入したほうがいいみたいですね。
参考:OPcache導入してみた!(速さ検証もあるよ!) - Qiita
3. php artisan make:XXXXX
がめんどくさい
平凡なCRUD作るのにも、
- Model
- Controller
- migration
- seed
- factory
など、たくさんファイルを作らなかきゃいけないのでだるい。
3-A. 解決策
以下のコマンドで一撃作成できる。
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::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
トレイトを使う。
...
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
トレイトを使う。
※ 以下、テスト用データの分け方。
...
'mysql' => [
...
],
'mysql_testing' => [
// 'mysql'の内容をCopyして以下のみ変更 (※ mysqlを使う場合)
'database' => 'hogehoge_testing',
],
<?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>
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で対象フォルダの変更を監視して、トリガーされたら必要なコマンドを実行する。
# インストール
npm i -D gulp gulp-shell
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'));
});
# 監視タスクのスタート
npx gulp
これなら編集後にいつも勝手に必要なコマンドを実行するのでよいです。
無理やりすぎですが。
(番外編) POSTMANでリクエストを作るとき、AcceptやTokenの編集がめんどくさい
Laravelではないですが、APIサーバー用のリクエストを作るときに、
-
HeaderのAcceptを
application/json
にするのがめんどくさい。 -
ログインしたときに、返ってきたTokenをAuthorizationに設置するのがめんどくさい。
といった問題があります。
番外編1の解決策
コレクションフォルダのEDIT COLLECTION
で以下のPre-request Script
を記述
pm.request.headers.upsert({key: "Accept", value: "application/json"})
これでコレクションフォルダごとHeaderのAcceptをapplication/json
にできる。
なんか、設定の仕方を知らないだけな気がしていますが。。
番外編2の解決策
リクエストの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を以下のようにする。
返ってきたTokenを環境変数user_access_token
に入れて、ログインが必要なリクエストのAuthorizationでそれを使っています。
Tokenの有効期限をなくすだけだとユーザーを変えられないが、これなら変えられるので開発が楽になる!