Laravel (Dto)Resource Kullanımı

Yasin DALKILIÇ
3 min readDec 18, 2020

--

Laravel Resource Kullanımı

Laravel kullanırken bazı durumlarda database içerisinden aldığımız verinin tüm alanlarıyla birlikte Client tarafına göndermek istemeyiz, örneğin kullanıcının sadece adı ve soyadını gösterdiğimiz bir sayfada kullanıcın diğer bilgilerinin de Client’a gönderilmesi maaliyetli olabilmektedir bu sorundan kurtulmak için DTO(Data Transfer Object) kullanılarak yeni bir sınıfa ilgili veriler maplenerek aktarılır ve Client’a yeni oluşturulan Model(Obje,Sınıf..) gönderilir. Laravel bunun için bizlere Resources yapısını sunmaktadır.Şimdi bir örnek yaparak daha iyi anlamaya çalışalım.

Proje Oluşturma

composer create-project laravel/laravel example-app
cd example-app
php artisan serve

Projemizi oluşturduktan sonra basitce iki adet controller,model ve migration oluşturalım.

php artisan make:controller UserController
php artisan make:controller TaskController
php artisan make:model User
php artisan make:model Task
php artisan make:migration create_task_table
php artisan make:migration create_user_table

dedikten sonra database/migrations içerisine gidip tablolarımızı oluşturalım.

create_task_table

Schema::create('task', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string("task_name");
$table->string("status");

$table->timestamps();
});

create_user_table

Schema::create('user', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string("user_name");
$table->string("user_last_name");
$table->string("user_age");

$table->unsignedBigInteger("task_id");
$table->foreign('task_id')->references('id')->on('task')->onDelete("cascade")->onUpdate("cascade");

$table->timestamps();
});

tablomuzu oluşturduktan sonra

php artisan migrate 

komutunu çalıştırarak tablolarımızı oluşturuyoruz.

UserController oluşturduktan sonra içerisine tüm kullanıcıların listesini dönen bir fonksiyon yazalım.

public  function Index(){
return User::all();
}

yanıtımız yukarıdaki gibi olacaktır, gördügünüz gibi belki burada user_age alanına ihtiyacımız olmayabilir yada ilgili veri üstünde full_name diyerek Client’a göndermek isteyebiliriz bunun için

php artisan make:resource UserCollection

komutunu çalıştırıyoruz daha sonra app/Http/Resources/UserCollection.php dosyasını aşağıdaki gibi düzenliyorum.

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;
class UserCollection extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'full_name' => $this->user_name. '' .' '. $this- >user_last_name,
'age' => $this->user_age,
];
}
}

şimdi oluşturmuş olduğumuz resource kullanalım, UserController’a gidip Index methodumu aşağıdaki gibi güncelliyorum.

use App\Http\Resources\UserCollection as UserResource;public  function Index(){
return UserResource::collection(User::all());
}

almış olduğumuz yeni cevap ise şu şekildedir

gördügünüz gibi ihtiyacımız olmayan alanları ve ilgili veriyi isteğimize göre düzenleyip Client’a tekrar gönderdik.

İlişkili olduğu task verisi içinde aynı işlemleri örnek için TaskResource oluşturduktan sonra , app/Http/Resources/UserCollection.php içeriğini güncelliyoruz.

public function toArray($request)
{
return [
'id' => $this->id,
'full_name' => $this->user_name. '' .' '. $this->user_last_name,
'age' => $this->user_age,
"Gorev"=> new TaskCollection($this->task)
];
}

görmüş olduğunuz gibi ilişkili olan Task içinde bir Resources(Dto) tanımlayıp User Resources da (Dto) da tanımını gerçekleştirdik daha fazlası için

https://laravel.com/docs/8.x/eloquent-resources ziyaret edebilirsiniz.

Herkese İyi Çalışmalar.

--

--

Yasin DALKILIÇ
Yasin DALKILIÇ

Written by Yasin DALKILIÇ

Hi, My name is Yasin I am a Software Developer, I love so much researching and development 😊 Here is my youtube channel @webciyasin

Responses (1)