Como Resolver Models Extensos no Laravel: Abordagens e Boas Práticas – PT2
Resumo: Já se deparou com uma situação em que seu Model no Laravel ficou excessivamente grande e complexo? Isso pode ser comum à medida que seu projeto cresce, mas não precisa ser um problema sem solução. Neste artigo, vamos explorar técnicas eficazes para lidar com models extensos no Laravel, mantendo a organização do código e a […]
Já se deparou com uma situação em que seu Model no Laravel ficou excessivamente grande e complexo? Isso pode ser comum à medida que seu projeto cresce, mas não precisa ser um problema sem solução. Neste artigo, vamos explorar técnicas eficazes para lidar com models extensos no Laravel, mantendo a organização do código e a responsabilidade das classes bem definidas. Se você está enfrentando esse problema, continue a leitura e veja como simplificar!
Problema: Models Sobrecarregados
Imagine que você tem dois Models, chamados Schedule
e PreSchedule
. Decidimos separá-los porque eles representam entidades e responsabilidades diferentes no sistema. No entanto, ambos compartilham vários relacionamentos e colunas da tabela do banco de dados, o que nos leva a uma duplicação de código. Como podemos evitar essa repetição e manter o código limpo e organizado?
Usando Herança no PHP
A primeira ideia que pode vir à mente é usar a funcionalidade de herança no PHP. Ou seja, a classe PreSchedule
poderia simplesmente estender a classe Schedule
, herdando seus métodos e propriedades. No entanto, essa abordagem traz alguns desafios.
Quando uma classe herda de outra, ela recebe todos os métodos e escopos da classe pai. Isso significa que qualquer comportamento específico da classe Schedule
será automaticamente incluído em PreSchedule
, mesmo que não seja relevante. Esse acoplamento excessivo pode causar problemas de manutenção e tornar o código menos flexível.
Solução: Criando um Model Base
Uma maneira muito mais eficaz de resolver esse problema é criar um Model base, que atuará como uma classe “pai” para Schedule
e PreSchedule
. Esse Model base conterá todos os métodos, relacionamentos e propriedades compartilhados entre as classes, permitindo que as responsabilidades comuns sejam centralizadas.
Nosso model base:
<?php
//Model Base
//BaseSchedule.php
namespace App\Models\Services;
use Illuminate\Database\Eloquent\Model;
class BaseSchedule extends Model
{
public $table = 'schedules';
protected $fillable = [
'date',
'time',
'order_id',
'completed',
'type'
];
Nosso Preschedule extendendo o nosso Model base:
<?php
namespace App\Models\Services;
class Prechedule extends BaseSchedule
{
Nosso model Schedule extendendo nosso model base:
<?php
namespace App\Models\Services;
class Schedule extends BaseSchedule
{
const TYPE = ['1'=>'Agendamento'];
protected static function booted()
{
static::addGlobalScope(function($query){
return $query->where('type',self::TYPE);
});
}
Vantagens da Abordagem
Com essa abordagem, podemos manter as responsabilidades específicas de cada Model (Schedule
e PreSchedule
) bem isoladas, enquanto todas as partes comuns são definidas no BaseSchedule
. Isso oferece várias vantagens:
- Redução de Código Duplicado: Ao mover os relacionamentos e métodos comuns para um Model base, evitamos a duplicação de código entre
Schedule
ePreSchedule
, o que facilita a manutenção. - Organização e Clareza: A separação clara de responsabilidades torna o código mais fácil de entender e evoluir, especialmente em projetos grandes.
- Flexibilidade: Cada Model pode adicionar ou sobrescrever métodos sem interferir no outro, garantindo que a lógica específica de cada entidade seja mantida de forma independente.
Conclusão
A criação de um Model base para centralizar funcionalidades comuns é uma prática valiosa em projetos Laravel. Isso não apenas mantém seu código mais limpo e organizado, mas também promove a reutilização e facilita a manutenção a longo prazo. Ao isolar as responsabilidades específicas em cada Model, você garante que seu sistema permaneça flexível e escalável, mesmo à medida que novos requisitos surgem.
Adotar essa estratégia de herança seletiva é uma excelente forma de evitar models extensos e complicados, permitindo que seu código evolua de maneira saudável e sustentável.
Gostou do artigo? Deixe sua dúvida ou comentário