c *fiber.Ctx bunu nasil bir fonkyon icinde init ederim

Fiber’deki *fiber.Ctx nesnesi, bir HTTP isteği sırasında oluşan istek (request) ve yanıt (response) döngüsünü yönetir. Bu nesne sadece bir handler (yönlendirici) fonksiyonu içinde Fiber tarafından oluşturulur.

Yani *fiber.Ctx nesnesini dışarıdan manuel olarak “başlatamazsınız” (instantiate edemezsiniz). Ancak, bu nesneyi ihtiyaç duyduğunuz yardımcı fonksiyonlara parametre olarak geçirebilirsiniz.

İşte temiz ve modüler bir mimari için uygulayabileceğiniz yöntemler:

1. Yöntem: Handler İçinde Hazırlık ve Parametre Olarak Geçirme (En İyi Pratik)

Handler fonksiyonu Fiber ile konuşur, ancak asıl işi yapan “Service” katmanındaki fonksiyonlara *fiber.Ctx yerine sadece ihtiyacı olan verileri (örneğin sadece limit veya search değerini) geçirmek en iyi yaklaşımdır.

// Service Katmanı (Logic fonksiyonu)
func GetPostsFromDB(db *gorm.DB, start int, length int, search string) ([]Post, int64, error) {
    // Sadece veriyle ilgilenir, Fiber'den bağımsızdır.
    var posts []Post
    var count int64

    // İşlemler...
    return posts, count, nil
}

// Handler Katmanı
app.Get("/api/posts", func(c *fiber.Ctx) error {
    // Fiber'den verileri al
    start := c.QueryInt("start", 0)

    // Servis fonksiyonunu çağır
    posts, count, _ := GetPostsFromDB(db, start, 10, "")

    return c.JSON(fiber.Map{"data": posts, "total": count})
})

2. Yöntem: Context’i Fonksiyona Taşımak

Eğer fonksiyonun içinde c.Status(), c.JSON() veya c.Params() gibi Fiber özelliklerine sürekli ihtiyacınız varsa, fonksiyon imzasını şu şekilde kurabilirsiniz:

func HandleRequestData(c *fiber.Ctx) error {
    // Bu fonksiyon doğrudan Fiber context'ini kullanabilir
    search := c.Query("search")

    // ... işlemler
    return c.JSON(fiber.Map{"search": search})
}

// Kullanımı
app.Get("/search", HandleRequestData)

3. Yöntem: Locals Kullanımı (Veri Paylaşımı)

*fiber.Ctx içerisindeki .Locals() fonksiyonunu kullanarak, middleware’de başlattığınız bir veriyi (örneğin Auth bilgisi veya User ID) tüm fonksiyonlarınızda kullanabilirsiniz.

// Middleware
app.Use(func(c *fiber.Ctx) error {
    c.Locals("userID", 123) // Bir kez set et
    return c.Next()
})

// İstediğiniz herhangi bir fonksiyonda
func MyHandler(c *fiber.Ctx) error {
    userID := c.Locals("userID") // Buradan al
    return c.SendString(fmt.Sprintf("User: %v", userID))
}

Neden *fiber.Ctx ile “Init” yapmamalısınız?

  • Test Edilebilirlik: Eğer fonksiyonlarınızı *fiber.Ctx‘e bağımlı yaparsanız, o fonksiyonu bir HTTP isteği olmadan test edemezsiniz (Unit test yazamazsınız).
  • Bağımsızlık: Fonksiyonlarınızı c.Query(), c.Params() yerine doğrudan int, string gibi standart Go tiplerini kabul edecek şekilde tasarlarsanız, aynı fonksiyonu hem HTTP API’nizde hem de bir CLI komutunda veya bir background job’da değiştirmeden kullanabilirsiniz.

Özetle: *fiber.Ctx nesnesini başlatmaya çalışmayın. *fiber.Ctx‘ten verileri çıkarın (c.QueryInt gibi) ve bu saf verileri kendi yazdığınız fonksiyonlara parametre olarak gönderin.

Bu şekilde kodunuzu “Fiber’e bağlı” olmaktan kurtarıp “saf Go kodu” haline getirmiş olursunuz. Bu yaklaşım kod tabanınızı uzun vadede çok daha sürdürülebilir kılacaktır. Başka bir katman mimarisi (Service/Repository pattern) üzerinde çalışıyor musunuz?