Laravel Api Resources Kullanımı

Merhabalar. Bu yazıda Laravel API Resources özelliğini nasıl kullandığımı anlatacağım.
Detaylı açıklamalar için dokümana bakabilirsiniz (https://laravel.com/docs/9.x/eloquent-resources).

Senaryo:
Birbirinden farklı iki veritabanı tablosundaki kayıtlardan, o kayıtların işlem tarihlerine göre fullcalendar üzerinde gösterilmesini sağlamak.

Fullcalendar hakkında detaylı bilgi için
https://fullcalendar.io/docs
https://fullcalendar.io/docs/vue

Kötü kod:

namespace App\Http\Controllers;

use App\Http\Resources\DailyNotesCalendar;
use App\Http\Resources\ProjectHistoryCalendar;
use App\Models\DailyNotes;
use App\Models\ProjectHistory;
use Illuminate\Http\Request;

class FullcalendarController extends Controller
{
    public function index(Request $request)
    {
        $myProjectHistories = ProjectHistory::orderByDESC('transaction_date')->get();
        $myDailyNotes = DailyNotes::orderByDESC('note_date')->get();

        $my_Arr = array_merge($myProjectHistories->toArray(), $myDailyNotes->toArray());

        return response()->json(ProjectHistoryCalendar::collection(
            $my_Arr
        ));
    }
}
namespace App\Http\Resources;

use App\Libraries\Enum\StatusAttributes;
use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource;

class ProjectHistoryCalendar extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
     */
    public function toArray($request)
    {

        if ($this->transaction_date) {
            $my_Start = Carbon::parse($this->transaction_date)->toDateTimeLocalString();
        } else if ($this->note_date) {
            $my_Start = Carbon::parse($this->note_date)->toDateTimeLocalString();
        } else {
            $my_Start = "";
        }

        if ($this->status) {
            $my_color = constant(StatusAttributes::class . "::$this->status")->color() ?? 'black';
        } else {
            $my_color = "black";
        }

        return [
            'id' => $this->id ?? '',
            'title' => $this->project->project_no ?? '',
            'extendedProps' => [
                'status' => $this->status ?? '',
                'customer' => $this->project->customer->name ?? $this->project->contract->customer->name ?? '',
                'transaction_date' => $this->transaction_date ?? $this->note_date ?? '',
                'note' => $this->note ?? '',
            ],
            'start' => $my_Start,
            'color' => $my_color,
            "allDay" => false,
        ];
    }
}

ProjectHistoryCalendar.php dosyasında görüldüğü üzere if ile bir sürü kontrol sağlıyordum. İlerde daha fazla çeşitte tablo bağlayacak olsam bir sürü daha if yazmak gerekecek. Kodun okunabilirliği azalacak.

Daha temiz kod:


public function index(Request $request)
    {
        $myProjectHistories = ProjectHistory::whereBetween('transaction_date', [
            $request->input('start'),
            $request->input('end')
        ])
            ->orderByDESC('transaction_date')
            ->get();

        $ProjectHistoryCalendarData = ProjectHistoryCalendar::collection($myProjectHistories);

        $myDailyNotes = DailyNotes::whereBetween('note_date', [
            $request->input('start'),
            $request->input('end')
        ])
            ->orderByDESC('note_date')
            ->get();

        $DailyNotesCalendarData = DailyNotesCalendar::collection($myDailyNotes);

        $myCalendarData = $ProjectHistoryCalendarData->merge($DailyNotesCalendarData);

        return response()->json($myCalendarData);
    }
namespace App\Http\Resources;

use App\Libraries\Enum\StatusAttributes;
use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource;

class ProjectHistoryCalendar extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => "Prj: ".$this->project->project_no,
            'extendedProps' => [
                'status' => $this->status,
                'customer' => $this->project->customer->name ?? $this->project->contract->customer->name,
                'transaction_date' => $this->transaction_date,
            ],
            'start' => Carbon::parse($this->transaction_date)->toDateTimeLocalString(),
            'color' => constant(StatusAttributes::class . "::$this->status")->color(),
            "allDay" => false,
        ];
    }
}

Bundan sonra her bir tablo için yeni resources sınıfları oluşturacağım.

namespace App\Http\Resources;

use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource;

class DailyNotesCalendar extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id ?? '',
            'title' => 'Günlük Notu',
            'extendedProps' => [
                'note' => $this->note ?? '',
                'transaction_date' => $this->transaction_date,
            ],
            'start' => Carbon::parse($this->note_date)->toDateTimeLocalString(),
            'color' => "black",
            "allDay" => false,
        ];
    }
}

Daha daha temiz kullanım için önerileriniz yorumkısmında paylaşabilirsiniz.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir