DTO - Entendendo o que é Data Transfer Object | Dias de Dev

แชร์
ฝัง
  • เผยแพร่เมื่อ 5 ก.พ. 2025
  • DTO ou Data Transfer Object é um padrão muito simples e até por isso às vezes nós pecamos ao explicar sobre ele. Nesse vídeo eu tento diminuir esse problema. Nele nós vamos entender de forma resumida o que pode ser considerado um DTO e em que casos é comum ver o uso dele.
    Se quiser aprender mais sobre programação e tecnologia em geral, aqui tem 15% de desconto na Alura:
    tidd.ly/43UfATs
    E se quiser apoiar o canal e me incentivar a continuar criando conteúdo gratuito, você pode considerar me dar um "Valeu Demais" aqui no TH-cam ou se tornar um "sponsor" lá no GitHub:
    github.com/spo...
    ----------------------------------
    Para mais conteúdos sobre boas práticas de programação, testes, arquitetura de software e tudo que há de bom, não se esqueça de se inscrever e ativar o sininho para receber notificações.
    Para entrar em contato:
    Telegram: t.me/diasdedev
    Twitter: / cviniciussdias
    LinkedIn: / cviniciussdias
    GitHub: github.com/CVi...

ความคิดเห็น • 102

  • @thiaguinhowjj
    @thiaguinhowjj 2 ปีที่แล้ว +70

    Gostei bastante da explicação. Eu gosto de fazer uma analogia bem boba com meu time que o DTO é como se fosse uma sacola de compras de supermercado ou um saco de lixo (esse eu uso pro sentido inverso). O supermercado seria o fornecedor de "dados" que seriam os itens da compra. Você não compra tudo do supermercado, logo, você diz para a sacola (DTO) só o que você precisa ter. Uma vez na sacola você não mexe nelas até chegar em casa (camada de domínio). O mesmo se aplica para o contrário com o saco de lixo. Você não descarta tudo que tem em casa (seus dados), logo, você seleciona o que você vai descartar e esse saco de lixo só vai ser manipulado quando chegar no lixão (camada de response, etc). Parabéns pelo vídeo.

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว +1

      Não conhecia essas analogias. Gostei bastante!
      Muito obrigado!!

  • @adrianoalves-qripto
    @adrianoalves-qripto ปีที่แล้ว +4

    Em Laravel, não cheguei a usar DTO por causa da entidade Request. Uma vez validados tanto as restrições quanto o tipo do dado, basta uma chamada a validated() para ter acesso a todos os dados de uma entidade e repassá-los para dentro do sistema (Service, Repository, Domain, Model etc). E o caminho inverso geralmente é feito com Resources e Resource Collections.
    Obrigado pelo Ótimo Video!

    • @silviolucas2590
      @silviolucas2590 11 หลายเดือนก่อน

      Mas tem como fazer a conversão de dados? Vamos supor que eu receba uma data em formato pt-br do front e queira formatada para ISO... FormRequest faz isso?

  • @melissapereira6957
    @melissapereira6957 11 หลายเดือนก่อน +2

    eu quero um vídeo explicando sobre as arquiteturas.

  • @GuilhermeSouza-ko9ri
    @GuilhermeSouza-ko9ri 2 ปีที่แล้ว

    Valeu Vini!

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Valeu pelo apoio, Guilherme! :-D

  • @valdeciyehoo6247
    @valdeciyehoo6247 ปีที่แล้ว +1

    Valeu! Muito abstrato mas já ajudou!!! Sou novato nisso....

  • @josericardosaraiva5078
    @josericardosaraiva5078 9 หลายเดือนก่อน

    muito bem explicado, tava batendo muita cabeça pra entender kkkk, agora deu certo.

    • @DiasDeDev
      @DiasDeDev  9 หลายเดือนก่อน

      Opa, fico feliz que tenha curtido!

  • @limaelton
    @limaelton 7 หลายเดือนก่อน

    Simplesmente o melhor dev - professor haha que eu tenho conhecimento. Cara vc foi meu primeiro prof de php, agora estou migrando pra c# e você ainda esta me ensinando tanto. Muito obrigado e muita prosperidade pra você!

    • @DiasDeDev
      @DiasDeDev  7 หลายเดือนก่อน +1

      Fico muito feliz em ser útil! :-D

  • @bruno2182
    @bruno2182 2 ปีที่แล้ว +6

    Muito massa!! Fala sobre Symfony messenger e RabbitMQ :D

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว +1

      Quero trazer conteúdos sobre mensageria sim. Mas tem algo em específico desse componente que você queira ver?

    • @bruno2182
      @bruno2182 2 ปีที่แล้ว

      @@DiasDeDev Era mais sobre o assunto em si de mensageria, como usar e porque usar :D

    • @bruno2182
      @bruno2182 2 ปีที่แล้ว

      @@DiasDeDev CQRS faz uso de mensageria? Acho que ia dar num bom video (:

  • @luizmagao
    @luizmagao 2 ปีที่แล้ว

    Valeu!

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Muito obrigado pelo apoio, Luiz!

  • @gisleicruz
    @gisleicruz 3 หลายเดือนก่อน

    Valeu demais!

    • @DiasDeDev
      @DiasDeDev  2 หลายเดือนก่อน

      Tmj

  • @lucasaster564
    @lucasaster564 2 ปีที่แล้ว

    Sua didática é muito boa, obrigado !

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Muito obrigado, Lucas. :-D

  • @PauloVitorNascimento
    @PauloVitorNascimento 2 ปีที่แล้ว

    Cara, muito obrigado, eu precisava dar uma repassada sobre esse assunto, a forma como você explica é muito fácil de entender, parabéns!

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Fico feliz demais de ter sido útil. :-D

  • @douglasandrade5199
    @douglasandrade5199 8 หลายเดือนก่อน

    Legal, excelente explicação!

    • @DiasDeDev
      @DiasDeDev  8 หลายเดือนก่อน

      Obrigado 😃

  • @luanalvescosta
    @luanalvescosta 2 ปีที่แล้ว

    Muito bom.
    Vou compartilhar com meus amigos

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Espero que eles gostem, Luan. :-D

  • @brunoggdev6305
    @brunoggdev6305 2 ปีที่แล้ว +2

    Seria sim ótimo um vídeo sobre clean architecture

  • @caiorodrigues6871
    @caiorodrigues6871 8 หลายเดือนก่อน

    Mandou bem, valeuuuu!
    =D

    • @DiasDeDev
      @DiasDeDev  8 หลายเดือนก่อน

      Que bom que gostou. :-D

  • @Zaratustra_88
    @Zaratustra_88 8 หลายเดือนก่อน +1

    Conteúdo útil, DTO é muito usado no dia a dia de um desenvovledor Back-end.

    • @DiasDeDev
      @DiasDeDev  8 หลายเดือนก่อน

      Que bom que curtiu. :-D

  • @yrllanio
    @yrllanio 2 ปีที่แล้ว

    Cara, gostei muito do seu curso de git que tem na alura. Muito bom mesmo. e aquela sacada de mostrar na ferramenta Visualizing Git, ajuda muito no entendimento. Parabéns.

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว +1

      Fico feliz que tenha gostado. :-D

  • @danielvidal4716
    @danielvidal4716 2 ปีที่แล้ว

    Valeu demais 👏🏾👏🏾👏🏾👏🏾

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Tamo junto, Daniel!

  • @Taiglobo
    @Taiglobo 8 หลายเดือนก่อน

    Muito bem explicado.

    • @DiasDeDev
      @DiasDeDev  8 หลายเดือนก่อน

      Que bom que gostou.

  • @maydana.programador
    @maydana.programador 2 ปีที่แล้ว

    em Dart
    class Turma{
    List alunos;
    }
    em PHP,
    Como eu represento uma lista dentro de uma classe do tipo X em PHP?

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว +1

      Atualmente, só com array mesmo. Aí você pode usar array shapes ou generics de analisadores estáticos pra chegar no mesmo resultado, mas só com a linguagem não.
      Uma alternativa é criar uma classe StudentList, por exemplo ou algo do tipo.

  • @wellingtonostemberg7585
    @wellingtonostemberg7585 ปีที่แล้ว

    Cheguei hoje no canal, procurando DDD e acho que já quase quebrei a banca, vi muita coisa boa no canal, parabéns!
    As validações ficam dentro do DTO?

    • @DiasDeDev
      @DiasDeDev  ปีที่แล้ว +1

      Opa, que bom que está curtindo. Obrigado!
      Não, DTO não deve ter regas. Apenas dados.

  • @pedrohull
    @pedrohull 2 ปีที่แล้ว +6

    Boa! Faz um mostrando aonde ficaria a validação 👍

  • @vandemberglima1950
    @vandemberglima1950 2 ปีที่แล้ว +1

    Vou passar isso para meu time para mostrar a importância de fazer serialize para enviar "models" para outros serviços

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว +1

      Espero que gostem. :-D

  • @leandrocruz6621
    @leandrocruz6621 ปีที่แล้ว

    Boa explicação

    • @DiasDeDev
      @DiasDeDev  ปีที่แล้ว +1

      Que bom que gostou. :-)

  • @lucasgabrieldeoliveirabent3130
    @lucasgabrieldeoliveirabent3130 2 ปีที่แล้ว

    Valeu de mais!

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Que bom que gostou, Lucas. :-D

  • @guibigois
    @guibigois ปีที่แล้ว

    Seloko! Valew deeeeeeeeeeemais!

    • @DiasDeDev
      @DiasDeDev  ปีที่แล้ว

      Que bom que curtiu, Guilherme. :-D

  • @ZicaoWarr
    @ZicaoWarr 2 ปีที่แล้ว

    Achei esse canal e estou gostando muito, aprendendo muito também, bom conteudo e didatica.
    Eu não tive tempo de procurar ainda se nesse canal possui algum vídeo sobre comentários, quando usar ou não, como usar da meneira certa,
    tem alguns videos por exemplo que aparecem códigos comentados por cima de variavel de classes /** @var **/ isso se usa sempre?
    ou aqueles comentários que vão por cima das funções /** @param, @return
    se alguém souber de algum vídeo no canal que tenha algo sobre comentários me linka como resposta por favor, tenho dúvidas a respeito disso.

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว +1

      Ótima pergunta. Esses "docblocks", como normalmente são chamados, só dão algumas informações a mais sobre o código. É muito mais usado em versões antigas do PHP onde não havia a possibilidade de adicionar tipos, mas ainda hoje pode ser usado para dar um contexto aos dados. Exemplo:
      /**
      * @return bool Verdadeiro se a condição X se satisfazer e a condição Y não for válida
      */
      function teste(): bool
      {
      // ...
      }
      Esse comentário pode ser lido pela sua IDE para gerar dicas ou até por ferramentas externas (como o phpDocumentor) para gerar documentações. Em alguns casos mais específicos você pode também usar tipos diferentes dos suportados pela linguagem e com isso analisadores estáticos podem analisar ainda mais do seu código.

  • @GustavoFilgueiras
    @GustavoFilgueiras 2 ปีที่แล้ว

    Boa garoto

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Que bom que gostou. :-D

  • @niltonduarte3531
    @niltonduarte3531 2 ปีที่แล้ว +1

    Fala Vinicius, beleza? Eu vi em vídeos seus tanto aqui como no canal da alura que vc falou muito sobre websockets, swoole, ratchet até fez um sistema de chat.
    Mas que tal falar um pouco sobre a lib ZeroMq ou 0MQ? Vi que essa lib tem na documentação do PHP e funciona baseado no padrão pub/sub. Onde um cliente se inscreve para receber atualizações de um canal em tempo real com I/O assíncronos. Seria mais da hora ainda vc fazer um vídeo implementando um exemplo de sistema previsão do tempo por exemplo (ou outro do seu interesse), mesmo que com dados fakes só pra demonstrar a biblioteca.

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว +1

      Opa, Nilton. ZeroMQ é só um sistema de mensageria, assim como o RabbitMq. Mas eu confesso que nunca vi o ZeroMQ sendo usado na verdade. Porém o princípio é o mesmo de qualquer sistema de mensageria.

  • @paulojr8139
    @paulojr8139 11 วันที่ผ่านมา

    E quando os dados variam para cada ação? Ex.:
    No show eu só quero mostrar X dados da série
    No create eu preciso de Y para cadastro e quero retornar Z dados
    Na listagem eu quero retornar só Z
    Aconselharia a criar SerieCreateInDTO, SerieCreateOutDTO, SerieShowDTO, SerieListDTO? Aí começa a complicar kk

  • @maydana.programador
    @maydana.programador 2 ปีที่แล้ว

    Que cara bom

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Que bom que esteja gostando. Muito obrigado! :-D

  • @ERICKZR1
    @ERICKZR1 3 หลายเดือนก่อน

    Eu usei um DTO porque estava precisando retornar duas classes que no final compõem um usuário e seu endereço , e não podia dar return usuario, endereço que são duas classes diferentes. Ai criei um DTO simples em teoria né

    • @DiasDeDev
      @DiasDeDev  2 หลายเดือนก่อน

      Sim sim.

  • @luizmagao
    @luizmagao 2 ปีที่แล้ว

    Você não é o Vinicius, você é o cara. Valeu, estou indo para o phpest, será que vale a pena?

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Com certeza vai valer a pena. Eu ainda estou tentando me programar para ir. Espero conseguir.

  • @raykavin.meireles
    @raykavin.meireles 6 หลายเดือนก่อน

    Posso usar o DTO para responder às solicitações da API?

  • @luizfelipeburgattjolo6578
    @luizfelipeburgattjolo6578 ปีที่แล้ว

    top

  • @luizmagao
    @luizmagao 2 ปีที่แล้ว +1

    Então no laravel a class request já é um tdo. ?

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Ótima pergunta.
      No Laravel a classe de Request faz mais coisa. Ela possui regras de validação, possíveis mensagens de erro, etc. Mas via de regra nós a usamos como um DTO também.
      Então no final das contas, não é um DTO "puro", mas nós também a usamos como um, entende?

  • @profigorpereira
    @profigorpereira 2 ปีที่แล้ว

    Não poderia fazer em vez de um DTO, fazer um lazing loading em alguns atributos que não precisariam ser mostrados dos objetos de modelo?

  • @Canemahue
    @Canemahue 6 หลายเดือนก่อน

    Uma duvida, oq fazer quando nossas classes de dominio precisam consultar o banco de dados para saber digamos se um cpf já esta cadastrado?

    • @DiasDeDev
      @DiasDeDev  6 หลายเดือนก่อน

      Depende da sua arquitetura. Via de regra, um Use Case (ou application service) vai usar um repositório pra buscar esse dado.

  • @matheushonorato4740
    @matheushonorato4740 ปีที่แล้ว

    Em um cenário onde preciso validar os dados que chegam na minha api (vindos diretamente do usuário), adicionaria essa validação no meu DTO? ou estaria fugindo o escopo da classe ?

    • @erbenescolares
      @erbenescolares ปีที่แล้ว

      DTO não tem comportamento. Só valores.

  • @hemilioaraujo
    @hemilioaraujo 2 ปีที่แล้ว

    Valeu demais como sempre vale! 😀
    Sei que Laravel não é sua paixão Hahaha, mas como eu aplicaria só framework na forma mais básica dele (sem repository nem service)? Eu validaria a request e o DTO seria definido no controller que o passaria para um método definido na model registrar em um banco?
    Abraço

    • @luan_maik
      @luan_maik 2 ปีที่แล้ว +5

      Na prática, o DTO é uma forma de estrutura um conjunto de dados, normalmente utilizado para transferência de dados entre camadas (controller -> service -> repository).
      Imagina que vc tem um UserService, que possui um método 'create(array $input)', que diabos tem dentro de $input???? se vc montar um DTO (uma classe) que representa essa estrutura de dados, fica mil vezes mais fácil saber quais dados existem, 'create(CreateUserDTO $input)'.
      Ou seja, no controller vc pega os dados da requisição, monta a instancia desse DTO e passa como parâmetro para a Service, dentro da service será montado as entidades a partir dos dados do DTO e será passado a entidade para o repositório persistir no banco.
      Conclusão, no PHP, o DTO tem um papel extra de forçar a tipagem dos parâmetros, evitando ter que olhar todo o fluxo para saber oq tem dentro de um parâmetro array.

    • @hemilioaraujo
      @hemilioaraujo 2 ปีที่แล้ว +1

      @@luan_maik obrigado pela explicação!

  • @rodrigoum
    @rodrigoum 2 ปีที่แล้ว

    Dias, blz? Estava pensando aqui, já que o PHP ainda não tem como criar tipos array como por exemplo:
    public Temporada[] $temporaras
    Eu estava pensando em fazer a class Temporada implementar a class Iterador e o construtor sim receber um array normal porem seria um construtor privado.
    Ai depois criar um método make que recebe um array e retorna um new self. Só que ai nesse método make ter um validador para saber se os itens do array passado nela são instancias do tipo Temporada. Algo assim:
    public static function make(array $items, $class)
    {
    foreach($items as $item) {
    if (! $item instanceof $class) {
    throw new InvalidArgumentException(
    'item ' . key($item) . ' não é uma instancia do tipo . ' ' . $class
    );
    }
    return new self($items);
    }
    }
    Acho que isso seria uma boa forma de "simular" um Temporara[] na tipagem?
    Valeuzz.

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Rodrigo, dessa forma a temporada não seria uma temporada, mas sim várias temporadas. rsrsrs
      Seria válido um ListaDeTemporadas ou SeasonList. Aí sim faria sentido.
      Mas recomendo essa palestra aqui que dá outras sugestões também:
      th-cam.com/video/CFKGFYjJeY8/w-d-xo.html

  • @Sardinhabeker
    @Sardinhabeker 2 ปีที่แล้ว

    vlw d+

  • @alissonvinicius334
    @alissonvinicius334 2 ปีที่แล้ว

    Bem crazy

  • @jsjunior
    @jsjunior 2 ปีที่แล้ว +2

    Eu gostei mestre, mas faltou um exemplo na pratica funcionando.!

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว +1

      Verdade! Vou preparar um vídeo mais completo com exemplo de uma arquitetura mesmo, aí mostro onde DTOs podem entrar.
      Valeu pelo feedback.

  • @joaopedrogomesdesena8674
    @joaopedrogomesdesena8674 ปีที่แล้ว

    Vinicius, seria correto ter métodos dentro de um DTO? E se eu me deparar com um cenário onde eu precisar de uma diferente estrutura de dados do usuário, por exemplo, ter um DTO para salvar, outro para uma determinada função específica do meu service. Isso seria viável ou fere algum princípio?

    • @DiasDeDev
      @DiasDeDev  ปีที่แล้ว +1

      Via de regra você teria um DTO pra operação de escrita e outro pra de leitura.
      Mas em alguns casos mais simples isso pode ser "purismo" demais. Sempre pese os prós e os contras. :-)

    • @joaopedrogomesdesena8674
      @joaopedrogomesdesena8674 ปีที่แล้ว

      @@DiasDeDev obrigado mestre!

  • @allisonpiovani
    @allisonpiovani 2 ปีที่แล้ว

    No caso de validação de dados, seria uma boa já validar os dados com o DTO antes msm d char a classe ne?

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Depende de qual validação vc se refere. Existem validações da infra e do domínio. As da infra faz com seu framework mesmo, no controller ou em classes de validação do framework. As de domínio ficam nas suas entidades.
      Nos 2 casos, o DTO não possui regras de validação. :-D

  • @renanmelo9373
    @renanmelo9373 2 ปีที่แล้ว

    Parabéns, puta didática

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Muito obrigado, Renan.

  • @TchokoNorris
    @TchokoNorris 2 ปีที่แล้ว

    Oi Vinícius, uma questão. As classes/serviços de mapping/Mappers não têm o propósito de mapear por exemplo um formulário para a tua estrutura interna, por exemplo de entities do teu ORM? Seria algo complementar ao DTO para facilitar essa tal tradução de dados presente em diferentes tipos de classes?
    Obrigado

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว

      Não sei o que você chama de classe "mapper", então não sei responder essa pergunta. =/

  • @clebermartins3228
    @clebermartins3228 3 หลายเดือนก่อน

    Esse trem num entra em minha mente!😅

    • @DiasDeDev
      @DiasDeDev  3 หลายเดือนก่อน +1

      Qual parte? Alguma dúvida em específico?

    • @clebermartins3228
      @clebermartins3228 3 หลายเดือนก่อน

      @DiasDeDev vou tentar de novo. Na verdade não entendi bem pq eu usaria!

  • @profigorpereira
    @profigorpereira 2 ปีที่แล้ว

    Depois que vi que a camiseta tá com as fontes invertidas não prestei atenção mais em nada heheheh

  • @JohnnyBigodes
    @JohnnyBigodes 2 ปีที่แล้ว +1

    Foi mais ou menos bem explicado... Acho que um melhor exemplo era o DTO aceitar um array desorganizado para fazer um return de um objecto organizado.

    • @DiasDeDev
      @DiasDeDev  2 ปีที่แล้ว +1

      Com os parâmetros no construtor você pode passar esse array com o spread operator. :-D

  • @ngomafortuna2667
    @ngomafortuna2667 หลายเดือนก่อน

    Valeu de mais.

    • @DiasDeDev
      @DiasDeDev  หลายเดือนก่อน

      Que bom que gostou