Fugindo das armadilhas do MVC

14 visualizações

Publicada em

Palestra realizada no 3º PHPeetup do grupo PHPBA com o tema Arquitetura de Software. Nessa Talk procuramos conversar sobre os problemas apresentados pelo padrão arquitetural MVC.

Publicada em: Tecnologia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Fugindo das armadilhas do MVC

  1. 1. Fugindodas armadilhas doMVC
  2. 2. Quemsoueu? Oi!eu souoEdy
  3. 3. OMVC A arquitetura foi desenvolvida para ser usado em projetos de interface visual Foi criado na década de 70 View Controller Model
  4. 4. Regrade negócio naMODEL émuitoRUIM
  5. 5. ConceitodaMODEL
  6. 6. ConceitodaMODEL
  7. 7. ConceitodaMODEL
  8. 8. ConceitodaMODEL
  9. 9. class Sayajin extends Model { protected $table = "dragon_ball_sayajin"; protected $primaryKey = "saya_jin_id"; public function obterSayajinPelaForca($nome, $poder) { $sayajin = $this->where('nome', '=', $nome)->where('poder', '=', $poder) ->join('mundo', 'mondo.id', '=', ‘dragon_ball_sayajin.cod_mundo')->first(); $dadosDoInimigos = $sayajin->inimigos; $inimigos = []; foreach ($dadosDoInimigos as $key => $value) { $inimigos[$key] = $value->toArray(); $geocode = new Geocode($value->endereco); $inimigos[$key]['lat'] = $geocode->lat(); $inimigos[$key]['long'] = $geocode->long(); }; $cabelos = "curto e preto"; if ($poder == 3) { $cabelos = "longos e loiro"; } $data = $sayajin->toArray(); $data['cabelos'] = $cabelos; return [ 'sayadin' => $data, 'inimigos' => $inimigos ];
  10. 10. class Sayajin extends Model { protected $table = "dragon_ball_sayajin"; protected $primaryKey = "saya_jin_id"; public function obterSayajinPelaForca($nome, $poder) { $sayajin = $this->where('nome', '=', $nome)->where('poder', '=', $poder) ->join('mundo', 'mondo.id', '=', ‘dragon_ball_sayajin.cod_mundo')->first(); $dadosDoInimigos = $sayajin->inimigos; $inimigos = []; foreach ($dadosDoInimigos as $key => $value) { $inimigos[$key] = $value->toArray(); $geocode = new Geocode($value->endereco); $inimigos[$key]['lat'] = $geocode->lat(); $inimigos[$key]['long'] = $geocode->long(); }; $cabelos = "curto e preto"; if ($poder == 3) { $cabelos = "longos e loiro"; } $data = $sayajin->toArray(); $data['cabelos'] = $cabelos; return [ 'sayadin' => $data, 'inimigos' => $inimigos ];
  11. 11. class Sayajin extends Model { protected $table = "dragon_ball_sayajin"; protected $primaryKey = "saya_jin_id"; public function obterSayajinPelaForca($nome, $poder) { $sayajin = $this->where('nome', '=', $nome)->where('poder', '=', $poder) ->join('mundo', 'mondo.id', '=', ‘dragon_ball_sayajin.cod_mundo')->first(); $dadosDoInimigos = $sayajin->inimigos; $inimigos = []; foreach ($dadosDoInimigos as $key => $value) { $inimigos[$key] = $value->toArray(); $geocode = new Geocode($value->endereco); $inimigos[$key]['lat'] = $geocode->lat(); $inimigos[$key]['long'] = $geocode->long(); }; $cabelos = "curto e preto"; if ($poder == 3) { $cabelos = "longos e loiro"; } $data = $sayajin->toArray(); $data['cabelos'] = $cabelos; return [ 'sayadin' => $data, 'inimigos' => $inimigos ];
  12. 12. class Sayajin extends Model { protected $table = "dragon_ball_sayajin"; protected $primaryKey = "saya_jin_id"; public function obterSayajinPelaForca($nome, $poder) { $sayajin = $this->where('nome', '=', $nome)->where('poder', '=', $poder) ->join('mundo', 'mondo.id', '=', ‘dragon_ball_sayajin.cod_mundo')->first(); $dadosDoInimigos = $sayajin->inimigos; $inimigos = []; foreach ($dadosDoInimigos as $key => $value) { $inimigos[$key] = $value->toArray(); $geocode = new Geocode($value->endereco); $inimigos[$key]['lat'] = $geocode->lat(); $inimigos[$key]['long'] = $geocode->long(); }; $cabelos = "curto e preto"; if ($poder == 3) { $cabelos = "longos e loiro"; } $data = $sayajin->toArray(); $data['cabelos'] = $cabelos; return [ 'sayadin' => $data, 'inimigos' => $inimigos ];
  13. 13. Éaiqueentrao nosso SuperSayajin1 O Serviço
  14. 14. Éaiqueentrao nosso SuperSayajin1 O Serviço
  15. 15. Benefíciosdessa Abordagem Fica entre os controller e as models Essa camada ficará responsável pela implementação da Regra de negócio Essa camada também ficará responsável em se comunicar com outros serviços
  16. 16. class SayajinService { public function obterSayajinPelaForca($nome, $poder) { $sayajin = Sayajin::where('nome', '=', $nome) ->where('poder', '=', $poder) ->join('mundo', 'id', '=', 'dragon_ball_sayajin.cod_mundo') ->first(); $dadosDoInimigos = $sayajin->inimigos; $inimigos = []; foreach ($dadosDoInimigos as $key => $value) { $inimigos[$key] = $value->toArray(); $geocode = new Geocode($inimigos['endereco']); $inimigos[$key][‘lat'] = $geocode->lat(); $inimigos[$key]['long'] = $geocode->long(); }; $cabelos = "curto e preto"; if ($poder == 3) { $cabelos = "longos e loiro"; } $data = $sayajin->toArray(); $data['cabelos'] = $cabelos; return [ 'sayajin' => $data, 'inimigos' => $inimigos ]; }
  17. 17. class SayajinService { public function obterSayajinPelaForca($nome, $poder) { $sayajin = Sayajin::where('nome', '=', $nome) ->where('poder', '=', $poder) ->join('mundo', 'id', '=', 'dragon_ball_sayajin.cod_mundo') ->first(); $dadosDoInimigos = $sayajin->inimigos; $inimigos = []; foreach ($dadosDoInimigos as $key => $value) { $inimigos[$key] = $value->toArray(); $geocode = new Geocode($inimigos['endereco']); $inimigos[$key][‘lat'] = $geocode->lat(); $inimigos[$key]['long'] = $geocode->long(); }; $cabelos = "curto e preto"; if ($poder == 3) { $cabelos = "longos e loiro"; } $data = $sayajin->toArray(); $data['cabelos'] = $cabelos; return [ 'sayajin' => $data, 'inimigos' => $inimigos ]; } class Sayajin extends Model { protected $table = "dragon_ball_sayajin"; protected $primaryKey = "saya_jin_id"; public function inimigos() { return $this->hasMany('Inimigos'); } }
  18. 18. Maisissonão étudo. Aindatemos problemas!
  19. 19. class SayajinService { public function obterSayajinPelaForca($nome, $poder) { $sayajin = Sayajin::where('nome', '=', $nome) ->where('poder', '=', $poder) ->join('mundo', 'id', '=', 'dragon_ball_sayajin.cod_mundo') ->first(); $dadosDoInimigos = $sayajin->inimigos; $inimigos = []; foreach ($dadosDoInimigos as $key => $value) { $inimigos[$key] = $value->toArray(); $geocode = new Geocode($inimigos['endereco']); $inimigos[$key][‘lat'] = $geocode->lat(); $inimigos[$key]['long'] = $geocode->long(); }; $cabelos = "curto e preto"; if ($poder == 3) { $cabelos = "longos e loiro"; } $data = $sayajin->toArray(); $data['cabelos'] = $cabelos; return [ 'sayajin' => $data, 'inimigos' => $inimigos ]; } class Sayajin extends Model { protected $table = "dragon_ball_sayajin"; protected $primaryKey = "saya_jin_id"; public function inimigos() { return $this->hasMany('Inimigos'); } }
  20. 20. class SayajinService { public function obterSayajinPelaForca($nome, $poder) { $sayajin = Sayajin::where('nome', '=', $nome) ->where('poder', '=', $poder) ->join('mundo', 'id', '=', 'dragon_ball_sayajin.cod_mundo') ->first(); $dadosDoInimigos = $sayajin->inimigos; $inimigos = []; foreach ($dadosDoInimigos as $key => $value) { $inimigos[$key] = $value->toArray(); $geocode = new Geocode($inimigos['endereco']); $inimigos[$key][‘lat'] = $geocode->lat(); $inimigos[$key]['long'] = $geocode->long(); }; $cabelos = "curto e preto"; if ($poder == 3) { $cabelos = "longos e loiro"; } $data = $sayajin->toArray(); $data['cabelos'] = $cabelos; return [ 'sayajin' => $data, 'inimigos' => $inimigos ]; } class Sayajin extends Model { protected $table = "dragon_ball_sayajin"; protected $primaryKey = "saya_jin_id"; public function inimigos() { return $this->hasMany('Inimigos'); } }
  21. 21. Éporissoqueprecisamos doSuperSayajinLevel2 ORepositório
  22. 22. Benefíciosdessa Abordagem Definir uma camada unica de acesso aos dados Apoia o modelo fornecendo a persistência e leitura dos dados Elimina as consultas da camada de negócio Separa claramente a comunicação com o banco de sua manipulação Pode entregar qualquer modelo para os serviço
  23. 23. class SayajinRepository { public function obterSayajin($params) { $sayajin = Sayajin::where('nome', '=', $params['nome']) ->where('poder', '=', $params['poder']) ->join('mundo', 'mondo.id', '=', 'dragon_ball_sayajin.cod_mundo') ->first(); $dadosDoInimigos = $sayajin->inimigos; return [ 'sayajin' => $sayajin->toArray(), 'inimigos' => $dadosDoInimigos->toArray(), ] } }
  24. 24. class SayajinService { private $repositorio public function __construct(SayajinRepository $repositorio) { $this->repositorio = $repositorio; } public function obterSayajinPelaForca($nome, $poder) { $sayajin = $this->repositorio->obterSayajin( ['nome' => $nome,'poder' => $poder] ); $inimigos = array_map(function($value){ $geocode = new Geocode($value['endereco']); $value['lat'] = $geocode->lat(); $value['long'] = $geocode->long(); return $inimigos; }, $sayajin['inimigos']); $cabelos = "curto e preto"; if ($poder == 3) { $cabelos = "longos e loiro"; } $sayajin['cabelos'] = $cabelos; return [ 'sayadin' => $sayajin, 'inimigos' => $inimigos
  25. 25. Novodiagrama View Controller Model Repository Service
  26. 26. Eparatransformar-seem SuperSayajin3
  27. 27. Desacopleaindamais IoC - Containers e DI Arquitetura Hexagonal ExpressiveFiquem de olho
  28. 28. Perguntas?
  29. 29. Obrigado edyonil@gmail.com telegram,twitteregithub:@edyonil phpbanotelegram:@phpba blog:phpba.com.br
  30. 30. Obrigado edyonil@gmail.com telegram,twitteregithub:@edyonil phpbanotelegram:@phpba blog:phpba.com.br

×