DEV Community

Cover image for Creating Reusable Attributes for Laravel Resource Responses
Rafa Rafael
Rafa Rafael

Posted on

1

Creating Reusable Attributes for Laravel Resource Responses

At times, you may find the need to consistently include a shared related resource across multiple or all resource responses. Redundantly defining them in each individual resource not only bloats the code but also results in unnecessary duplication.

Consider this scenario: You have SubjectResource, StudentResource, and ClassroomResource. Now, imagine you want every response from these resources to also include a TeacherResource.

So, how can you achieve this without code repetition? Laravel provides an elegant solution. The JsonResource class in Laravel has a method named with(). This method is typically employed to append top-level metadata to your resource response alongside the resource array. By leveraging this method, you can effortlessly integrate TeacherResource into every response.

The trick is to create a trait and override the method. Allow me to guide you through the process.

First, Create a WithTeacher trait.
Then, within that trait, the code would appear like below:

<?php

namespace App\Traits;

use App\Http\Resources\TeacherResource;

trait WithTeacher
{
    public function with(Request $request): array
    {
        return [
            'teacher' => TeacherResource::make($this->resource)
        ];
    }
}
Enter fullscreen mode Exit fullscreen mode

Next, to integrate this in your resources, simply incorporate use WithTeacher within the respective class.

<?php

namespace App\Http\Resources;

use App\Traits\WithTeacher;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class StudentResource extends JsonResource
{
    use WithTeacher;

    /**
     * Transform the resource into an array.
     *
     * @return array<string, mixed>
     */
    public function toArray(Request $request): array
    {
        //...
    }


}
Enter fullscreen mode Exit fullscreen mode

And Voilà! With this approach, should you ever need to include another related resource in the future, it'll be a breeze to add.

Enjoy!

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (2)

Collapse
 
emmysteven profile image
Emmy Steven

Great Article, please keep it up

Collapse
 
rafaelogic profile image
Rafa Rafael

Thank you for the kind words! I'm glad you found it informative.

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs