Laravel (Dto)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.