laravel magical macros

Published on Jun 20, 2024

Laravel macros allow developers to add custom functionality to Laravel's core classes or even their own classes. They are simple and easy to use, and provide a way to extend Laravel's functionality without modifying the underlying code.

Macros can be defined for a wide range of classes, including Eloquent models, collections, and request and response classes. They are a powerful tool that enables developers to write cleaner, more concise code.

    
    Request::macro('hello', function ($name) {
        echo 'Hello ' . $name;
    });

    Request::hello('World'); // outputs "Hello World"
    

A more practical example of a Request macro would be detecting the domain base name

    
    Request::macro('baseDomain', function ($domain) {
        return Str::is($domain . '.*', $this->root());
    });

    Request::baseDomain('facebook') // returns true for facebook.com
    Request::baseDomain('dev') // returns true for dev.to
    

Defining macros for your Laravel application in a service provider is a good practice. While the AppServiceProvider's boot() method is a great starting point, it can become cluttered over time. To avoid this, you can create a MacrosServiceProvider and register it in the config/app.php file. If your macros are related, you can group them into a separate service provider, such as the TldAwareServiceProvider which houses TLD-related macros.

Available class to define macros

  • Illuminate\Cache\Repository
  • Illuminate\Console\Scheduling\Event
  • Illuminate\Database\Eloquent\Builder
  • Illuminate\Database\Eloquent\Relation
  • Illuminate\Database\Query\Builder
  • Illuminate\Filesystem\Filesystem
  • Illuminate\Foundation\Testing\TestResponse
  • Illuminate\Http\RedirectResponse
  • Illuminate\Http\Request
  • Illuminate\Http\UploadedFile
  • Illuminate\Routing\ResponseFactory
  • Illuminate\Routing\Router
  • Illuminate\Routing\UrlGenerator
  • Illuminate\Support\Arr
  • Illuminate\Support\Collection
  • Illuminate\Support\Str
  • Illuminate\Translation\Translator
  • Illuminate\Validation\Rule
← Go back