W tej chwili dane wejściowe są w formie zwykłej tablicy, a chcę aby dało się co nich dostać poprzez gettery.
Po co?
A oto przykładowe dane:
TestController.php on line 44:
array:3 [▼
"effectiveDate" => "2024-03-11"
"sourceId" => 1
"rates" => array:33 [▼
0 => array:3 [▶]
1 => array:3 [▶]
2 => array:3 [▼
"currency" => "dolar australijski"
"code" => "AUD"
"mid" => 2.5986
]
3 => array:3 [▶]
4 => array:3 [▶]
5 => array:3 [▶]
6 => array:3 [▶]
7 => array:3 [▶]
Co do tej tablicy, to niby to jest tablica w PHP, tak. Ale semantycznie temu jest bliżej do obiektu JS'a. Są nazwane klucze, więc tak na prawdę najlepiej to określić po prostu "strukturą".
Ale co do tego co próbujesz zrobić - to od razu Ci powiem, że takie mapowanie 1:1 tego nie jest dobre - uzależniasz interfejs wejściowy Twojej aplikacji z persystencją, a to nigdy nie jest dobry pomysł.
Jeśli koniecznie chcesz to przemapować, to możesz zrobić to tak:
readonly class Exchange {
public function construct(
public string $effectiveDate,
public int $sourceId,
public array $rates) {}
}
read class Rate {
public function construct(
public string $currency,
public string $code,
public float $mid
) {}
}
$inputArray = []; // Tutaj jest ten Twój array z przykładu który wkleiłeś
function parseExchange(array $structure): Exchange {
return new Exchange(
$structure['effectiveDate'],
$structure['sourceId'],
\array_map(function (array $rate): Rate {
return new Rate($rate['currency'], $rate['code'], $rate['mid']);
}, $structure['rates']),
);
}
$exchange = parseExchange($inputArray);
$exchange->effectiveDate; // tutaj masz swój date
$exchange->sourceId; // tutaj masz sourceId
$exchange->rate[0]->currency; // tutaj rate
Tylko jak już mówiłem, to jest bardzo zły pomysł, bo ten obiekt, on jest odzwierciedleniem struktury tego arraya, a nie powinien być. On powinien trzymać tylko i wyłącznie to czego potrzebujesz dla swojej domeny i nic więcej, oraz dokładnie w takiej postaci w jakiej potrzebujesz.
Tak czy tak, jak chcesz przesłać te dane dalej, to musisz je wsadzić do obiektu domenowego, i tak czy tak musisz zrobić mapowanie gdzieś. Więć to że sobie przetłumaczysz arraya na takiego DTO, i zamiast zrobić $array['key']
to zrobisz $dto->key
, to to nic nie zmienia. Nadal te same problemy.