Fugindodas
armadilhas
doMVC
Quemsoueu?
Oi!eu
souoEdy
OMVC
A arquitetura foi desenvolvida para ser usado
em projetos de interface visual
Foi criado na década de 70
View
Controller
Model
Regrade
negócio
naMODEL
émuitoRUIM
ConceitodaMODEL
ConceitodaMODEL
ConceitodaMODEL
ConceitodaMODEL
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
];
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
];
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
];
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
];
Éaiqueentrao nosso
SuperSayajin1
O Serviço
Éaiqueentrao nosso
SuperSayajin1
O Serviço
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
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 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');
}
}
Maisissonão
étudo.
Aindatemos
problemas!
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');
}
}
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');
}
}
Éporissoqueprecisamos
doSuperSayajinLevel2
ORepositório
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
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(),
]
}
}
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
Novodiagrama
View
Controller
Model
Repository
Service
Eparatransformar-seem
SuperSayajin3
Desacopleaindamais
IoC - Containers e DI
Arquitetura Hexagonal
ExpressiveFiquem de olho
Perguntas?
Obrigado
edyonil@gmail.com
telegram,twitteregithub:@edyonil
phpbanotelegram:@phpba
blog:phpba.com.br
Obrigado
edyonil@gmail.com
telegram,twitteregithub:@edyonil
phpbanotelegram:@phpba
blog:phpba.com.br

Fugindo das armadilhas do MVC

  • 1.
  • 2.
  • 3.
    OMVC A arquitetura foidesenvolvida para ser usado em projetos de interface visual Foi criado na década de 70 View Controller Model
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
    class Sayajin extendsModel { 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.
    class Sayajin extendsModel { 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.
    class Sayajin extendsModel { 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.
    class Sayajin extendsModel { 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.
  • 14.
  • 15.
    Benefíciosdessa Abordagem Fica entre oscontroller 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.
    class SayajinService { public functionobterSayajinPelaForca($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.
    class SayajinService { public functionobterSayajinPelaForca($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.
  • 19.
    class SayajinService { public functionobterSayajinPelaForca($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.
    class SayajinService { public functionobterSayajinPelaForca($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.
  • 22.
    Benefíciosdessa Abordagem Definir uma camadaunica 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.
    class SayajinRepository { public functionobterSayajin($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.
    class SayajinService { private $repositorio publicfunction __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.
  • 26.
  • 27.
    Desacopleaindamais IoC - Containerse DI Arquitetura Hexagonal ExpressiveFiquem de olho
  • 28.
  • 29.
  • 30.