Szalone rekwizyty dla @Dave'a Redferna na Slacku, który zwrócił mi uwagę na mój problem. Podczas przekazywania niezerowej tablicy indeksowanej jest ona interpretowana jako obiekt.
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",
])));
wyjściem będzie:
"{"0":"ROLE_SITE_DIRECTOR","2":"ROLE_TRANSLATOR","1":"ROLE_DATA_ENTRY"}"
"["ROLE_SITE_DIRECTOR","ROLE_TRANSLATOR","ROLE_DATA_ENTRY"]"
Więc poprawka jest prosta, jestem moim seterem:
$this->roles = array_values($roles);
Idąc dalej, lepszą praktyką jest również używanie relacji bazy danych do ról. Wyszukiwanie według danych JSON nie jest zabawne, ale w łączeniu jest standardową praktyką.