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.