Extend core Laravel classes at runtime with macros on Collection, Response, and Query Builder.
Macros
// Extend core Laravel classes without inheritance
// In AppServiceProvider::boot()
// Extend Collection
Collection::macro("toKeyedArray", function (string $key): array {
return $this->keyBy($key)->toArray();
});
// Extend Response
Response::macro("success", function ($data, int $code = 200) {
return Response::json(["success" => true, "data" => $data], $code);
});
Response::macro("error", function (string $msg, int $code = 400) {
return Response::json(["success" => false, "message" => $msg], $code);
});
// Use
return response()->success($post, 201);
return response()->error("Not found", 404);
// Extend Builder
Builder::macro("whereLike", function (string $col, string $val): Builder {
return $this->where($col, "LIKE", "%" . $val . "%");
});
Post::whereLike("title", "Laravel")->get();