Jump to content
Üyelik kaydınızı yaparak son yazılan içeriklerden haberdar olun! ×
  • entries
    24
  • comments
    0
  • views
    73,582

Laravel Resource Api


Doğuhan ELMA

39 views

Laravel'de bir API Resource kullanarak, kullanıcılar ve onların postları dahil olmak üzere ilişkili verileri kolayca dönüştürebilir ve JSON olarak döndürebilirsiniz. Aşağıda, bir kullanıcının tüm postlarını içeren bir API Resource örneği yer almaktadır.

Evet, Laravel'de API Resource'lar, veriyi API üzerinden döndürmeden önce düzenlemek ve özelleştirmek için kullanılır. Bu, gelen veriyi istemcinin ihtiyaçlarına uygun bir formata dönüştürmek, gereksiz bilgileri çıkarmak veya ek veriler eklemek için yararlıdır. Özetle, API Resource'lar, verinin sunumunu kontrol etmenize olanak tanır ve bu, API'nizin tüketicileri için daha anlaşılır ve kullanışlı hale getirilmesinde önemli bir rol oynar.

Hevesli yükleme (eager loading) ile API Resource'ların kullanımı arasında doğrudan bir bağlantı olmasa da, birlikte kullanıldıklarında bir uygulamanın veri erişim katmanını ve sunum katmanını optimize etmek için güçlü bir kombinasyon oluştururlar. Hevesli yükleme, veritabanından veri çekerken yapılan sorguların sayısını azaltmaya yardımcı olurken; API Resource'lar, bu verilerin nasıl sergileneceğini belirlemenize yardımcı olur.

Adım 1: Resource Oluşturma

İlk olarak, User ve Post için iki adet resource oluşturmanız gerekmektedir. Laravel'in artisan komutunu kullanarak bu işlemi gerçekleştirebilirsiniz:

 

php artisan make:resource UserResource
php artisan make:resource PostResource

 

Bu komutlar, app/Http/Resources dizininde iki resource dosyası oluşturur.

Adım 2: PostResource Düzenleme

PostResource'ı, Post modelinizin yapısına uygun olarak doldurun. Örneğin, bir postun id, title ve body alanlarını döndürebilirsiniz:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class PostResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'body' => $this->body,
        ];
    }
}

 

Adım 3: UserResource Düzenleme

UserResource içinde, kullanıcıya ait postları da PostResource kullanarak dahil edebilirsiniz. Böylece, her bir kullanıcı için ilişkili postlar da dönüştürülmüş bir şekilde döndürülür:

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            // Postları PostResource kullanarak dönüştürme
            'posts' => PostResource::collection($this->posts),
          	//Eager Loading
            'posts' => PostResource::collection($this->whenLoaded('posts')),
        ];
    }
}

 

Bu kod parçasında, $this->posts kullanıcıya ait postları temsil eder. Laravel'in Eloquent ilişkileri sayesinde, bir kullanıcı nesnesi üzerinden doğrudan ilişkili postlara erişebilirsiniz.

whenLoaded metodu, eager loading ile ilişkili verileri işlerken oldukça yararlı bir özelliktir. whenLoaded metodu, bir modelin ilişkili verisinin yüklenip yüklenmediğini kontrol eder ve yalnızca ilişkili veri yüklenmişse bu veriyi Resource'a dahil eder. Bu, Resource'ların esnekliğini artırır ve sadece gerekli verilerin gönderilmesini sağlayarak yanıt boyutunu optimize eder.

Adım 4: Controller'da Kullanım

Artık UserResource ve PostResource'ı bir controller metodunda kullanabilirsiniz. Örneğin, bir kullanıcının bilgilerini ve ona ait tüm postları döndüren bir route için:

 

use App\Http\Resources\UserResource;
use App\Models\User;

public function show($id)
{
    $user = User::with('posts')->findOrFail($id);
    return new UserResource($user);
}

Bu örnekte, User::with('posts') kullanarak, kullanıcı bilgilerini çekerken aynı zamanda ilişkili postları da çekiyoruz. Bu işlem, N+1 sorgu probleminden kaçınmamıza yardımcı olur. Ardından, kullanıcıyı ve ilişkili postları UserResource aracılığıyla dönüştürüp JSON olarak döndürüyoruz.

Bu şekilde, Laravel'de API Resource kullanarak bir kullanıcının tüm postlarını da içeren yapısal bir dönüşüm sağlayabilir ve bu verileri API üzerinden erişilebilir hale getirebilirsiniz.

 

Not:

N+1 sorgu problemi, veritabanıyla çalışırken karşılaşılan yaygın bir performans sorunudur. Bu problem, bir uygulama bir koleksiyonu (örneğin, bir kullanıcı listesini) yükledikten sonra, koleksiyondaki her bir öğe için ek bir veritabanı sorgusu yapması gerektiğinde ortaya çıkar. Bu durum, özellikle ilişkisel veritabanlarını kullanırken, ilişkili verileri çekmek için çok sayıda gereksiz sorgunun yapılmasına neden olabilir ve uygulamanın performansını önemli ölçüde yavaşlatabilir.

N+1 Sorgu Probleminin Örneği

Örneğin, bir blog uygulamasında her bir kullanıcının yazdığı postları listelemek istediğinizi düşünün. İlk adımda, tüm kullanıcıları çeken bir sorgu yaparsınız; bu, "1" kısmına karşılık gelir. Daha sonra, her bir kullanıcı için ona ait postları çeken bir sorgu yaparsınız; eğer 10 kullanıcı varsa, bu 10 ek sorgu yapılacağı anlamına gelir. Dolayısıyla, toplamda 1 (ilk sorgu) + N (N kullanıcı için yapılan sorgular) sorgu yapmış olursunuz.

Problemin Çözümü

Bu problemi çözmek için, Laravel gibi modern web çatıları "eager loading" (hevesli yükleme) özelliğini sunar. Eager loading, ilişkili verilerin önceden yüklenmesini sağlayarak, bir koleksiyon ve ona bağlı ilişkiler için tek bir sorgu yapılmasını mümkün kılar. Bu, veritabanına yapılan toplam sorgu sayısını azaltır ve uygulamanın performansını önemli ölçüde artırır.

Laravel'de, Eloquent ORM kullanarak eager loading yapmak için with metodunu kullanabilirsiniz:

$users = User::with('posts')->get();

Bu kod, tüm kullanıcıları ve her bir kullanıcının postlarını tek bir sorguda çeker. Böylece, N+1 sorgu problemi önlenmiş olur.

N+1 sorgu problemi, özellikle büyük veritabanlarında ve karmaşık uygulamalarda önemli bir performans engelidir. Bu yüzden, uygulamanızı optimize ederken bu problemi ve çözümlerini göz önünde bulundurmalısınız.

0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...