Laravel macro methods for extending framework

Carlos Mendez Jan 2026
3 tabs
<?php

namespace App\Providers;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Collection;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str;

class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        // Collection macro
        Collection::macro('toSelectArray', function () {
            return $this->mapWithKeys(function ($item) {
                return [$item->id => $item->name];
            });
        });

        // String macro
        Str::macro('partNumber', function ($value) {
            return 'PART-' . strtoupper(Str::slug($value));
        });

        // Query Builder macro
        Builder::macro('whereLike', function ($column, $value) {
            return $this->where($column, 'like', "%{$value}%");
        });

        // Request macro
        Request::macro('hasAny', function (...$keys) {
            foreach ($keys as $key) {
                if ($this->has($key)) {
                    return true;
                }
            }
            return false;
        });

        // Response macro
        Response::macro('success', function ($data = [], $message = 'Success') {
            return response()->json([
                'success' => true,
                'message' => $message,
                'data' => $data,
            ]);
        });
    }
}
3 files · php Explain with highlit

Macros dynamically add methods to Laravel's macroable classes—Request, Response, Collection, Query Builder, and more. I define macros in service providers' boot() methods. The macro() method accepts a name and closure. Macros access $this context like regular methods. Mixin provides multiple macros at once from a class. I use macros for project-specific helpers without extending classes. String, Arr, and Collection macros create domain-specific utilities. Request macros add custom validation or data extraction. This extensibility keeps framework modifications organized and upgradeable. Macros demonstrate Laravel's flexibility for customization.