Jak umieścić tablicę w obiekcie

0

Witam.
Mam dane przechowywane w tablicy gdzie pierwsza jest data, liczba oraz tablica z 3 wartościami. Chciałbym to wszytko przerzucić do obiektu przy czym z tablicy zrobić array collection. Napisałem kawałek kodu ale niestety przy array collection utkałem. Oto kawałek kodu:

class ExchangeDTO
{
    protected string $effectiveDate;
    protected int $sourceId;
    protected array $rates;

    public function __construct(private RateDTO $rateDTO)
    {
        $this->rateDTO = $rateDTO;
    }

    public  function getDTO(string $effectiveDate, int $sourceId, array $rates)
    {
        $this->setEffectiveDate($effectiveDate);
        $this->setSourceId($sourceId);
        $this->setRates($rates);
    }
0

Nie rozumiem w ogóle co próbujesz zrobić. Co to jest "array collection? Chodzi Ci o jakąś listę z symfony?

0
Riddle napisał(a):

Nie rozumiem w ogóle co próbujesz zrobić. Co to jest "array collection? Chodzi Ci o jakąś listę z symfony?

Docelowo zawartość całego obiektu ma być po drobnej obróbce przesłana do bazy danych. Natomiast doctrine wykorzystujemy właśnie arraycollection. Oczywiście w klasie ExchangeDTO mam umieszczone odpowiednie gettery i settery niestety zapis postaci:
public function setRates(array $rates): void { $this->rates = new ArrayCollection($rates); }
nie działa.

0
kaps napisał(a):
Riddle napisał(a):

Nie rozumiem w ogóle co próbujesz zrobić. Co to jest "array collection? Chodzi Ci o jakąś listę z symfony?

Docelowo zawartość całego obiektu ma być po drobnej obróbce przesłana do bazy danych. Natomiast doctrine wykorzystujemy właśnie arraycollection

Czyli tak na prawdę mówisz o interfejsie wejściowym (Twoje DTO jak mniemam), domenie (ta obróbka o której mówiłeś), oraz persystencji (array collection).

Tak czy tak - pokaż kod.

0
Riddle napisał(a):
kaps napisał(a):
Riddle napisał(a):

Nie rozumiem w ogóle co próbujesz zrobić. Co to jest "array collection? Chodzi Ci o jakąś listę z symfony?

Docelowo zawartość całego obiektu ma być po drobnej obróbce przesłana do bazy danych. Natomiast doctrine wykorzystujemy właśnie arraycollection

Czyli tak na prawdę mówisz o interfejsie wejściowym (Twoje DTO jak mniemam), domenie (ta obróbka o której mówiłeś), oraz persystencji (array collection).

Tak czy tak - pokaż kod.

Oczywiście oto kod całej klasy:

<?php

namespace App\Service\Dto;

use App\Service\Dto\RateDTO;
use Doctrine\Common\Collections\ArrayCollection;
use function Clue\StreamFilter\append;


class ExchangeDTO
{
    protected string $effectiveDate;
    protected int $sourceId;
    protected array $rates;

    public function __construct(private RateDTO $rateDTO)
    {
        $this->rateDTO = $rateDTO;
    }

    public  function getDTO(string $effectiveDate, int $sourceId, array $rates)
    {
        $this->setEffectiveDate($effectiveDate);
        $this->setSourceId($sourceId);
        $this->setRates($rates);
    }


    /**
     * @return string
     */
    public function getEffectiveDate(): string
    {
        return $this->effectiveDate;
    }

    /**
     * @param string $effectiveDate
     */
    public function setEffectiveDate(string $effectiveDate): void
    {
        $this->effectiveDate = $effectiveDate;
    }

    /**
     * @return int
     */
    public function getSourceId(): int
    {
        return $this->sourceId;
    }

    /**
     * @param int $sourceId
     */
    public function setSourceId(int $sourceId): void
    {
        $this->sourceId = $sourceId;
    }

    /**
     * @return array
     */
    public function getRates(): array
    {
        return $this->rates;
    }

    /**
     * @param array $rates
     */
    public function setRates(array $rates): void
    {
        $this->rates = new ArrayCollection($rates);
    }

}

A oto wywołanie klasy:

$dto = $this->exchangeDTO->getDTO($effectiveDate, $sourceId, $rates);
0

Przepraszam, ale nadal nie rozumiem kompletnie co chcesz zrobić.

Podaj przykład danych wejściowych oraz co chcesz dostać na wyjściu.

0
Riddle napisał(a):

Przepraszam, ale nadal nie rozumiem kompletnie co chcesz zrobić.

Podaj przykład danych wejściowych oraz co chcesz dostać na wyjściu.

W tej chwili dane wejściowe są w formie zwykłej tablicy, a chcę aby dało się co nich dostać poprzez gettery. 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 [▶]
1
kaps napisał(a):

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?

kaps napisał(a):

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.

0
Riddle napisał(a):
kaps napisał(a):

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ł.

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.

Bardzo dziękuję Ci za wyczerpującą odpowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1