Como Resolver Models Extensos no Laravel: Abordagens e Boas Práticas – PT2

  1. Encontre seu código
  2. Laravel
  3. 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 e PreSchedule, 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

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *