Kontentga o‘tish

v1.17-dan v1.18-ga yangilash

Qiziqarli yangi xususiyatlar 🎉

Yaxshilanishlar 🚀

Buzuvchi o'zgarishlar 🛠

Yangilash bo'yicha qo'llanma

Golang v1.24 endi qo'llab-quvvatlanmagani sababli, Goravel qo'llab-quvvatlaydigan Golang versiyasi 1.24 dan 1.25 ga ko'tarildi.

goravel/example loyihasining v1.17 dan v1.18 ga yangilash PR'i yangilash uchun namuna sifatida ishlatilishi mumkin: goravel/example#133.

Quyidagi ko'rsatmalarni AI kodlash agentingizga nusxalab, Goravel loyihangizni avtomatik ravishda yangilash uchun joylashingiz mumkin.

markdown
# Goravel v1.18 uchun yangilash qo'llanmasi

**Boshlashdan oldin**: barcha o'zgarishlar commit qilingan yoki stashed ekanligiga, loyiha toza holda build bo'lishiga (`go build ./...`), Go ≥ 1.25 o'rnatilganligiga va Goravel versiyasi ≥ 1.17.0 ekanligiga ishonch hosil qiling.

## 1-qadam: Go modul bog'liqliklarini yangilash

**Aniqlash**: Qaysi fasad paketlari allaqachon o'rnatilganligini tekshiring:

```shell
rg -l 'goravel/(gin|fiber|redis|s3|oss|cos|minio)' go.sum 2>/dev/null
```

**Amal**: Framework yangilash buyrug'ini ishga tushiring va faqat `go.sum` da aniqlangan fasad paketlarini yangilang:

```shell
go get github.com/goravel/framework@latest

# Har bir aniqlangan fasad uchun mos keladigan go get ni ishga tushiring.
# Agar goravel/gin go.sum da bo'lsa:   go get github.com/goravel/gin@latest
# Agar goravel/fiber go.sum da bo'lsa: go get github.com/goravel/fiber@latest
# Agar goravel/redis go.sum da bo'lsa: go get github.com/goravel/redis@latest
# Agar goravel/s3 go.sum da bo'lsa:    go get github.com/goravel/s3@latest
# Agar goravel/oss go.sum da bo'lsa:   go get github.com/goravel/oss@latest
# Agar goravel/cos go.sum da bo'lsa:   go get github.com/goravel/cos@latest
# Agar goravel/minio go.sum da bo'lsa: go get github.com/goravel/minio@latest

go mod tidy
```

## 2-qadam: HTTP middleware-ni func dan interfeysga o'tkazish

`contracts/http.Middleware` `func(http.Context)` dan `Handle(http.Context)` va `Signature() string` metodlariga ega interfeysga o'zgartirildi. Har bir maxsus middleware yangilanishi kerak.

### 2a. Barcha maxsus middleware funksiyalarini aniqlash

```shell
rg -n 'func\s+\w+\s*\(.*\)\s+http\.Middleware' --type go
rg -n 'func\s+\w+\s*\(.*\)\s+contractshttp\.Middleware' --type go
```

Shuningdek, anonim middleware-larni qidiring (inline `return func(ctx http.Context)`):

```shell
rg -n 'return\s+func\(ctx\s+http\.Context\)' --type go
```

### 2b. Har bir middleware-ni o'zgartirish

Har bir aniqlangan middleware uchun factory funksiya imzosini saqlang va yopilish (closure) tanasini struct literal bilan almashtiring:

```diff
 func Auth() http.Middleware {
-    return func(ctx http.Context) {
-        ctx.Request().Next()
-    }
+    return &Auth{}
 }

+type Auth struct{}
+
+func (a *Auth) Handle(ctx http.Context) {
+    ctx.Request().Next()
+}
+
+func (a *Auth) Signature() string {
+    return "auth"
+}
```

Agar asl factory parametrlarni qabul qilgan bo'lsa, ularni struct literalga uzating:

```diff
 func Throttle(name string) http.Middleware {
-    return func(ctx http.Context) {
-        // throttle mantiqi name dan foydalanadi
-    }
+    return &Throttle{Name: name}
 }
+
+type Throttle struct{ Name string }
+
+func (t *Throttle) Handle(ctx http.Context) { /* t.Name ishlatilgan throttle mantiqi */ }
+func (t *Throttle) Signature() string { return "throttle-" + t.Name }
```

Chaqiruv joylari `middleware.Auth()` kabi o'zgarmaydi — factory funksiya hali ham `http.Middleware` qaytaradi, lekin endi closure o'rniga struct qaytaradi.

### 2c. Tekshirish

```shell
# Hech qanday func-qaytaruvchi middleware naqshlari qolmaganligini tekshiring
rg -n 'func.*http\.Middleware' --type go

# Build muvaffaqiyatli bo'lishi kerak
go build ./...
```

## 3-qadam: Validatsiya qoidasi va filtr xaritalarini yangilash

Validatsiya qoidalari va filtrlar endi `map[string]string` o'rniga `map[string]any` dan foydalanadi.

### 3a. Ta'sirlangan fayllarni aniqlash

```shell
rg -n 'map\[string\]string.*Validate\(' --type go
rg -n 'map\[string\]string.*Make\(' --type go
rg -n 'Rules\(\).*map\[string\]string' --type go
rg -n 'Filters\(\).*map\[string\]string' --type go
rg -n 'Messages\(\).*map\[string\]string' --type go
rg -n 'Attributes\(\).*map\[string\]string' --type go
```

Shuningdek, allaqachon `map[string]any` ishlatadigan yoki qisqa o'zgaruvchi deklaratsiyasidan foydalanadigan `Validate` va `Make` chaqiruvlarini qidiring:

```shell
rg -n '\.Validate\(.*map\[string\]' --type go
rg -n 'validation\.Make\(.*map\[string\]' --type go
```

### 3b. O'zgartirishni qo'llash

`Validate` va `Make` chaqiruvlarida `map[string]string` ni `map[string]any` bilan almashtiring:

```diff
-ctx.Request().Validate(map[string]string{
+ctx.Request().Validate(map[string]any{
     "title": "required|max:255",
 })
```

Shuningdek, forma so'rovi metod imzolarini yangilang — `Rules()`, `Messages()`, `Attributes()` va `Filters()`:

```diff
-func (r *UserCreate) Rules(ctx http.Context) map[string]string {
-    return map[string]string{
+func (r *UserCreate) Rules(ctx http.Context) map[string]any {
+    return map[string]any{
         "name": "required",
     }
 }

-func (r *UserCreate) Messages(ctx http.Context) map[string]string {
-    return map[string]string{}
+func (r *UserCreate) Messages(ctx http.Context) map[string]any {
+    return map[string]any{}
 }

-func (r *UserCreate) Filters(ctx http.Context) map[string]string {
-    return map[string]string{
+func (r *UserCreate) Filters(ctx http.Context) map[string]any {
+    return map[string]any{
         "name": "trim",
     }
 }
```

Agar `regex` yoki `not_regex` qoida qiymatida `|` mavjud bo'lsa va undan keyin boshqa qoidalar kelsa, `[]string` ga o'ting:

```diff
 rules := map[string]string{
-    "slug": "required|regex:^(news|docs)-[a-z]+$|string",
+    "slug": []string{"required", "regex:^(news|docs)-[a-z]+$", "string"},
 }
```

### 3c. Tekshirish

```shell
# Validatsiya kontekstlarida map[string]string qolmaganligini tekshiring
rg -n 'Validate\(.*map\[string\]string' --type go
rg -n 'Make\(.*map\[string\]string' --type go
rg -n 'Rules\(.*map\[string\]string' --type go
rg -n 'Messages\(.*map\[string\]string' --type go
rg -n 'Filters\(.*map\[string\]string' --type go

go build ./...
```

## 4-qadam: Pochta andoza kontent maydonlarini yangilash

Pochta kontent maydonlari endi aniq: HTML shablonlar uchun `HtmlView`, matnli shablonlar uchun `TextView`, xom kontent uchun `Html`/`Text`.

### 4a. Ta'sirlangan fayllarni aniqlash

```shell
rg -n '\.View\s*:' --type go -g '!vendor/**' -g '!storage/**'
rg -n 'Content\(.*mail\.Content\{' --type go
rg -n '&mail\.Content\{' --type go
```

### 4b. O'zgartirishni qo'llash

Har bir `mail.Content{}` literali uchun:

| Eski maydon | Yangi maydon | Shart |
|-------------|--------------|-------|
| `View:` | `HtmlView:` | Har doim (HTML shablonlar uchun edi) |
| `Text:` (qiymat `.html`, `.txt`, `.tmpl` bilan tugaydi yoki fayl yo'li) | `TextView:` | Qiymat shablon yo'li bo'lganda |
| `Text:` (qiymat xom satr, yo'l emas) | `Text:` | Xom kontent uchun o'zgarishsiz qoladi |

**Namuna — shablonga asoslangan email**:
```diff
 Content(mail.Content{
-    View: "welcome.html",
-    Text: "welcome.txt",
+    HtmlView: "welcome.html",
+    TextView: "welcome.txt",
     With: map[string]any{
         "Name": "Goravel",
     },
 })
```

**Namuna — xom kontent email (o'zgarishsiz)**:
```go
Content(mail.Content{Text: "Hello Goravel"})
```

Agar fayl allaqachon `Html:` / `Text:` dan foydalanayotgan bo'lsa (v1.17+ dagi xom kontent namunasi), o'zgartirish shart emas.

### 4c. Tekshirish

```shell
# Pochta Content structlarida View: qolmaganligini tekshiring
rg -n '\.View\s*:.*\.html' --type go

go build ./...
```

## 5-qadam: gRPC config kaliti servers ni clients ga o'zgartirish

### 5a. Ta'sirlangan fayllarni aniqlash

```shell
rg -n '"servers"' --type go -g '*grpc*'
rg -n 'grpc\.servers' --type go
```

### 5b. O'zgartirishni qo'llash

`config/grpc.go` da config kalitini o'zgartiring:

```diff
 config.Add("grpc", map[string]any{
     "host": config.Env("GRPC_HOST", ""),
-    "servers": map[string]any{
+    "clients": map[string]any{
         "user": map[string]any{
             "host":           config.Env("GRPC_USER_HOST", ""),
             ...
         },
     },
 })
```

Ilova kodida har qanday config yo'l havolalarini yangilang:

```diff
-facades.Config().Get("grpc.servers.user.host")
+facades.Config().Get("grpc.clients.user.host")
```

### 5c. Tekshirish

```shell
# gRPC config da "servers" kaliti qolmaganligini tekshiring
rg -n '"servers"' --type go -g '*grpc*'
rg -n 'grpc\.servers' --type go

go build ./...
```

## 6-qadam: Validatsiya xato xabarlari va maxsus qoida nomlarini yangilash

Yangi mahalliy validatsiya mexanizmi ([goravel/framework#1397](https://github.com/goravel/framework/pull/1397)) Laravel uslubidagi xato xabarlarini ishlab chiqaradi va barcha qoidalarni (shu jumladan wildcard-larni) boshqacha tarzda baholaydi. Maxsus validatsiya xato xabarlari yoki JSON xato javoblarini tekshiradigan har qanday testlar yangilanishi kerak.

### 6a. Ta'sirlangan testlarni aniqlash

```shell
rg -n 'Equal.*message.*required' --type go
rg -n 'Equal.*message.*regex' --type go
rg -n 'Equal.*message.*date' --type go
rg -n 'Required.*is required to not be empty' --type go
```

### 6b. Xato xabari kutilmalarini yangilash

Eski uslubdagi xato xabari tasdiqlarini yangi Laravel uslubidagi xabarlar bilan almashtiring:

| Eski xabar | Yangi xabar |
|-------------|-------------|
| `"name is required to not be empty"` | `"The name field is required."` |
| `"code value does not pass the regex check"` | `"The code field format is invalid."` |
| `"date value should be a date string"` | `"The date field must be a valid date."` |

Test diff namunasi:

```diff
-s.Equal("{\"message\":{\"name\":{\"required\":\"name is required to not be empty\"}}}", content)
+s.Equal("{\"message\":{\"name\":{\"required\":\"The name field is required.\"}}}", content)
```

> **Eslatma**: Wildcard qoidalari (masalan, `scores.*`, `tags.*`) endi hech qanday kiritish bo'lmasa ham, xato chiqishida izchil ravishda paydo bo'ladi. Agar testlaringiz to'liq xato javob tanasini tekshirsa, ular uchun tasdiqlar qo'shing.

### 6c. O'rnatilgan qoidalar bilan ziddiyatli maxsus qoidalarni qayta nomlash

Yangi mexanizm o'rnatilgan qoidalarni (`required`, `email`, `exists`, `unique` va h.k.) o'z ichiga oladi, ular maxsus qoida nomlari bilan ziddiyatga tushishi mumkin. `Signature()` metodi o'rnatilgan qoida nomiga mos keladigan har qanday maxsus qoidani qayta nomlang:

```diff
 func (receiver *Exists) Signature() string {
-    return "exists"
+    return "exists_custom"
 }
```

### 6d. Tekshirish

```shell
go build ./...
go test ./... 2>&1 || true
```

## 7-qadam: goravel-development skill-ni o'rnatish

Goravel AI kodlash konvensiyalari skill-ni goravel-lite dan yuklab oling, shunda yangilash davomida loyiha tuzilishi, fasadlar, testlash namunalari va Artisan buyruqlariga murojaat qilishingiz mumkin:

```shell
mkdir -p .agents/skills/goravel-development
curl -fsSL -o .agents/skills/goravel-development/SKILL.md \
  https://raw.githubusercontent.com/goravel/goravel-lite/master/.agents/skills/goravel-development/SKILL.md
```

### 7a. Tekshirish

```shell
ls -l .agents/skills/goravel-development/SKILL.md
```

## 8-qadam: Yakuniy tekshirish

Barcha qadamlarni bajarganingizdan so'ng, to'liq tekshirish to'plamini ishga tushiring:

```shell
go build ./...
go vet ./...
go test ./... 2>&1 || true
```

Agar testlar muvaffaqiyatsiz bo'lsa, eng keng tarqalgan sabablar:
- O'tkazilmagan test middleware funksiyalari (2-qadam).
- `map[string]string` dan foydalanadigan test validatsiya chaqiruvlari (3-qadam).
- Eski maydon nomlariga ega test mail Content structlari (4-qadam).
- Eski formatdagi test validatsiya xato xabari tasdiqlari (6-qadam).
- O'rnatilgan qoida nomlari bilan ziddiyatli maxsus qoida imzolari (6-qadam).

Xususiyat taqdimoti

AI SDK

Goravel v1.18 bitta fasad orqali suhbatlar, ilovalar, yaratilgan media va nutq ish oqimlari uchun birinchi darajali AI SDK ni taqdim etadi. Fasadni go run .artisan package:install AI bilan o'rnating, so'ngra goravel/openai, goravel/anthropic yoki goravel/gemini kabi provayder paketini o'rnating.

Dastlabki versiya quyidagilarni o'z ichiga oladi:

  • make:agent, make:tool, moslashtiriladigan AI generator yo'llari, Prompt, Stream, vosita chaqiruvi, prompt middleware, provayder failover bilan agent suhbatlari.
  • Baytlar, readerlar, yo'llar, saqlash, URL manzillar, yuklamalar yoki provayder tomonidan boshqariladigan fayl ID laridan hujjat va rasm ilovalari.
  • Store / StoreAs yordamchilari bilan rasm va audio yaratish, shuningdek til va diarizatsiya opsiyalari bilan transkripsiya.

goravel-lite scaffold shuningdek, AI Agent Development Skill ni ham taqdim etadi, bu AI kodlash agentlariga (Cursor, Copilot, Codex va h.k.) Goravel loyihalari bilan qanday ishlashni o'rgatadi. Skill loyiha tuzilishi, fasadlar, marshrutlash, ORM, testlash konvensiyalari va Artisan scaffolding buyruqlarini qamrab oladi. AI agent bu skillni o'qiganida, u allaqachon Goravel loyihasini qanday bootstrap qilishni, fasadlarni qo'shish uchun package:install dan foydalanishni, fasad namunasi bilan ishlashni, testify to'plamlari va mock yordamchilari bilan test yozishni hamda Artisan make:* generatorlaridan foydalanishni biladi. Loyihaga xos qoidalar bilan skillni .agents/skills/goravel-development/CUSTOM.md faylini yaratish orqali kengaytirishingiz mumkin. Skill goravel-lite bilan birga versiyalanadi va framework yangilanganda yangilanadi.

Minimal prompt quyidagicha ko'rinadi:

go
conversation, err := facades.AI().Agent(&agents.SupportAgent{})
if err != nil {
    return err
}

response, err := conversation.Prompt("How do I create a controller?")
if err != nil {
    return err
}

fmt.Println(response.Text())

Hujjatni ko'rish

Telemetriya

Goravel v1.18 treyslar, metrikalar va loglarni yig'ish va ularni Jaeger, Prometheus, Grafana yoki Datadog kabi har qanday OTLP-mos backendga eksport qilish uchun OpenTelemetry asosida qurilgan telemetriya modulini taqdim etadi. Fasadni go run . artisan package:install Telemetry bilan o'rnating.

Dastlabki versiya quyidagilarni o'z ichiga oladi:

  • Bitta config/telemetry.go faylidan sozlanadigan treyslar, metrikalar va loglar, OTLP, konsol va maxsus eksportyorlar, sampling va partiyalash boshqaruvlari bilan.
  • HTTP server, HTTP klient, gRPC, ma'lumotlar bazasi va logger uchun o'rnatilgan instrumentatsiya, xizmatlar bo'ylab treys kontekstini tarqatish bilan.
  • Ilova to'xtatilganda avtomatik tozalash va o'chirish.

Qo'lda span quyidagicha ko'rinadi:

go
ctx, span := facades.Telemetry().Tracer("app").Start(ctx, "process-order")
defer span.End()

span.SetAttributes(telemetry.String("order.id", "1234"))

// Bolalar spanlar yaratish uchun ctx ni pastga uzating
processItems(ctx)

Tracer argumenti ("app") bu spanni ishlab chiqargan kodni identifikatsiya qiluvchi instrumentatsiya doirasi nomidir; u otel.scope.name sifatida qayd etiladi. Konvensiyaga ko'ra bu paket import yo'li yoki, ilova kodi uchun, ilova nomidir.

Hujjatni ko'rish

Laravel uslubidagi to'plamlar

Goravel endi support/collect paketida fluent eager va lazy to'plam utilitlarini taqdim etadi. Kesimlardan to'plamlar yaratishingiz, filtrlash va xaritalash operatsiyalarini zanjirlashingiz, structlar uchun Laravel uslubidagi Where taqqoslashlaridan foydalanishingiz, qiymatlarni yig'ishingiz va LazyCollection bilan katta ma'lumotlar to'plamlarini qayta ishlashingiz mumkin.

go
numbers := collect.New(1, 2, 3, 4, 5, 6)

evens := numbers.Filter(func(n int, _ int) bool {
    return n%2 == 0
})

evens.All() // []int{2, 4, 6}

Hujjatni ko'rish

Mahalliy validatsiya mexanizmi va o'rnatilgan qoidalar

Goravel endi avvalgi tashqi validatsiya bog'liqligi o'rniga mahalliy validatsiya mexanizmidan foydalanadi. Yangi mexanizm nuqta notatsiyasini, wildcard validatsiyasini, tasdiqlangan ma'lumotlarni olishni, maxsus filtrlarni, aniq xabar ustuvorligini va kengroq Laravel uslubidagi o'rnatilgan qoidalar to'plamini qo'llab-quvvatlaydi.

go
validator, err := facades.Validation().Make(ctx,
    map[string]any{
        "email": " User@Goravel.dev ",
        "scores": []int{1, 2},
    },
    map[string]any{
        "email": "required|email",
        "scores.*": "required|integer",
    },
    validation.Filters(map[string]any{
        "email": "trim|lower",
    }),
)

validated := validator.Validated()
scores := validated["scores"].([]int)

Hujjatni ko'rish

Validatsiya tarjimaga asoslangan xato xabarlarini va lang:publish buyrug'ini qo'llab-quvvatlaydi

Validatsiya xato xabarlari endi frameworkning lokallashtirish tizimi tomonidan quvvatlanadi. Standart xabarlar lang/en/validation.json sifatida o'rnatilgan va validation.* tarjima kalitlaridan foydalanadi (masalan, validation.required, validation.min.string).

Validatsiya til fayllarini ilovangizga nashr qilish uchun yangi lang:publish Artisan buyrug'idan foydalaning:

shell
go run . artisan lang:publish
go run . artisan lang:publish --force

Nashr qilgandan so'ng, standart xato xabarlarini moslashtirish uchun lang/en/validation.json ni tahrirlang. Boshqa lokallar uchun qo'shimcha til kataloglarini yarating (masalan, lang/zh/validation.json). Maxsus qoida xabarlari endi :value va :optionN o'rinbosarlarini qo'llab-quvvatlaydi.

Hujjatni ko'rish

Xizmat rejimi buyruqlari

Goravel endi ilova xizmat rejimi uchun artisan down va artisan up buyruqlarini taqdim etadi. Standart bo'yicha file xizmat haydovchisi ishlatiladi, shuning uchun down buyrug'i xizmat metama'lumotlarini saqlashga yozadi va up buyrug'i uni o'chiradi.

shell
go run . artisan down
go run . artisan up

down buyrug'i --reason, --status, --redirect, --render, --secret va --with-secret kabi opsiyalar bilan javobni moslashtirishni qo'llab-quvvatlaydi.

shell
go run . artisan down --reason="Upgrading database" --status=503
go run . artisan down --redirect=/maintenance
go run . artisan down --render=errors/503
go run . artisan down --with-secret

Xizmat sozlamalari config/app.go dagi app.maintenance dan o'qiladi. Yangi Route o'rnatishlari bu konfiguratsiyani avtomatik ravishda qo'shadi. Mavjud ilovalar uni qo'lda qo'shishi mumkin:

go
"maintenance": map[string]any{
    "driver": config.Env("APP_MAINTENANCE_DRIVER", "file"),
    "store":  config.Env("APP_MAINTENANCE_STORE", ""),
},

Ko'p serverli deploylar uchun, umumiy kesh saqlashda xizmat holatini saqlash uchun APP_MAINTENANCE_DRIVER=cache ni o'rnating. Redis kabi nomlangan kesh saqlashni tanlash uchun APP_MAINTENANCE_STORE dan foydalaning:

ini
APP_MAINTENANCE_DRIVER=cache
APP_MAINTENANCE_STORE=redis

Hujjatni ko'rish

Runnerlar config opsiyasi orqali o'chirilishi mumkin

Goravel v1.18 ichki app.auto_run bayrog'ini ochiq, glob-xabardor app.disabled_runners config opsiyasi bilan almashtiradi. Bu sizga asosiy jarayonda avtomatik ishga tushuvchi runnerlarni tanlab o'tkazib yuborish imkonini beradi, boshqa xizmatlarni esa ishlayotgan holda saqlaydi — masalan, HTTP serverini o'chirmasdan scheduler-ni alohida konteynerda ishga tushirish yoki goravel:http, goravel:queue va goravel:grpc runnerlarini o'tkazib yuborib, faqat scheduler konteynerini yaratish.

Qiymat bu har bir runnerning imzosiga nisbatan Go ning path.Match orqali moslashtiriladigan glob naqshlar kesimidir:

go
// config/app.go
"app": map[string]any{
    "env":   "production",
    "debug": false,
    "disabled_runners": []string{"goravel:schedule"},
},

Framework runner imzolari goravel:http, goravel:grpc, goravel:queue, goravel:schedule va goravel:telemetry dir. Naqshlar ketma-ket baholanadi va birinchi mos kelgan g'alaba qozonadi, shuning uchun siz aniq va wildcard mosliklarini aralashtirishingiz mumkin:

go
// Web konteyneri — faqat scheduler-ni o'tkazib yuborish
"disabled_runners": []string{"goravel:schedule"},

// Faqat scheduler konteyneri — http, queue, grpc ni o'chirish
"disabled_runners": []string{"goravel:http", "goravel:queue", "goravel:grpc"},

// Barcha framework runnerlarini o'chirish
"disabled_runners": []string{"goravel:*"},

// O'chirish kaliti: asosiy jarayonda hech qanday avtomatik runner ishlamasin
"disabled_runners": []string{"*"},

Yaroqsiz naqshlar ogohlantirish sifatida qayd etiladi va runner ishlamoqda davom etadi, shuning uchun configdagi xato hech qachon yuklashni buzmaydi. Filtrlash markaziy tarzda foundation.configureRunners() da ishlaydi, shuning uchun kelajakda qo'shilgan har qanday yangi runner xuddi shu xatti-harakatni bepul oladi.

Hujjatni ko'rish

Marshrutlar uchun WithoutMiddleware

Goravel v1.18 Laravelning withoutMiddleware() metodi kabi, marshrutlar va marshrut guruhlari uchun WithoutMiddleware metodini taqdim etadi. Bu ma'lum marshrutlarga ota guruhlar tomonidan qo'llaniladigan middleware-larni chetlab o'tish imkonini beradi — webhook endpointlari, ochiq API lar yoki autentifikatsiya yoki rate limiting-ni o'tkazib yuborishi kerak bo'lgan marshrutlar uchun foydali.

Middleware guruhidagi alohida marshrutlarda middleware-ni chiqarib tashlang:

go
facades.Route().Middleware(middleware.Auth(), middleware.Throttle("global")).Group(func(router route.Router) {
  router.Get("/dashboard", dashboardController.Index)

  // Bu marshrut throttle middleware-ni chiqarib tashlaydi
  router.Get("/api/webhook", webhookController.Handle).
    WithoutMiddleware(middleware.Throttle("global"))
})

Guruh ichidagi barcha marshrutlar uchun middleware-ni chiqarib tashlang:

go
facades.Route().Middleware(middleware.Auth()).
  WithoutMiddleware(middleware.Auth()).
  Group(func(router route.Router) {
    router.Get("/public", publicController.Index)
  })

Eslatma: Middleware chiqarib tashlash middleware-larni identifikatsiya qilish uchun Signature() metodidan foydalanadi. WithoutMiddleware to'g'ri ishlashi uchun har bir middleware noyob imzo qaytarishiga ishonch hosil qiling. O'rnatilgan framework middleware-lari allaqachon noyob imzolarni taqdim etadi.

Hujjatni ko'rish

Build buyrug'i go generate-ni qo'llab-quvvatlaydi

build buyrug'i endi --generate bayrog'i va -g taxallusini qo'llab-quvvatlaydi. Yoqilganda, Goravel binarni kompilyatsiya qilishdan oldin go generate ./... ni ishga tushiradi, bu esa standart xatti-harakatni o'zgartirmasdan generatsiya qilingan kodni build ish oqimiga qo'shishni osonlashtiradi.

shell
go run . artisan build --generate
go run . artisan build -g

Hujjatni ko'rish

Artisan konsoli jadval chiqishini qo'llab-quvvatlaydi

Goravel endi tuzilgan buyruq chiqishini renderlash uchun ctx.Table metodini taqdim etadi. U jadval sarlavhalarini, jadval qatorlarini va chegara, uslub, ustun, kenglik va balandlik moslashtirish uchun ixtiyoriy console.TableOption ni qabul qiladi.

go
func (receiver *ReportCommand) Handle(ctx console.Context) error {
    headers := []string{"ID", "Name", "Status"}
    rows := [][]string{
        {"1", "Goravel", "Active"},
        {"2", "Framework", "Ready"},
    }

    ctx.Table(headers, rows)

    return nil
}

Hujjatni ko'rish

Artisan konsoli Shutdownable orqali muammosiz o'chirishni qo'llab-quvvatlaydi

Konsol buyruqlari endi ixtiyoriy console.Shutdownable interfeysini amalga oshirish orqali muammosiz o'chirishga opt-in qilishlari mumkin. Framework har bir buyruq orqali signal.NotifyContext ni ulaydi, shuning uchun Ctrl+C tugmasini bosish (yoki SIGTERM yuborish) Handle ga uzatilgan kontekstni bekor qiladi. Agar buyruq Shutdown(ctx Context) error ni ham amalga oshirsa, framework jarayon chiqishdan oldin uni yangi kontekst va tozalash uchun 30s byudjet bilan chaqiradi. Handle gorutinada ishlaydi, shuning uchun signal javobi darhol bo'ladi.

console.Context endi context.Context ni o'z ichiga oladi, shuning uchun buyruqlar to'g'ridan-to'g'ri <-ctx.Done() dan foydalanishi, ctx ni context.Context kutadigan funksiyalarga uzatishi va ctx.Deadline() / ctx.Err() / ctx.Value(key) ni accessorsiz chaqirishi mumkin. schedule:run buyrug'i kanonik namunadir — u tozalashni schedule.Shutdown(ctx) ga yo'naltirish uchun Shutdown ni amalga oshiradi.

go
package commands

import (
  "errors"
  "net/http"

  "github.com/goravel/framework/contracts/console"
  "github.com/goravel/framework/contracts/console/command"
)

type Serve struct {
  server *http.Server
}

func (r *Serve) Signature() string   { return "serve" }
func (r *Serve) Description() string { return "Start the HTTP server" }
func (r *Serve) Extend() command.Extend {
  return command.Extend{Category: "server"}
}

func (r *Serve) Handle(ctx console.Context) error {
  if err := r.server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
    return err
  }
  return nil
}

func (r *Serve) Shutdown(ctx console.Context) error {
  ctx.Info("received signal, shutting down gracefully...")
  return r.server.Shutdown(ctx)
}

Shutdownable ni amalga oshirmaydigan buyruqlar asl xatti-harakatni saqlab qoladi — signal qabul qilinishi bilan jarayon chiqib ketadi.

Hujjatni ko'rish

Artisan konsoli buyruqlarni filtrlashni qo'llab-quvvatlaydi

ApplicationBuilder endi qaysi o'rnatilgan Artisan buyruqlari ro'yxatdan o'tkazilishini cheklash uchun WithCommandsFilter metodini taqdim etadi — bu make:*, package:* yoki vendor:publish ga muhtoj bo'lmagan ishlab chiqarish binarilari uchun foydali. Qayta chaqiruv aniq moslik va glob (*) mosligini qo'llab-quvvatlagan holda saqlanishi kerak bo'lgan buyruq imzolarining ijobiy ro'yxatini qaytaradi:

go
func Boot() contractsfoundation.Application {
	return foundation.Setup().
		WithCommands(Commands).
		WithCommandsFilter(func() []string {
			if facades.Config().GetString("app.env") == "production" {
				return []string{
					"up", "down", "key:generate", "about",
					"schedule:*",
					"queue:*",
				}
			}
			return nil // boshqa muhitlarda hammasini saqlash
		}).
		WithConfig(config.Boot).
		Create()
}

Hujjatni ko'rish

gRPC TLS va mTLS kredensiallarini qo'llab-quvvatlaydi

Goravel endi ilova yuklanishi paytida gRPC server va klient transport kredensiallarini ro'yxatdan o'tkazishni qo'llab-quvvatlaydi. Server uchun TLS yoki mTLS ni yoqish uchun WithGrpcServerCredentials dan foydalaning va grpc.clients.<name>.credentials orqali murojaat qilinadigan klient kredensial guruhlarini ro'yxatdan o'tkazish uchun WithGrpcClientCredentials dan foydalaning.

go
return foundation.Setup().
    WithGrpcClientCredentials(func() map[string]credentials.TransportCredentials {
        userCreds, err := credentials.NewClientTLSFromFile("storage/certs/ca.crt", "user.example.com")
        if err != nil {
            panic(err)
        }

        return map[string]credentials.TransportCredentials{
            "user": userCreds,
        }
    }).
    Create()

Hujjatni ko'rish

Orm so'rovi kontekstni ochadi

Orm so'rovlari endi Context() accessorini taqdim etadi. contractsorm.Query ni qabul qiladigan kod, masalan, model global doiralari, facades.Orm().WithContext(ctx) tomonidan uzatilgan kontekstni o'qiy oladi.

go
"tenant": func(query contractsorm.Query) contractsorm.Query {
    tenantID, _ := query.Context().Value("tenant_id").(uint)

    return query.Where("tenant_id", tenantID)
}

Hujjatni ko'rish

LoadViewsFrom orqali paket ko'rinishlari

Kengaytma paketlari endi facades.View().LoadViewsFrom(path) yordamida o'zlarining view kataloglarini ro'yxatdan o'tkazishlari mumkin. Ilovaning resources/views katalogi ustuvorlikka ega va ro'yxatdan o'tgan paket viewlari standart sifatida xizmat qiladi. Exist metodi ham ro'yxatdan o'tgan paket view yo'llarini tekshiradi.

go
// Kengaytma paketining service_provider.go da
func (r *ServiceProvider) Boot(app foundation.Application) {
    facades.View().LoadViewsFrom("/path/to/package/views")
}

Hujjatni ko'rish

Eslatma: Agar siz bu xususiyatni fiber haydovchisida ishlatmoqchi bo'lsangiz, iltimos Fiber haydovchi shablon konfiguratsiyasi DefaultTemplate bilan almashtirildi bo'limiga qarang.

Paket sozlash import taxalluslarini qo'llab-quvvatlaydi

Paket sozlash modifikatsiya yordamchilari endi "<alias> <import-path>" formatidagi import taxalluslarini qo'llab-quvvatlaydi. Bu paket import yo'llari uzun bo'lganda yoki paketga maxsus nom bilan murojaat qilish kerak bo'lganda generatsiya qilingan bootstrap fayllarini o'qilishi mumkin holda saqlaydi.

go
serviceProvider := "&admin.ServiceProvider{}"
moduleImport := "admin " + setup.Paths().Module().Import()

setup.Install(
    modify.RegisterProvider(moduleImport, serviceProvider),
).Uninstall(
    modify.UnregisterProvider(moduleImport, serviceProvider),
).Execute()

Hujjatni ko'rish

Maxsus navbat haydovchilari endi bloklovchi partiyali xabar iste'molini qo'llab-quvvatlash uchun ixtiyoriy ravishda DriverWithReceive interfeysini (goravel/framework#1435) amalga oshirishi mumkin. Haydovchi bu interfeysni amalga oshirganda, navbat ishchisi avtomatik ravishda Pop o'rniga Receive dan foydalanadi, bu Kafka yoki RabbitMQ kabi yuqori o'tkazuvchanlikdagi haydovchilar uchun so'rov yukini kamaytiradi.

go
import (
  "context"
  "github.com/goravel/framework/contracts/queue"
)

type KafkaDriver struct{}

// Asosiy Driver interfeys metodlari (majburiy)
func (d *KafkaDriver) Driver() string                        { return "kafka" }
func (d *KafkaDriver) Push(task queue.Task, queue string) error { return nil }
func (d *KafkaDriver) Pop(queue string) (queue.ReservedJob, error) { return nil, nil }

// Partiyali iste'mol uchun ixtiyoriy DriverWithReceive
func (d *KafkaDriver) Receive(ctx context.Context, queue string, count int) ([]queue.ReservedJob, error) {
  // `count` tagacha vazifalarni bloklovchi partiyali qabul qilish, ctx muddati tugaganda qaytaradi
}

Receive mavjud bo'lganda, ishchi har bir chaqiruv uchun 5 soniyalik timeout va xatolar yoki bo'sh partiyalarda eksponensial backoff (100ms–3.2s) bilan bloklovchi partiya sikli ishlaydi. context.Context ishchi o'chirilganda bekor qilinadi, bu toza tugatishni ta'minlaydi. Mavjud haydovchilar uchun hech qanday ilova kodi o'zgarishi talab qilinmaydi.

Hujjatni ko'rish

Log WithContext framework kontekst kalitlarini filtrlaydi

Avval facades.Log().WithContext(ctx) GoravelAuthJwt va goravel_http_client_name kabi framework-ichki kontekst kalitlarini log chiqishiga yozishi mumkin edi. Goravel endi bu kalitlarni standart bo'yicha chiqarib tashlaydi va loyihaga xos kontekst kalitlari uchun logging.context.exclude qo'shishingiz mumkin.

Hujjatni ko'rish

O'rnatuvchi agent skill boshqaruv buyruqlarini qo'llab-quvvatlaydi

goravel CLI endi Goravel agent skillarini kashf qilish va o'rnatish uchun goravel skill:list va goravel skill:install ni qo'llab-quvvatlaydi. Bu buyruqlar testlash, nomlash va pull request ish oqimlari kabi Goravel ishlab chiqish konvensiyalariga rioya qilishga yordam berish uchun AI kodlash yordamchisi skillarini o'rnatmoqchi bo'lgan hissa qo'shuvchilar uchun mo'ljallangan.

Skillar goravel/agents repozitoriyasidan olinadi va standart bo'yicha ~/.agents/skills ga o'rnatiladi. Siz nom bo'yicha filtrashingiz, --path bilan maxsus manzilni tanlashingiz va --force bilan mavjud skillarni qayta yozishingiz mumkin.

Hujjatni ko'rish

Fiber haydovchi konteksti Fiber instansiyasi hayot siklidan ajratilgan

Fiber haydovchisi bilan so'rov vaqti tugaganda, context.Context interfeys metodlari (Done(), Deadline(), Err()) asosiy fiber.Ctx ga delegatsiya qilgan, bu esa fasthttp tomonidan so'rov qayta ishlatilgandan keyin yaroqsiz bo'lib qolgan. Bu fon gorutinalari (masalan, database/sql) hali ham so'rov kontekstiga havola ushlab turganda nil-pointer panic-larga sabab bo'lgan (goravel/goravel#951).

Tuzatish (goravel/fiber#253) foydalanuvchi konteksti va qiymatlarini fiber.Ctx ga delegatsiya qilish o'rniga goravel Context structida struct maydonlari sifatida saqlaydi, shuning uchun timeout signallari to'g'ri tarqaladi va fon gorutinalari so'rov qaytgandan keyin kontekstga xavfsiz murojaat qilishi mumkin.

Hech qanday ilova kodi o'zgarishi talab qilinmaydi.

Fiber haydovchi shablon konfiguratsiyasi DefaultTemplate bilan almashtirildi

LoadViewsFrom orqali paket viewlarini qo'llab-quvvatlash uchun Fiber haydovchisi (goravel/fiber#273) gofiber/template/html/v3 ga bo'lgan bog'liqligini o'rnatilgan DefaultTemplate() bilan almashtirdi, u resources/views dan va har qanday ro'yxatdan o'tgan paket viewlaridan viewlarni avtomatik ravishda yuklaydi. Agar sizning config/http.go da html.New(path.Resource("views"), ".tmpl") dan foydalanadigan maxsus template konfiguratsiyasi bo'lsa va LoadViewsFrom orqali paket viewlari xususiyatidan foydalanmoqchi bo'lsangiz, uni quyidagicha yangilang:

diff
 // config/http.go — fiber haydovchisi

 import goravelfiber "github.com/goravel/fiber"

  "template": func() (fiber.Views, error) {
-    return html.New(path.Resource("views"), ".tmpl"), nil
+    return goravelfiber.DefaultTemplate(), nil
 },

Maxsus ajratuvchilar yoki FuncMap uchun goravelfiber.NewTemplate(goravelfiber.RenderOptions{...}) dan foydalaning:

go
import goravelfiber "github.com/goravel/fiber"

"template": func() (fiber.Views, error) {
    return goravelfiber.NewTemplate(goravelfiber.RenderOptions{
        Delims: &goravelfiber.Delims{Left: "{[", Right: "]}"},
    })
},

Agar hech qanday template konfiguratsiyasi aniqlanmagan bo'lsa, DefaultTemplate() avtomatik ravishda ishlatiladi — hech qanday kod o'zgarishi talab qilinmaydi.

Kesh prefiksi bo'sh satrni qo'llab-quvvatlaydi

Redis kesh haydovchisi endi bo'sh prefix konfiguratsiyasini hurmat qiladi. Avval, bo'sh prefiks bilan ham, ikki nuqta (:) ajratuvchisi doimo har bir kalitdan oldin qo'shilgan, bu Redis-ga to'g'ridan-to'g'ri kirishda kalitlarni nomuvofiq qilgan. Endi, agar config/cache.go da prefix opsiyasi bo'sh satrga o'rnatilgan bo'lsa, hech qanday prefiks yoki ajratuvchi qo'llanilmaydi:

go
// config/cache.go
"prefix": "",

Bu konfiguratsiya bilan, users kabi kesh kaliti Redis-da :users o'rniga users sifatida saqlanadi.

Bo'sh bo'lmagan prefiksga ega mavjud loyihalar uchun hech qanday ilova kodi o'zgarishi talab qilinmaydi.

Hujjatni ko'rish

HTTP Middleware func dan interfeysga o'zgartirildi

contracts/http.Middleware funksiya turidan func(Context) interfeysga o'zgartirildi:

go
type Middleware interface {
    Handle(Context)
    Signature() string
}

Bu o'zgarish har bir middleware-ga Signature() metodi orqali barqaror identifikator taqdim etadi, bu WithoutMiddleware ga middleware-larni imzo bo'yicha ishonchli ravishda chiqarib tashlash imkonini beradi. Barcha o'rnatilgan framework middleware-lari (Cors, Timeout, Throttle, VerifyCsrfToken va h.k.) bu interfeysni amalga oshiradigan structlarni qaytarish uchun yangilangan.

Maxsus middleware yangi interfeysni amalga oshirish uchun yangilanishi kerak. O'tkazish bosqichlari uchun yangilash qo'llanmasiga qarang.

Hujjatni ko'rish

Validatsiya mexanizmi mahalliy tarzda qayta yozildi

Validatsiya mexanizmi goravel/framework#1397 da qayta yozildi — tashqi gookit/validate bog'liqlik Laravelning validatsiya API si bilan to'liq mos keladigan mahalliy ilova bilan almashtirildi. Bu o'zgarish bir nechta quyi oqim ta'sirlarini keltirib chiqaradi:

  1. Xato xabari formati eski uslubdagi xabarlardan (masalan, "name is required to not be empty") Laravel uslubidagi xabarlarga (masalan, "The name field is required.") o'zgardi. Maxsus validatsiya xato xabarlarini tekshiradigan testlar yangilanishi kerak.

  2. Wildcard qoidalari (*.) endi xatolarni izchil ravishda xabar qiladi. Eski mexanizm kiritishga qarab wildcard-maydon xatolarini o'tkazib yuborishi mumkin edi; yangi mexanizm ularni doimo baholaydi va xabar qiladi.

  3. Forma so'rovi metod imzolari o'zgardiRules(), Messages(), Attributes() va Filters() endi map[string]string o'rniga map[string]any qaytaradi.

  4. Maxsus validatsiya qoida nomlari yangi o'rnatilgan qoidalar bilan ziddiyatga tushishi mumkin. O'rnatilgan qoidalar bilan bir xil nomga ega bo'lgan maxsus qoidalarni qayta nomlang (masalan, existsexists_custom).

Xato xabarlari endi lokallashtirish tizimi tomonidan quvvatlanadi. Standart xabarlar lang/en/validation.json sifatida o'rnatilgan va validation.* tarjima kalitlaridan foydalanadi. Ularni nashr qilish va moslashtirish uchun go run . artisan lang:publish dan foydalaning.

Hujjatni ko'rish

Pochta kontenti andoza va matnni ajratadi

Goravel endi mail.Content.Text ni xom matnli email kontenti sifatida ko'radi. Shablon yo'llari aniq: HTML shablonlar uchun HtmlView va matnli shablonlar uchun TextView dan foydalaning.

Xabar tanasi allaqachon mavjud bo'lganda Html va Text dan foydalaning:

go
func (m *WelcomeMail) Content() *mail.Content {
    return &mail.Content{
        Html: "<h1>Hello Goravel</h1>",
        Text: "Hello Goravel",
    }
}

Xabar tanasi shablonlardan renderlanishi kerak bo'lganda HtmlView va TextView dan foydalaning:

go
func (m *WelcomeMail) Content() *mail.Content {
    return &mail.Content{
        HtmlView: "welcome.html",
        TextView: "welcome.txt",
        With: map[string]any{
            "Name": "Goravel",
        },
    }
}

Hujjatni ko'rish

gRPC config kaliti servers dan clients ga o'zgartirildi

config/grpc.go da gRPC konfiguratsiya kaliti servers clients ga o'zgartirildi, bu yozuvlar serverlar emas, balki gRPC klientlarini (masofaviy xizmatlar iste'molchilari) ro'yxatdan o'tkazishini to'g'ri aks ettiradi.

config/grpc.go da yuqori darajadagi kalitni o'zgartiring:

diff
 config.Add("grpc", map[string]any{
     "host": config.Env("GRPC_HOST", ""),
-    "servers": map[string]any{
+    "clients": map[string]any{
         "user": map[string]any{
             "host": config.Env("GRPC_USER_HOST", ""),
             ...
         },
     },
 })

Ilova kodida config yo'l havolalarini grpc.servers dan grpc.clients ga yangilang:

diff
-facades.Config().Get("grpc.servers.user.host")
+facades.Config().Get("grpc.clients.user.host")

Hujjatni ko'rish

HTTP haydovchi timeout middleware parallel xavfsizlik uchun qayta yozildi

Gin haydovchisi (goravel/gin#222) va Fiber haydovchisi (goravel/fiber#263) dagi timeout middleware konkurentlik xatosini (goravel#966) tuzatish uchun qayta yozildi. Avvalgi implementatsiya handler zanjirini fon gorutinasida ishga tushirgan va handler qayta ishlatishga allaqachon ruxsat berilgan so'rov-doirasidagi holatda ishlashni davom ettirgan holda timeout javobini qaytarishi mumkin edi, bu yuqori konkurentlik ostida so'rovlararo javob ifloslanishiga olib kelgan.

Ikkala haydovchi endi o'z frameworkining mahalliy timeout middleware-iga (Gin uchun gin-contrib/timeout, Fiber uchun Fiber-ning o'rnatilgan timeouti) delegatsiya qiladi, bu ularni qayta ishlatish o'rniga vaqti tugagan so'rov kontekstlarini to'g'ri tashlab yuboradi. Timeout(...) middleware imzosi o'zgarmagan va ctx.Done() hali ham so'rov muddatlarini aks ettiradi — hech qanday ilova kodi o'zgarishi talab qilinmaydi.

Hujjatni ko'rish

MIT litsenziyasi ostida chiqarilgan