私の問題を指摘してくれたSlackの@DaveRedfernに狂った小道具。ゼロ以外のインデックス付き配列を渡すと、オブジェクトとして解釈されます。
dump(json_encode([
0 => "ROLE_SITE_DIRECTOR", 2 => "ROLE_TRANSLATOR", 1 => "ROLE_DATA_ENTRY",
]));
dump(json_encode(array_values([
0 => "ROLE_SITE_DIRECTOR", 2 => "ROLE_TRANSLATOR", 1 => "ROLE_DATA_ENTRY",
])));
出力は次のようになります:
"{"0":"ROLE_SITE_DIRECTOR","2":"ROLE_TRANSLATOR","1":"ROLE_DATA_ENTRY"}"
"["ROLE_SITE_DIRECTOR","ROLE_TRANSLATOR","ROLE_DATA_ENTRY"]"
したがって、修正は簡単です。私のセッターです:
$this->roles = array_values($roles);
今後は、データベースとロールの関係を使用することもお勧めします。 JSONデータによる検索は楽しいものではありませんが、結合では標準的な方法です。