Skip to content

fix: pak/siteチェックボックスがURL遷移後に実際の選択状態を反映しない不具合を修正 - #190

Merged
128na merged 1 commit into
masterfrom
worktree-fix-checkbox-state-url-hydration
Aug 16, 2026
Merged

fix: pak/siteチェックボックスがURL遷移後に実際の選択状態を反映しない不具合を修正#190
128na merged 1 commit into
masterfrom
worktree-fix-checkbox-state-url-hydration

Conversation

@128na

@128na 128na commented Aug 16, 2026

Copy link
Copy Markdown
Owner

Summary

#189$paks/$sites#[Url] 化した際に生じた回帰です。URLクエリ文字列からの配列ハイドレート(Livewire\Features\SupportQueryString\BaseUrl)が値を真偽値ではなく文字列 '0'/'1' に変換してしまいます。

PHP側の array_filter()selectedPaks()/selectedSites() で使用)は文字列 '0' をfalsy値として扱うため検索フィルタ自体は正しく動作していましたが、フロントエンドに送られる wire:snapshot のJSON上では非空文字列としてtruthyに評価され、チェックボックスの表示(Livewireのクライアント側JSがJSON値の真偽判定で checked 状態を決めている)が実際の選択状態を反映しなくなっていました。

boot()$paks/$sites を明示的にbool配列へキャストし直すことで補正しました。

Livewire::withQueryParams() でクエリ文字列付きマウントを再現し、修正前は実際に失敗する回帰テストを追加しています。assertSet はゆるい比較('0' == falsetrue)のため検知できず、instance() の値を assertSame で厳密比較する必要がありました(実際に修正を一時的に無効化して失敗することを確認済み)。

Test plan

  • ./vendor/bin/pint --test
  • ./vendor/bin/phpstan analyse(全体、エラーなし)
  • ./vendor/bin/rector process --dry-run(提案を適用済み)
  • php artisan test(67件全て通過)
  • 修正を一時的に無効化して新規テストが実際に失敗することを確認済み
  • wire:snapshot のJSONを直接確認し、修正後は "paks":{"64":false,"128":true,...} のように真偽値として正しくシリアライズされることを確認済み

🤖 Generated with Claude Code

#189で$paks/$sitesを#[Url]化した際、URLクエリ文字列からの配列ハイドレート
(Livewire\Features\SupportQueryString\BaseUrl)が値を真偽値ではなく文字列
'0'/'1'に変換してしまうことに起因する回帰。

PHP側のarray_filter()(selectedPaks()/selectedSites()で使用)は文字列'0'を
falsy値として扱うため検索フィルタ自体は正しく動作していたが、フロントエンド
に送られるwire:snapshotのJSON上では非空文字列としてtruthyに評価され、
チェックボックスの表示(実際にはLivewireのJS側がJSON値の真偽判定でchecked
状態を決めている)が実際の選択状態を反映しなくなっていた。

boot()で$paks/$sitesを明示的にbool配列へキャストし直すことで補正した。
`Livewire::withQueryParams()`でクエリ文字列付きマウントを再現し、修正前は
実際に失敗する回帰テストを追加。assertSetはゆるい比較('0' == falseは
true)のため検知できず、instance()の値をassertSameで厳密比較する必要が
あった。
@128na

128na commented Aug 16, 2026

Copy link
Copy Markdown
Owner Author

セルフレビュー結果

boot()でのpaks/sites boolキャスト補正について、以下の観点でレビューしました。

  • 正しさ: 既にbool値の場合((bool) true/(bool) false)は冪等であり、通常のcheckboxトグル操作(wire:model経由、クライアントJSがbooleanを送信)には影響しない。URLハイドレート由来の'0'/'1'文字列のみを補正する。
  • 検証済みの根拠: 修正前はwire:snapshotのJSON上で"paks":{"64":"0",...}のような非空文字列となりチェックボックスが常にchecked扱いになっていたことを実際のJSON出力で確認。修正後は"paks":{"64":false,...}という正しいJSON booleanになることを確認済み。
  • 回帰テスト: assertSetではなくassertSameによる厳密比較を採用('0' == falseはPHPでtrueのため、緩い比較では検知不可能)。修正を一時的にコメントアウトしてテストが実際に失敗することも確認済み。
  • 副作用: selectedPaks()/selectedSites()array_filterベースのため元々の検索フィルタ挙動に変化なし。既存テストは全てパス(67 passed, 148 assertions)。

Pint / PHPStan(level 9) / Rector 全てクリーン。追加の懸念事項なし。

@128na
128na merged commit 5b02fd7 into master Aug 16, 2026
5 checks passed
@128na
128na deleted the worktree-fix-checkbox-state-url-hydration branch August 16, 2026 14:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant