Osumi Framework
es en eu v9.8.0 GitHub

Datu Transferentzia Objektuak (DTOak)

Osumi Framework-eko DTOak (Data Transfer Objects) HTTP eskaera batetik datozen sarrera datuak jasotzeko, normalizatzeko eta balioztatzeko erabiltzen diren klase sinpleak dira.

Osagaiek idatzitako eta balioztatutako eskaera balioak, goiburuak edo iragazki irteerak atzitzeko modu egituratu eta segurua eskaintzen dute.

DTO batek ODTO hedatu behar du eta bere eremuak definitu #[ODTOField] atributua erabiliz.


1. DTO baten helburua

DTOak honetarako diseinatuta daude:

Osagai batek definitzen duenean:

public function run(MovieDTO $dto): void

...framework-ak automatikoki:

  1. MovieDTO instantziatzen du.
  2. Eskaeraren datuak kargatzen ditu.
  3. Bere atributuetan definitutako balidazio arauak aplikatzen ditu.
  4. DTO osagaiaren run() metodoan txertatzen du.

2. Oinarrizko klasea: ODTO

ODTO klaseak islapena erabiltzen du DTOko propietate publiko guztiak ikuskatzeko, haien #[ODTOField] definizioak irakurtzeko eta datuak horren arabera kargatzeko.

2.1 Datuak kargatzeko prozesua

ODTOk balioak lehentasun-ordena honetan kargatzen ditu:

  1. Iragazkiaren emaitza Eremu batek filter eta filterProperty definitzen baditu, balioa hemendik hartzen da:

    $req->getFilter($filterName)[$filterProperty]
    
  2. Goiburuaren balioa Eremu batek header: 'X-Header' definitzen badu, balioa hemendik hartzen da:

    $req->getHeader('X-Header')
    
  3. Eskaera-parametroak Balioa propietate motaren arabera aldatzen da:

2.2 Balidazioa

Balio guztiak kargatu ondoren, ODTOk automatikoki egiaztatzen du:

Erroreak barnean gordetzen dira eta honen bidez berreskura daitezke:

$dto->getValidationErrors();

DTO baliozkoa den egiaztatu dezakezu honekin:

$dto->isValid();

3. ODTOField atributua

ODTOField atributua DTO propietate bakoitza konfiguratzeko erabiltzen da:

#[ODTOField(
  required: false,
  requiredIf: null,
  filter: null,
  filterProperty: null,
  header: null
)]

Atributuen aukerak

Atributua Deskribapena
required Eremuak balio bat izan behar du.
requiredIf Eremua beharrezkoa da beste eremu batek balio bat badu bakarrik.
filter Eremua betetzeko irteera erabili behar den iragazkiaren izena.
filterProperty Erabili beharreko iragazkiaren irteera-matrizearen gakoa.
header Balioa irakurtzeko HTTP goiburuaren izena.

Aukera hauek konbinazio indartsuak ahalbidetzen dituzte, hala nola erabiltzaile-IDak iragazkietatik lortzea, API tokenak goiburuetatik ateratzea edo DTO eremuen arteko baldintzapeko mendekotasunak betearaztea.


4. DTO adibidea

Zure proiektuko adibidea:

class MovieDTO extends ODTO {
  #[ODTOField(required: true)]
  public ?int $idCinema = null;

  #[ODTOField(required: true)]
  public ?string $name = null;

  #[ODTOField(required: true)]
  public ?string $cover = null;

  #[ODTOField(required: true)]
  public ?int $coverStatus = null;

  #[ODTOField(required: true)]
  public ?string $ticket = null;

  #[ODTOField(required: true)]
  public ?string $imdbUrl = null;

  #[ODTOField(required: true)]
  public ?string $date = null;

  #[ODTOField(required: true)]
  public ?array $companions = null;

  #[ODTOField(required: true, filter: 'Login', filterProperty: 'id')]
  public ?int $idUser = null;
}

DTO honek:


5. DTO bat osagai baten barruan erabiltzea

class AddMovieComponent extends OComponent {
  public function run(MovieDTO $dto): void {
    if (!$dto->isValid()) {
      $this->errors = $dto->getValidationErrors();
      return;
    }

    $movie = new Movie();
    $movie->name = $dto->name;
    $movie->date = $dto->date;
    $movie->idUser = $dto->idUser;
    $movie->save();
  }
}

Oharrak:


6. Praktika onak


7. Noiz erabili DTOak

DTOak aproposak dira honetarako: