Panel SDK'nın tam API referansı. Tüm metodlar, parametreler ve dönüş değerleri burada belirtilmiştir.
Bu doküman, detaylı ve düşük seviye API bakışı içindir. Uçtan uca başlangıç için önce Başlarken ve Kaynaklar (Resource) dokümanlarını takip edin.
- Bir metodun imzasını veya dönüş tipini doğrularken
- Field/relationship builder zincirinde hangi seçeneklerin olduğunu ararken
- Policy ve query davranışlarını referans düzeyinde kontrol ederken
- Resource davranışı için:
Resource Interface - Alan davranışı için:
Field Interface - İlişki kurulumları için:
Relationship Fields - Yetki kontrolleri için:
Policy Interface - Sorgu detayları için:
Query Builder
- Resource Interface
- Field Interface
- Relationship Fields
- Policy Interface
- Query Builder
- Index ve Lens View Parametreleri
- Context
- Error Handling
Kaynağın temsil ettiği veri modelini döndürür.
func (r *UserResource) Model() interface{} {
return &User{}
}Dönüş Değeri: Veri modeli (struct pointer)
Kaynağın URL slug'ını döndürür.
func (r *UserResource) Slug() string {
return "users"
}Dönüş Değeri: Slug string'i (örn: "users", "products")
Kaynağın başlığını döndürür.
func (r *UserResource) Title() string {
return "Kullanıcılar"
}Dönüş Değeri: Başlık string'i
Kaynağın ikonunu döndürür.
func (r *UserResource) Icon() string {
return "user"
}Dönüş Değeri: İkon adı (örn: "user", "product", "cog")
Kaynağın ait olduğu grubu döndürür.
func (r *UserResource) Group() string {
return "Yönetim"
}Dönüş Değeri: Grup adı
Kaynağın alanlarını döndürür.
func (r *UserResource) Fields() []fields.Element {
return []fields.Element{
fields.ID(),
fields.Text("İsim", "name"),
fields.Email("E-posta", "email"),
}
}Dönüş Değeri: Alan listesi
Sıralanabilir alanları döndürür.
func (r *UserResource) SortableBy() []string {
return []string{"name", "email", "created_at"}
}Dönüş Değeri: Sıralanabilir alan adları
Sayfa başına kayıt sayısını döndürür.
func (r *UserResource) PerPage() int {
return 15
}Dönüş Değeri: Sayfa başına kayıt sayısı (varsayılan: 15)
Kayıt oluşturulmadan önce çalışır.
func (r *UserResource) BeforeCreate(ctx context.Context, data map[string]interface{}) error {
// Şifreyi hash'le
if password, ok := data["password"].(string); ok {
data["password"] = hashPassword(password)
}
return nil
}Parametreler:
ctx: Contextdata: Oluşturulacak veri
Dönüş Değeri: Hata (nil başarılı)
Kayıt oluşturulduktan sonra çalışır.
func (r *UserResource) AfterCreate(ctx context.Context, model interface{}) error {
user := model.(*User)
sendWelcomeEmail(user.Email)
return nil
}Parametreler:
ctx: Contextmodel: Oluşturulan model
Dönüş Değeri: Hata (nil başarılı)
Kayıt güncellenecekten önce çalışır.
func (r *UserResource) BeforeUpdate(ctx context.Context, id interface{}, data map[string]interface{}) error {
// Doğrulama
return nil
}Parametreler:
ctx: Contextid: Kayıt ID'sidata: Güncellenecek veri
Dönüş Değeri: Hata (nil başarılı)
Kayıt güncellendikten sonra çalışır.
func (r *UserResource) AfterUpdate(ctx context.Context, model interface{}) error {
user := model.(*User)
logAction("user_updated", user.ID)
return nil
}Parametreler:
ctx: Contextmodel: Güncellenen model
Dönüş Değeri: Hata (nil başarılı)
Kayıt silinecekten önce çalışır.
func (r *UserResource) BeforeDelete(ctx context.Context, id interface{}) error {
// Silme öncesi kontrol
return nil
}Parametreler:
ctx: Contextid: Kayıt ID'si
Dönüş Değeri: Hata (nil başarılı)
Kayıt silindikten sonra çalışır.
func (r *UserResource) AfterDelete(ctx context.Context, id interface{}) error {
logAction("user_deleted", id)
return nil
}Parametreler:
ctx: Contextid: Silinen kayıt ID'si
Dönüş Değeri: Hata (nil başarılı)
Veri modelinden alan değerini çözer.
func (f *TextField) Resolve(data interface{}) interface{} {
user := data.(*User)
return user.Name
}Parametreler:
data: Veri modeli
Dönüş Değeri: Alan değeri
Alanı JSON'a dönüştürür.
func (f *TextField) Serialize(data interface{}) map[string]interface{} {
return map[string]interface{}{
"type": "text",
"value": f.Resolve(data),
}
}Parametreler:
data: Veri modeli
Dönüş Değeri: JSON map'i
Alan değerini doğrular.
func (f *TextField) Validate(value interface{}) error {
str, ok := value.(string)
if !ok {
return fmt.Errorf("string olmalı")
}
if len(str) == 0 {
return fmt.Errorf("boş olamaz")
}
return nil
}Parametreler:
value: Doğrulanacak değer
Dönüş Değeri: Hata (nil başarılı)
Field UI davranışı için WithProps(key, value) ile frontend'e ek metadata geçebilirsiniz.
Addon destekli anahtarlar:
startAddon: Alanın başında render edilir (Form/Detail/Index)endAddon: Alanın sonunda render edilir (Form/Detail/Index)
Uyumluluk alias'ları:
- Baş addon:
start_component,prefix,prepend - Son addon:
end_component,suffix,append
fields.Text("Website", "website").
OnForm().
WithProps("startAddon", "https://")
fields.Number("Fiyat", "price").
OnForm().
WithProps("startAddon", "₺").
WithProps("endAddon", "/ay")Detaylı field davranışları için: Fields
Alanı sadece liste sayfasında göster.
fields.Text("İsim", "name").OnlyOnIndex()Dönüş Değeri: Alan (fluent API)
Alanı sadece detay sayfasında göster.
fields.Text("İsim", "name").OnlyOnDetail()Dönüş Değeri: Alan (fluent API)
Alanı sadece form'da göster.
fields.Text("İsim", "name").OnlyOnForms()Dönüş Değeri: Alan (fluent API)
HiddenIf(callback func(interface{}) bool) *TextField
Koşula göre alanı gizle.
fields.Text("Şifre", "password").
HiddenIf(func(data interface{}) bool {
return true // Gizle
})Parametreler:
callback: Gizleme koşulu
Dönüş Değeri: Alan (fluent API)
Alanı aranabilir yap.
fields.Text("İsim", "name").Searchable()Dönüş Değeri: Alan (fluent API)
Alanı sıralanabilir yap.
fields.Text("İsim", "name").Sortable()Dönüş Değeri: Alan (fluent API)
İlişkili alanda aranabilir sütunları belirle.
fields.BelongsTo("Yazar", "user_id", "users").
WithSearchableColumns("name", "email")Parametreler:
columns: Sütun adları
Dönüş Değeri: Alan (fluent API)
Form ve detail görünümünde alanın 12 kolon grid içindeki genişliğini ayarlar.
fields.Text("Ad", "first_name").Span(6)
fields.Text("Soyad", "last_name").Span(6)Parametreler:
columns: Kolon genişliği (1..12)
Notlar:
- Varsayılan span değeri
12(tam genişlik) - Geçersiz değerler clamp edilir (
<1 => 1,>12 => 12) - Sadece form/detail görünümünde etkilidir
Dönüş Değeri: Alan (fluent API)
Number field formundaki artı/eksi butonlarının görünürlüğünü ayarlar.
fields.Number("Fiyat", "price").ShowNumberControls(false)Parametreler:
show:trueise kontroller görünür,falseise gizli
Dönüş Değeri: Alan (fluent API)
Number field formundaki artı/eksi butonlarını gizler (ShowNumberControls(false) kısayolu).
fields.Number("Fiyat", "price").HideNumberControls()Dönüş Değeri: Alan (fluent API)
Alanı zorunlu yap.
fields.Text("İsim", "name").Required()Dönüş Değeri: Alan (fluent API)
Doğrulama kuralları ekle.
fields.Text("İsim", "name").
Rules(
validate.MinLength(3),
validate.MaxLength(100),
)Parametreler:
rules: Doğrulama kuralları
Dönüş Değeri: Alan (fluent API)
fields.BelongsTo(label, foreignKey, table string) *BelongsToMetodlar:
DisplayUsing(key string) *BelongsTo- Gösterilecek alanı belirleWithSearchableColumns(columns ...string) *BelongsTo- Aranabilir alanları belirleQuery(callback func(*Query) *Query) *BelongsTo- Query'yi özelleştirWithEagerLoad() *BelongsTo- Eager loading kullanWithLazyLoad() *BelongsTo- Lazy loading kullanRequired() *BelongsTo- Zorunlu yap
Örnek:
fields.BelongsTo("Yazar", "user_id", "users").
DisplayUsing("name").
WithSearchableColumns("name", "email").
WithEagerLoad()fields.HasMany(label, relationName, table string) *HasManyMetodlar:
ForeignKey(key string) *HasMany- Foreign key belirleOwnerKey(key string) *HasMany- Owner key belirleQuery(callback func(*Query) *Query) *HasMany- Query'yi özelleştirWithEagerLoad() *HasMany- Eager loading kullanWithLazyLoad() *HasMany- Lazy loading kullan
Örnek:
fields.HasMany("Yazılar", "posts", "posts").
ForeignKey("author_id").
WithEagerLoad()fields.HasOne(label, relationName, table string) *HasOneMetodlar:
ForeignKey(key string) *HasOne- Foreign key belirleOwnerKey(key string) *HasOne- Owner key belirleQuery(callback func(*Query) *Query) *HasOne- Query'yi özelleştir
Örnek:
fields.HasOne("Profil", "profile", "profiles").
ForeignKey("user_id")fields.BelongsToMany(label, pivotTable, table string) *BelongsToManyMetodlar:
PivotTable(name string) *BelongsToMany- Pivot table adını belirleForeignKey(key string) *BelongsToMany- Foreign key belirleRelatedKey(key string) *BelongsToMany- Related key belirleQuery(callback func(*Query) *Query) *BelongsToMany- Query'yi özelleştir
Örnek:
fields.BelongsToMany("Roller", "role_user", "roles").
PivotTable("role_user").
ForeignKey("user_id").
RelatedKey("role_id")fields.MorphTo(label, morphKey string) *MorphToMetodlar:
Types(types map[string]string) *MorphTo- Type mapping belirle
Örnek:
fields.MorphTo("Yorumlanabilir", "commentable").
Types(map[string]string{
"post": "posts",
"video": "videos",
})Herhangi bir kaynağı görüntüleme izni.
func (p *UserPolicy) ViewAny(ctx context.Context) bool {
user := ctx.Value("user").(*User)
return user.Role == "admin"
}Parametreler:
ctx: Context
Dönüş Değeri: İzin (true/false)
Belirli bir kaynağı görüntüleme izni.
func (p *UserPolicy) View(ctx context.Context, model interface{}) bool {
user := ctx.Value("user").(*User)
target := model.(*User)
return user.ID == target.ID || user.Role == "admin"
}Parametreler:
ctx: Contextmodel: Kaynak modeli
Dönüş Değeri: İzin (true/false)
Kaynak oluşturma izni.
func (p *UserPolicy) Create(ctx context.Context) bool {
user := ctx.Value("user").(*User)
return user.Role == "admin"
}Parametreler:
ctx: Context
Dönüş Değeri: İzin (true/false)
Kaynak güncelleme izni.
func (p *UserPolicy) Update(ctx context.Context, model interface{}) bool {
user := ctx.Value("user").(*User)
target := model.(*User)
return user.ID == target.ID || user.Role == "admin"
}Parametreler:
ctx: Contextmodel: Kaynak modeli
Dönüş Değeri: İzin (true/false)
Kaynak silme izni.
func (p *UserPolicy) Delete(ctx context.Context, model interface{}) bool {
user := ctx.Value("user").(*User)
return user.Role == "admin"
}Parametreler:
ctx: Contextmodel: Kaynak modeli
Dönüş Değeri: İzin (true/false)
Kaynak geri yükleme izni (soft delete).
func (p *UserPolicy) Restore(ctx context.Context, model interface{}) bool {
user := ctx.Value("user").(*User)
return user.Role == "admin"
}Parametreler:
ctx: Contextmodel: Kaynak modeli
Dönüş Değeri: İzin (true/false)
Kaynak kalıcı silme izni.
func (p *UserPolicy) ForceDelete(ctx context.Context, model interface{}) bool {
user := ctx.Value("user").(*User)
return user.Role == "admin"
}Parametreler:
ctx: Contextmodel: Kaynak modeli
Dönüş Değeri: İzin (true/false)
WHERE clause ekle.
query.Where("status", "=", "active")Parametreler:
column: Sütun adıoperator: Operatör (=, !=, >, <, >=, <=, LIKE)value: Değer
Dönüş Değeri: Query (fluent API)
WHERE IN clause ekle.
query.WhereIn("status", []interface{}{"active", "pending"})Parametreler:
column: Sütun adıvalues: Değer listesi
Dönüş Değeri: Query (fluent API)
ORDER BY ekle.
query.OrderBy("created_at", "DESC")Parametreler:
column: Sütun adıdirection: Yön (ASC, DESC)
Dönüş Değeri: Query (fluent API)
LIMIT ekle.
query.Limit(10)Parametreler:
count: Limit sayısı
Dönüş Değeri: Query (fluent API)
OFFSET ekle.
query.Offset(20)Parametreler:
count: Offset sayısı
Dönüş Değeri: Query (fluent API)
SELECT sütunları belirle.
query.Select("id", "name", "email")Parametreler:
columns: Sütun adları
Dönüş Değeri: Query (fluent API)
Resource index, relationship index ve lens endpoint'lerinde table/grid görünümü
view query parametresi ile yönetilir.
viewgönderilmezse varsayılan görünümtableolur.
GET /api/resource/users?users[view]=gridAlternatif:
GET /api/resource/users?view=gridGET /api/resource/tags?tags[view]=grid&viaResource=products&viaResourceId=42&viaRelationship=tagsGET /api/resource/users/lens/active-users?view=gridtablegrid
Geçersiz bir değer gelirse backend otomatik olarak table kabul eder.
Grid kart başlığı için backend, resource tarafındaki GetRecordTitleKey() değerini döner:
- Resource index response:
meta.grid_enabled - Resource index response:
meta.record_title_key - Lens response:
grid_enabled(top-level) - Lens response:
record_title_key(top-level)
Grid visibility notu:
HideOnGridalanlarıheaders/kart listing tarafında filtreler.- Aynı alanların row payload (
data) içinde kalması beklenen davranıştır.
Örnek (resource index):
{
"data": [...],
"meta": {
"grid_enabled": true,
"record_title_key": "name",
"headers": [...]
}
}Örnek (lens):
{
"name": "Active Users",
"grid_enabled": true,
"record_title_key": "full_name",
"headers": [...],
"data": [...]
}r.SetRecordTitleKey("name")
r.SetGridEnabled(true) // optional, varsayılan trueMevcut kullanıcı bilgisi.
user := ctx.Value("user").(*User)Kiracı ID'si (multi-tenancy).
tenantID := ctx.Value("tenant_id").(string)HTTP isteği.
request := ctx.Value("request").(*http.Request)HTTP yanıtı.
response := ctx.Value("response").(http.ResponseWriter)Doğrulama hatası.
type ValidationError struct {
Field string
Message string
}Yetkilendirme hatası.
type AuthorizationError struct {
Message string
}Kayıt bulunamadı hatası.
type NotFoundError struct {
Message string
}func (r *UserResource) BeforeCreate(ctx context.Context, data map[string]interface{}) error {
if data["email"] == "" {
return fmt.Errorf("e-posta gerekli")
}
return nil
}- Yalnızca API referansına bakıp entegrasyon yapmak: Önce Başlarken akışını baz alın.
- Field görünürlük metodlarını karıştırmak:
OnlyOn...veHideOn...kombinasyonlarını birlikte kontrol edin. - Relationship'te yalnızca field builder'a bakmak:
resource.Register(...)ve slug doğruluğunu ayrıca kontrol edin. - Policy imzalarını eksik implemente etmek: Resource tarafındaki policy beklentisiyle birebir eşleştiğinden emin olun.
- Alanlar (Fields) - Field system genel bakış
- Kaynaklar (Resource) - Resource tanımı
- İlişkiler (Relationships) - Relationship fields
- Yetkilendirme - Policy tanımı
- Gelişmiş Kullanım - İleri seviye özellikler