Laravel além do básico: #1 — Bootable traits no Eloquent

João Roberto da Paixão
Desenvolvendo com Paixão
3 min readMay 11, 2018

Você já teve aquela sensação de que as coisas no Laravel funcionam como se fossem mágica? Pois bem, saiba que no Laravel não há mágica nenhuma, o que realmente existe é um código muito bem escrito e elaborado! Bootable Traits é um belo exemplo disso…

Se você criar uma Trait e declarar um método publico estático com o nome bootNomeDaSuaTrait esse método será carregado “automagicamente” pelo seu model Eloquent quando o mesmo for instanciado pela aplicação.

Nota: Escrevi um artigo detalhado, falando de Traits no PHP.

Isso pode ser bastante útil se você deseja “escutar” algum evento que o model disparar ou adicionar uma query scolpe global, por exemplo.

Para facilitar o entendimento, vamos a um exemplo prático e real de uso!

Recentemente escrevi um artigo explicando como gerar UUIDs automaticamente para seus models do Laravel . Nesse artigo em questão, eu criei a seguinte Trait:

<?phpnamespace App\Traits;use Ramsey\Uuid\Uuid;trait Uuid
{
public static function bootUuid()
{
static::creating(function ($model) {
$model->uuid = Uuid::uuid4();
});
}
}

Percebam que a Trait tem o nome de Uuid e possui um método público estático com o nome bootUuid, ou seja, corresponde exatamente aquele padrão que eu havia mencionando lá no inicio do artigo; bootNomeDaTrait. — se o nome da Trait fosse “HasUuid”, o método de inicialização teria o nome de “bootHasUuid”; bem simples né?

Usando essa Trait em qualquer model Eloquent, a lógica do método bootUuid() será inserida no model de forma automática quando ele for instanciado.

<?php// app\User.phpuse App\Traits\Uuid;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
use Uuid;
// ...
}
// ATENÇÃO: Esse código é apenas pra ilustrar o uso da Trait Uuid em um model Eloquent qualquer... Não use esse exemplo na sua aplicação!

Mas, como isso funciona?

Pra explicar, vamos analisar um trecho de código da classe Illuminate\Database\Eloquent\Model:

Vamos as devidas explicações:

  • Linha 10: definição do método boot(); Esse método é chamado de forma indireta no construtor da classe Model.
  • Linha 12: chamada para o método bootTraits(); Sendo assim, esse método também é chamado de forma indireta no construtor.
  • Linha 20: definição do método bootTraits(); É aqui onde a “mágica” acontece.
  • Linha 22: recupera o nome da classe.
  • Linha 24 : aqui temos um laço que intera o resultado da função class_uses_recursive($class) essa função é um helper do Framework e está declarada na classe Illuminate/Support/helpers.php . Ela retorna todas as traits utilizadas na classe.
  • Linha 25: aqui temos uma if que verifica se a Trait possui um método com o nome bootNomeDaTrait().
  • Linha 26: se o método existir na Trait que esta sendo interada pelo laço, ele é invocado pelo a função nativa do php forward_static_call().

Esse técnica de inicialização de Traits é uma maneira bastante eficiente de compartilhar uma lógica entre seus models Eloquent sem ter que criar uma classe ‘Pai’ que estenda o comportamento da classe Model padrão ou sem ter que ficar sobrescrevendo o método boot() pra todo model que você criar.

O próprio Laravel se beneficia disso, um bom exemplo é quando você habilita Soft Delete no seu model.

Qual sua opinião sobre esse assunto? Já conhecia/usava essa técnica em suas aplicações Laravel? Comente!

Sumário

Laravel além do básico: #0 — Introdução

--

--

João Roberto da Paixão
Desenvolvendo com Paixão

Eterno aprendiz que compartilha aquilo que aprende. Apaixonado por tecnologia, desenvolvimento pessoal e investimentos. Pai de família, um cara tranquilo =) !