Macro Request no Laravel

Para mim uma das coisas mais fascinantes no Laravel, são os Macros, muito pouco falados na documentação (ou não), enfim, são demais.

Os Macros eles basicamente servem, para extender os métodos de uma biblioteca ou seja la o que for. Então, conseguimos criar “customizações” de acordo com a nossa necessidade.

Por aqui eu vou mostrar, como utilizar um Macro para o Requests do Laravel.

Primeiro, vamos criar um provider usando o artisan:

php artisan make:provider MacroServiceProvider

Depois de criado, vá na pasta config, abra o arquivo app.php e adicione o seguinte Provider

App\Providers\MacroServiceProvider::class,

Isso, agora vá na pasta do seu projeto Laravel em app/Providers e abra o MacroServiceProvider.php

Já abriu? Agora vamos adicionar a classe Request do Laravel para uso:

use Illuminate\Http\Request;

O início do seu Provider ficará mais ou menos assim:

namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Http\Request;
class MacroServiceProvider extends ServiceProvider
{
...

Certo, agora vamos criar o Macro, para isso dentro do método boot() coloque o seguinte código:

Request::macro('isEdit', function(){
    return $this->is('/editar');
});

Para usar:

// Com helper request() do Laravel para ser chamado em uma view por exemplo
if(request()->isEdit())
    echo("Estou editando");

// Sem o helper
if($request->isEdit())
    echo("Estou editando");

O que aconteceu ai? Eu explico! Quando chama o Macro isEdit() ele vai buscar usando o método is() do Request do Laravel, se a rota atual é a rota de edição retorna true, se não, false.

Quase tudo no Laravel tem Macros, olha só:

use Illuminate\Routing\UrlGenerator;
UrlGenerator::macro('nomeMacro', function(){ ... });

use Illuminate\Support\Collection;
Collection::macro('nomeMacro', function(){ ... });

use Illuminate\Routing\Router;
Router::macro('nomeMacro', function(){ ... });

use Illuminate\Support\Str;
Str::macro('nomeMacro', function(){ ... });

use Illuminate\Support\Arr;
Arr::macro('nomeMacro', function(){ ... });

… E muito mais!

Como eu descobri onde o Laravel usa Macros?

Não sei se foi a forma correta e blá blá blá mas para mim e minha equipe funcionou perfeitamente. O código principal do Framework Laravel, o núcleo dele, o chamado Illuminate, contém todas as classes e métodos utilizados, enfim o “coração” do framework, você pode acessá-lo aqui.

Por exemplo, para o Request, normalmente é utilizado o Illuminate\Http\Request, se você abrir este arquivo, você verá que ele usa a Trait Macroable que é responsável pelos Macros, então adivinha meu chegado…

Um exemplo real do uso de macros, é o pacote Laravel Collection Macros que falei no post anterior, olha só o código dos macros dele.

Show your support

Clapping shows how much you appreciated Gercil Junio’s story.