Kontentga o‘tish

v1.15 dan v1.16 ga yangilash

Qiziqarli Yangi Imkoniyatlar 🎉

Yaxshilanishlar 🚀

O'zgartirishlar (Breaking Changes) 🛠

v1.16.1

v1.16.3

v1.16.4

v1.16.5

v1.16.6

v1.16.7

v1.16.8

Yangilash Qo'llanmasi

Golang v1.22 endi qo'llab-quvvatlanmayganligi sababli, Goravelning qo'llab-quvvatlaydigan Golang versiyasi 1.22 dan 1.23 ga yangilandi.

goravel/example loyihasini v1.15 dan v1.16 ga o'tkazish PR yangilash uchun namuna sifatida foydalanish mumkin: goravel/example#68.

1. Bog'liqliklarni Yangilash

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

// Agar gin ishlatilsa
go get github.com/goravel/gin@latest

// Agar fiber ishlatilsa
go get github.com/goravel/fiber@latest

// Agar redis ishlatilsa
go get github.com/goravel/redis@latest

// Agar S3 ishlatilsa
go get github.com/goravel/s3@latest

// Agar Oss ishlatilsa
go get github.com/goravel/oss@latest

// Agar Cos ishlatilsa
go get github.com/goravel/cos@latest

// Agar Minio ishlatilsa
go get github.com/goravel/minio@latest

go mod tidy

2. Ma'lumotlar Bazasi Konfiguratsiyasini O'zgartirish

Ma'lumotlar bazasi konfiguratsiya fayli config/database.go dagi kerak bo'lmagan connections larni o'chiring va sizga kerak bo'lgan ma'lumotlar bazasi haydovchisini o'rnating.

Masalan, Postgres:

  1. Haydovchi paketini o'rnating
shell
go get github.com/goravel/postgres
  1. config/app.go fayliga postgres.ServiceProvider ni qo'shing
go
// config/app.go
import "github.com/goravel/postgres"

"providers": []foundation.ServiceProvider{
  ...
  &postgres.ServiceProvider{},
},
  1. config/database.go faylidagi konfiguratsiyani o'zgartiring
diff
// config/database.go
import (
	"github.com/goravel/framework/contracts/database/driver"
	postgresfacades "github.com/goravel/postgres/facades"
)

"connections": map[string]any{
  "postgres": map[string]any{
    ...
++    "via": func() (driver.Driver, error) {
++      return postgresfacades.Postgres("postgres")
++    },
  },
},

3. auth.go konfiguratsiya faylini o'zgartirish

diff
// config/auth.go

// Qo'llab-quvvatlanadi: "jwt"
"guards": map[string]any{
  "user": map[string]any{
    "driver":   "jwt",
++    "provider": "user",
  },
},

++ // Qo'llab-quvvatlanadi: "orm"
++ "providers": map[string]any{
++   "user": map[string]any{
++     "driver": "orm",
++   },
++ },

4. session.go konfiguratsiya faylini o'zgartirish

diff
// config/session.go

-- "driver": config.Env("SESSION_DRIVER", "file"),
++ "default": config.Env("SESSION_DRIVER", "file"),
++ "drivers": map[string]any{
++   "file": map[string]any{
++     "driver": "file",
++   },
++ },

5. queue.go konfiguratsiya faylini o'zgartirish

  • Agar Queue modulining Redis haydovchisidan foydalanayotgan bo'lsangiz, shunga mos ravishda o'zgartirishingiz kerak: Queue moduli konfiguratsiyasini optimallashtirish.

  • Agar foydalanmayotgan bo'lsangiz yoki kelajakda ma'lumotlar bazasi haydovchisidan foydalanishni istasangiz, config/queue.go faylidagi konfiguratsiyani o'zgartirishingiz kerak:

diff
// config/queue.go

-- // Haydovchilar: "sync", "redis"
++ // Haydovchilar: "sync", "database", "custom"
"connections": map[string]any{
  "sync": map[string]any{
    "driver": "sync",
  },
--  "redis": map[string]any{
--    "driver":     "redis",
--    "connection": "default",
--    "queue":      config.Env("REDIS_QUEUE", "default"),
--  },
++  "database": map[string]any{
++    "driver":     "database",
++    "connection": "postgres",
++    "queue":      "default",
++    "concurrent": 1,
++  },
},

++ "failed": map[string]any{
++  "database": config.Env("DB_CONNECTION", "postgres"),
++  "table":    "failed_jobs",
++ },

Ma'lumotlar bazasi haydovchisi uchun talab qilinadigan migratsiya faylini qo'shing: database/migrations/20210101000002_create_jobs_table.go, va migratsiya faylini database/kernel.go faylida ro'yxatdan o'tkazing.

6. Agar HTTP Client dan foydalanish kerak bo'lsa

config/http.go faylida HTTP Client konfiguratsiya bandini qo'shing:

diff
// config/http.go
++ "client": map[string]any{
++   "base_url":                config.GetString("HTTP_CLIENT_BASE_URL"),
++   "timeout":                 config.GetDuration("HTTP_CLIENT_TIMEOUT"),
++   "max_idle_conns":          config.GetInt("HTTP_CLIENT_MAX_IDLE_CONNS"),
++   "max_idle_conns_per_host": config.GetInt("HTTP_CLIENT_MAX_IDLE_CONNS_PER_HOST"),
++   "max_conns_per_host":      config.GetInt("HTTP_CLIENT_MAX_CONN_PER_HOST"),
++   "idle_conn_timeout":       config.GetDuration("HTTP_CLIENT_IDLE_CONN_TIMEOUT"),
++ },

7. Agar goravel/redis drayveridan foydalanilsa

config/cache.go faylidagi konfiguratsiyani o'zgartirish kerak:

diff
// config/cache.go
"redis": map[string]any{
  "driver":     "custom",
  "connection": "default",
  "via": func() (cache.Driver, error) {
--  return redisfacades.Redis("redis"), nil
++  return redisfacades.Cache("redis")
  },
},

8. Agar carbon.DateTime va boshqa usullardan foydalanilsa

Shunga mos ravishda o'zgartirish kerak: Carbon usullarini optimallashtirish

9. Agar sessiyaning maxsus drayveridan foydalanilsa

Shunga mos ravishda o'zgartirish kerak: Sessiya maxsus drayverini optimallashtirish

10. Agar facades.Config() usullaridan foydalanilsa

Shunga mos ravishda o'zgartirish kerak: Config moduli usullarining standart qiymat turini o'zgartirish

11. Agar SQL Migratsiyalari ishlatilsa

Shunga mos ravishda o'zgartirish kerak: SQL Migratsiyasini olib tashlash

12. Agar Orm ishlatilsa

Shunga mos ravishda o'zgartirish kerak: Orm usullarini optimallashtirish

13. Agar Path usuli ishlatilsa

path usuli mutlaq yo'lni qaytaradi, agar siz undan foydalanayotgan bo'lsangiz, o'zgartirish kerakligini tekshirishingiz kerak: Path usulini optimallashtirish

14. Agar ctx.Request().InputMap usuli ishlatilsa

Shunga mos ravishda o'zgartirish kerak: Request usulini optimallashtirish

15. Agar console.Confirm usuli ishlatilsa

Shunga mos ravishda o'zgartirish kerak: console Confirm usulini optimallashtirish

16. Agar Testing.Request usuli ishlatilsa

Shunga mos ravishda o'zgartirish kerak: Testing.Request usulini optimallashtirish

Xususiyatlar tanitimi

facades.DB() qo'shildi

facades.DB() moduli qo'shildi, bu mahalliy ma'lumotlar bazasi operatsiyalarini bajarish uchun qulay, ORM dan tezroq.

Hujjatni ko'rish

facades.Http() qo'shildi

facades.Http() moduli qo'shildi, bu HTTP operatsiyalarini bajarish uchun qulay.

Hujjatni ko'rish

facades.Queue() qayta qurildi

  • v1.15 dan oldin Queue faqat sinxron va Redis drayverlarini qo'llab-quvvatlagan, v1.16 dan boshlab u ma'lumotlar bazasi va maxsus drayverni qo'llab-quvvatlaydi.

  • jobs va failed_jobs jadvali qo'shildi, vazifalar va muvaffaqiyatsiz vazifalarni saqlash uchun ishlatiladi.

  • queue:retry buyrug'i qo'shildi, muvaffaqiyatsiz vazifalarni qayta urinish uchun ishlatiladi.

  • queue:failed buyrug'i qo'shildi, muvaffaqiyatsiz vazifalarni ko'rish uchun ishlatiladi.

  • Navbat vazifasini ishga tushirishda qayta urinishlar sonini sozlash qo'llab-quvvatlanadi.

Hujjatni ko'rish

facades.Auth() maxsus drayverni qo'llab-quvvatlaydi

v1.15 dan oldin Auth faqat JWT drayverini qo'llab-quvvatlagan, v1.16 dan boshlab u Sessiya va maxsus drayverni qo'llab-quvvatlaydi, iltimos hujjatni ko'ring.

make:* buyruqlari avtomatik ro'yxatdan o'tishni qo'llab-quvvatlaydi

make:migration va make:seeder va hokazo buyruqlar tomonidan yaratilgan fayllar yaratilgandan so'ng avtomatik ravishda freymvorkga ro'yxatdan o'tkaziladi, endi avvalgidek qo'lda ro'yxatdan o'tkazish shart emas.

Goravel Installer drayver tanlashni qo'llab-quvvatlaydi

Goravel Installer yordamida yangi loyiha o'rnatayotganda, turli drayverlarni tanlashingiz mumkin, masalan: goravel/gin yoki goravel/fiber va hokazolarni o'rnatishni tanlashingiz mumkin.

Ma'lumotlar bazasi drayveri ajratildi

Ilgari bir nechta ma'lumotlar bazasi drayverlari freymvorkda birlashtirilgan edi, bu dastur to'plami hajmini oshirdi. v1.16 dan boshlab, ma'lumotlar bazasi drayveri alohida paket bo'ladi, shuning uchun sizga faqat kerakli ma'lumotlar bazasi drayverini o'rnatish kerak.

Ma'lumotlar bazasi turiDrayver paketi
Postgresgithub.com/goravel/postgres
MySQLgithub.com/goravel/mysql
Sqlservergithub.com/goravel/sqlserver
SQLitegithub.com/goravel/sqlite

Orm ga xususiyatlar qo'shildi

  • JSON maydonlarini so'rov qilish qo'llab-quvvatlanadi, hujjatni ko'ring.

  • JSON maydonlarini yangilash qo'llab-quvvatlanadi, hujjatni ko'ring.

  • Model GlobalScope usulini sozlashni qo'llab-quvvatlaydi, bu so'rov, yangilash va o'chirish operatsiyalarining doirasini cheklaydi:

go
import "github.com/goravel/framework/contracts/orm"

type User struct {
  orm.Model
  Name string
}

func (r *User) GlobalScopes() []func(orm.Query) orm.Query {
  return []func(orm.Query) orm.Query{
    func(query orm.Query) orm.Query {
      return query.Where("name", "goravel")
    },
  }
}

Ma'lumotlar jadvali asosida Model yaratish qo'llab-quvvatlanadi

make:model buyrug'iga --table opsiyasi qo'shildi, ma'lumotlar jadvali asosida Model yaratish uchun ishlatiladi:

shell
./artisan make:model --table=users User

// Agar Model allaqachon mavjud bo'lsa, -f opsiyasidan foydalanib majburan ustidan yozishingiz mumkin
./artisan make:model --table=users -f User

Ish vaqtida dinamik SQL bayonotini qo'llab-quvvatlash

EnableQueryLog usuli qo'shildi, so'rov jurnalini yoqish uchun ishlatiladi:

go
ctx := db.EnableQueryLog(ctx)

facades.Orm().WithContext(ctx).Query()
facades.DB().WithContext(ctx).Table()

queryLogs := db.GetQueryLog(ctx)
ctx := db.DisableQueryLog(ctx)

Migratsiyaga xususiyatlar qo'shildi

  • Jadval tuzilishini o'zgartirish uchun Change usuli qo'shildi (Postgres, MySQL, Sqlserver uchun qo'llaniladi):
go
table.String("name").Change()
  • Jadval ustunini nomini o'zgartirish uchun RenameColumn usuli qo'shildi:
go
table.RenameColumn("old_name", "new_name")
  • Jadvalga izoh qo'shish uchun Comment usuli qo'shildi (Postgres, MySQL uchun qo'llaniladi):
go
table.Comment("user table")
  • Maydonni jadvalning birinchi maydoni sifatida belgilash uchun First usuli qo'shildi (MySQL uchun qo'llaniladi):
go
table.String("name").First()
  • After usulini qo'shing, maydonni jadvalning oxirgi maydoni sifatida o'rnatish uchun (MySQL uchun qo'llaniladi):
go
table.String("name").After("id")
  • Morphs, NullableMorphs, NumericMorphs, UuidMorphs, UlidMorphs usullarini qo'shing, polimorfik bog'lanish maydonlarini yaratish uchun ishlatiladi:
go
table.Morphs("morphable")
// morphable_type, morphable_id
  • Uuid, Ulid usullarini qo'shing, UUID va ULID maydonlarini yaratish uchun ishlatiladi:
go
table.Uuid("uuid")
table.Ulid("ulid")
  • GeneratedAs va Always usullarini qo'shing, generatsiyalangan ustunlarni yaratish uchun ishlatiladi (faqat PostgreSQL):
go
table.String("name").GeneratedAs().Always()

Grpc Shutdown usulini qo'shadi

Grpc-ni yumshatib o'chirish uchun Shutdown usulini qo'shing, Hujjatni ko'ring.

Artisan ranglarni chop etishni o'chirish opsiyasini qo'shadi

Ba'zi buyruqlar standart ravishda ranglarni chiqaradi, masalan, list buyrug'i. Biroq, ba'zi terminal yoki jurnallarda rang qiymatlari noto'g'ri ko'rsatilishi mumkin. Siz chop ranglarini o'chirish uchun --no-ansi opsiyasidan foydalanishingiz mumkin:

shell
go run . artisan list --no-ansi

Env faylini shifrlash va shifrdan ochish

Ishlab chiqarish muhiti env faylini versiya nazoratiga qo'shmoqchi bo'lishingiz mumkin, lekin sezuvchi ma'lumotlarni ochib bermaslik uchun, siz env faylini shifrlashingiz va shifrdan ochishingiz mumkin:

Hujjatni ko'ring

Elektron pochta yuborish Header-ni o'rnatishni qo'llab-quvvatlaydi

Elektron pochta Header-ni o'rnatish uchun ishlatiladigan Headers usulini qo'shing.

go
facades.Mail().Headers(map[string]string{"X-Mailer": "Goravel"})

O'rnatuvchi o'zini yangilashni qo'llab-quvvatlaydi

goravel/installer upgrade buyrug'ini qo'shadi, bu o'rnatuvchini o'zini yangilash uchun ishlatiladi:

shell
goravel upgrade
goravel upgrade v1.1.1

Lokalizatsiya embed yuklashni qo'llab-quvvatlaydi

Embed yuklashdan foydalanilganda, til fayllari ikkilik faylga kompilyatsiya qilinadi va endi ularni joylashtirish shart emas.

Hujjatni ko'ring

Jadval xususiyatlarni qo'shadi

  • EverySecond usulini va boshqalarni qo'shing, iltimos hujjatni ko'ring.

  • Vazifalarni qo'lda ishga tushirish uchun ishlatiladigan schedule:run buyrug'ini qo'shing.

  • Barcha vazifalarni ko'rish uchun ishlatiladigan schedule:list usulini qo'shing.

So'rov xususiyatlarni qo'shadi

  • v1.15 dan oldin, quyidagi Request bog'lash xatolikni bildiradi, v1.16 dan boshlab, u bir nechta fayllarni bog'lashni qo'llab-quvvatlaydi:
go
type StoreMediaRequest struct {
	Files []*multipart.FileHeader `form:"files" json:"files"`
}
  • Asl marshrut yo'lini olish uchun ishlatiladigan OriginPath usulini qo'shing:
go
ctx.Request().OriginPath()
  • Marshrut ma'lumotlarini olish uchun ishlatiladigan Info usulini qo'shing:
go
info := ctx.Request().Info()
  • Marshrut nomini olish uchun ishlatiladigan Name usulini qo'shing:
go
name := ctx.Request().Name()
  • http.request_timeout konfiguratsiya elementi 0 ga o'rnatilganda, so'rov vaqt chegarasiz bo'ladi.

Marshrut xususiyatlarni qo'shadi

  • Barcha marshrutlarni olish uchun ishlatiladigan GetRoutes usulini qo'shing:
go
routes := facades.Route().GetRoutes()
  • Marshrut nomini o'rnatish uchun ishlatiladigan Name usulini qo'shing:
go
facades.Route().Get("users", usersController.Index).Name("users.index")

Keyin siz marshrut ma'lumotlarini olish uchun Info usulidan foydalanishingiz mumkin:

go
route := facades.Route().Info("users.index")
  • Barcha marshrutlarni ko'rish uchun ishlatiladigan route:list buyrug'ini qo'shing:
shell
./artisan route:list

Testing Cache tasvirini yaratishni qo'llab-quvvatlaydi

Cache tasvirini yaratish uchun ishlatiladigan Cache usulini qo'shing:

go
cache, err := facades.Testing().Docker().Cache()

Har xil JWT Guard har xil konfiguratsiyalarni qo'llab-quvvatlaydi

v1.15 dan oldin, JWT Guard ning ttl va secret konfiguratsiya elementlari global konfiguratsiyalar edi, v1.16 dan boshlab, siz har xil JWT Guardlar uchun har xil ttl va secret o'rnatishingiz mumkin, Hujjatni ko'ring.

ServiceProvider endi tartibga bog'liq emas

ServiceProvider joriy ServicerProvider ning bog'liqlik munosabatini e'lon qilish uchun ishlatiladigan ixtiyoriy usul Relationship() binding.Relationship ni qo'shadi, ushbu usulni o'rnatgan ServiceProvider ro'yxatga olish tartibiga bog'liq bo'lmaydi, va uni o'rnatmagan ServiceProvider oxirgi ro'yxatga olinadi, masalan:

go
type ServiceProvider struct {
}

func (r *ServiceProvider) Relationship() binding.Relationship {
	return binding.Relationship{
		Bindings: []string{
			BindingSession,
		},
		Dependencies: []string{
			binding.Config,
		},
		ProvideFor: []string{
			binding.Cache,
		},
	}
}

func (r *ServiceProvider) Register(app foundation.Application) {}

func (r *ServiceProvider) Boot(app foundation.Application) {}

SQL Migratsiyasini olib tashlash

SQL migratsiyalari butunlay olib tashlandi, iltimos Go tilidagi migratsiyalardan foydalaning. Migratsiya qadamları:

  1. config/database.go dagi migrations.driver kalitini olib tashlang;
go
// config/database.go
"migrations": map[string]any{
--  "driver": "sql",
  "table":  "migrations",
},
  1. database/migrations katalogidagi SQL migratsiya fayllarini Go tilidagi migratsiya fayllariga aylantiring:
go
// Up Migratsiyalarni ishga tushiring.
func (r *M20241207095921CreateUsersTable) Up() error {
    return facades.Schema().Sql({Original SQL})
}

// Down Migratsiyalarni teskari aylantiring.
func (r *M20241207095921CreateUsersTable) Down() error {
    return facades.Schema().Sql({Original SQL})
}
  1. Migratsiya fayllarini database/kernel.go faylida ro'yxatdan o'tkazing;

Config moduli usullari standart qiymat turini optimallashtirish

Config modulining GetStringGetIntGetBool usullari oldin standart qiymat turi any edi, v1.16 dan boshlab, standart qiymat turi stringintbool ga o'zgartirildi, tur xavfsizligini ta'minlash uchun.

diff
-- GetString(path string, defaultValue ...any) string
++ GetString(path string, defaultValue ...string) string

-- GetInt(path string, defaultValue ...any) int
++ GetInt(path string, defaultValue ...int) int

-- GetBool(path string, defaultValue ...any) bool
++ GetBool(path string, defaultValue ...bool) bool

Orm usullarini optimallashtirish

  • Count, Exists usullarining qaytariladigan qiymatini optimallashtirish:
diff
-- Count(count *int64) error
++ Count() (int64, error)

-- Distinct(args ...any) Query
++ Distinct(columns ...string) Query

-- Exists(exists *bool) error
++ Exists() (bool, error)

-- Select(query any, args ...any) Query
++ Select(columns ...string) Query

-- Sum(column string, dest any) error
++ Sum(column string) (int64, error)
  • Where usuli yopilishlarni qo'llab-quvvatlaydi:
go
facades.Orm().Query().Where(func(query orm.Query) orm.Query {
  return query.Where("height", 180).Where("age", 18)
}).FindOrFail(&user, 100)
// SELECT * FROM users WHERE id = 100 AND (height = 180 AND age = 18);

Path usullarini optimallashtirish

  • Resource usulini qo'shing
go
path.Resource("views/welcome.tmpl")
  • path usuli mutlaq yo'lni qaytaradi

Ilgari path usuli ildiz katalogining nisbiy yo'lini qaytarar edi, masalan, path.Config("app.go") == config/app.go. v1.16 dan boshlab, path usuli mutlaq yo'lni qaytaradi, masalan, path.Config("app.go") == /Users/goravel/workspace/goravel/config/app.go.

So'rov usullarini optimallashtirish

  1. InputMap usulining standart qiymat turini o'zgartirish:
diff
-- ctx.Request().InputMap(key string, defaultValue ...map[string]string) map[string]string
++ ctx.Request().InputMap(key string, defaultValue ...map[string]any) map[string]any
  1. InputMapArray usulini qo'shish, bu Mapning massiv turini olish uchun ishlatiladi:
go
ctx.Request().InputMapArray(key string, defaultValue ...[]map[string]any) []map[string]any
  1. Files usulini qo'shish, bu bir nechta fayllarni olish uchun ishlatiladi:
go
ctx.Request().Files(name string) ([]filesystem.File, error)

Konsol Confirm usullarini optimallashtirish

Confirm usulining qaytarish qiymatini o'zgartirish, aniqlash mantiqini soddalashtirish:

diff
-- Confirm(question string, option ...ConfirmOption) (bool, error)
++ Confirm(question string, option ...ConfirmOption) bool

Session maxsus haydovchisini optimallashtirish

Ilgari siz haydovchini facades.Session().Extend usuli orqali ro'yxatdan o'tkazishingiz kerak edi. v1.16 dan boshlab, siz uni faqat config/session.go konfiguratsiya fayliga qo‘shishingiz kerak:

diff
// app/providers/app_service_provider.go
-- facades.Session().Extend("custom", func() session.Driver {
--   return &CustomDriver{}
-- })

// config/session.go
"drivers": map[string]any{
  "custom": map[string]any{
    "driver": "custom",
    "via": func() (session.Driver, error) {
      return &CustomDriver{}, nil
    },
  }
},

Hujjatni ko'rish

Testing.Request usullarini optimallashtirish

WithCookies va WithCookie usullarining parametrlarini optimallashtirish:

diff
-- WithCookies(cookies map[string]string) Request
++ WithCookies(cookies []*http.Cookie) Request

-- WithCookie(key, value string) Request
++ WithCookie(cookie *http.Cookie) Request

Carbon usullarini optimallashtirish

Ilgari carbon.NewDateTime va boshqa usullar struktura namunasi qaytarar edi, v1.16 dan boshlab, ular ko'rsatkich qaytaradi, agar siz carbon.DateTime turini va boshqalarni aniqlagan bo'lsangiz, uni *carbon.DateTime va boshqa ko'rsatkich turiga o'zgartirishingiz kerak.

str.Snake usullarini optimallashtirish

str.Snake usuli ilgari userID ni user_i_d ga o'zgartiradi edi, v1.16 dan boshlab, u user_id ga o'zgartiriladi.

goravel/cloudinary endi qo'llab-quvvatlanmaydi

goravel/cloudinary endi qo'llab-quvvatlanmaydi, iltimos, goravel/s3 yoki boshqa haydovchilardan foydalaning.

v1.15 dan oldin, Navbat modulining Redis haydovchisi RichardKnop/machinery yordamida amalga oshirilgan edi. v1.16 dan boshlab, Redis haydovchisi rasmiy ravishda goravel/redis da qo‘llab-quvvatlanadi.

Siz v1.16 da hali ham Machinery haydovchisidan foydalanishingiz mumkin, lekin u v1.17 da olib tashlanadi, Redis haydovchisidan foydalanish tavsiya etiladi. Quyida ikkita yangilash usuli taqdim etilgan:

Machinery haydovchisidan foydalanishni davom ettirish

config/queue.go faylidagi konfiguratsiyani o'zgartirish:

diff
// config/queue.go
"connections": map[string]any{
...
  "redis": map[string]any{
--    "driver":     "redis",
++    "driver":     "machinery",
    "connection": "default",
    "queue":      config.Env("REDIS_QUEUE", "default"),
  }
},

Redis navbat haydovchisidan foydalanish

config/queue.go faylidagi konfiguratsiyani o'zgartirish:

diff
// config/queue.go
import (
  "github.com/goravel/framework/contracts/queue"
  redisfacades "github.com/goravel/redis/facades"
)

"connections": map[string]any{
...
  "redis": map[string]any{
--  "driver":     "redis",
++  "driver":     "custom",
    "connection": "default",
    "queue":      config.Env("REDIS_QUEUE", "default"),
++  "via": func() (queue.Driver, error) {
++    return redisfacades.Queue("redis") // ` + "`redis`" + ` qiymati ` + "`connections`" + ` ning kalitidir
++  },
  },
},

Yangi Redis navbat haydovchisi va asl Machinery navbat haydovchisi vazifalari bir xil Redisda saqlanadi, lekin turli navbat nomlaridan foydalanadi. Yangi Redis navbat haydovchisiga o‘tsangiz ham, framework Machinerydagi barcha vazifalar tugaguncha asl Machinery navbat haydovchisi vazifalarini o‘qishni davom ettiradi. Shu bilan birga, yangi navbat vazifalari endi Machinery navbatiga yozilmaydi, balki yangi Redis navbatiga yoziladi va yangi Redis navbat haydovchisi tomonidan iste’mol qilinadi. Ikki haydovchi o‘rtasida uzluksiz o‘tishni amalga oshirish uchun.

Ikkala haydovchi ma’lumotlarini Redisdan tekshirib, ularning to‘g‘ri yozilgan va iste’mol qilinganligini ko‘rishingiz mumkin:

shell
redis-cli

# Redisdagi barcha kalitlarni olish
keys

# Machinery navbat haydovchisi ma’lumotlarini ko‘rish ({} ni qiymat bilan almashtiring)
LRANGE {app_name}_queues:{queue_name} 0 -1

# Redis navbat haydovchisi ma’lumotlarini ko‘rish ({} ni qiymat bilan almashtiring)
LRANGE {app_name}_queues:{connection}_{queue} 0 -1

Elektron pochta yuborishda bcc va cc ni kutilganidek o‘rnatib bo‘lmasligini tuzatish

goravel/framework: v1.16.1

Muammo: #737

goravel/framework: v1.16.1

PR: #1148

ORM yaratish hodisalari bir nechta yozuv yaratishda ishga tushirilishi mumkinligini tuzatish

goravel/framework: v1.16.1

Muammo: #738

make:package buyrug‘i noto‘g‘ri kod generatsiya qilishini tuzatish

goravel/framework: v1.16.1

Muammo: #743

Paket fayllarini nashr qilishda yo‘l noto‘g‘ri ekanligini tuzatish

goravel/framework: v1.16.1

Muammo: #749

Yopilishda panic sodir bo‘lsa, Transaction orqaga qaytarilmasligini tuzatish

goravel/framework: v1.16.3

Muammo: #762

Alohida migratsiya skripti bilan ustun qo‘shish yoki o‘chirishda xatoliklar yuzaga kelishini tuzatish

goravel/framework: v1.16.3

goravel/postgres: v1.4.1

Agar alohida migratsiya skripti orqali ustun qo‘shilsa yoki o‘chirilsa va ilova qayta ishga tushmasa, quyidagi ikkita xato yuzaga keladi:

  1. DB fasadida panic yuzaga keladi.
  2. Postgres haydovchisi xatolikni xabar qiladi: cached plan must not change result type.

Muammo: #768

Orm Select metodidagi buziluvchi o‘zgartirishni tuzatish

goravel/framework: v1.16.3

Orm Select metodini v1.15 dan v1.16 ga yangilashda buziluvchi o‘zgartirish mavjud. Select endi db.Raw() ni qo‘llab-quvvatlamaydi, shuning uchun buziluvchi o‘zgartirishdan qochish uchun yangi SelectRaw metodi qo‘shildi.

Muammo: #770

Buyruqlarni bir vaqtda ishga tushirib bo‘lmasligini tuzatish

goravel/framework: v1.16.4

Schedule modulida buyruqlarni bir vaqtda ishga tushirganda, bir vaqtda yozishlar tufayli tartibsizlik yoki panic yuzaga kelishi mumkin.

goravel/framework: v1.16.5

Ilgari, Navbat ishchisi ishlayotganda, SIGTERM signalini yuborish ishchini darhol to‘xtatardi. Hozir joriy vazifa tugagunicha kutib, keyin to‘xtatilishi tuzatildi.

Muammo: #807

Yangilangan ormda DB keshi qayta o‘rnatilmasligini tuzatish

goravel/framework: v1.16.6

facades.Orm().Fresh() chaqirilganda ma’lumotlar bazasi ulanishi keshi to‘g‘ri qayta o‘rnatilmasligi muammosini tuzatish, bu ORM yangilangandan so‘ng eskirgan ulanishlardan foydalanishga olib kelishi mumkin edi.

Muammo: #840

Kundalik loggerda log fayl aylanishi muammosini tuzatish

goravel/framework: v1.16.6

Kundalik log aylanishi to‘g‘ri ishlamasligi muammosini tuzatish, chunki ilovani qayta ishga tushirmasdan kun uchun yangi log fayli yaratilmasdi.

Muammo: #847

Faqat bitta ustunni tanlab va nomini o‘zgartirganda paginate metodi xatolik xabar qilishini tuzatish

goravel/framework: v1.16.6

Faqat bitta ustunni tanlab va nomini o‘zgartirganda Paginate metodi xatolik xabar qilish muammosini tuzatish. Tuzatish paginatsiya paytida maxsus tanlangan ustunlar hisoblash amallariga xalaqit bermasligini ta’minlaydi.

Muammo: #842

Cursor json ustunini skaner qilolmasligini tuzatish

goravel/framework: v1.16.6

Ma’lumotlar bazasi kursori JSON ustunlarini skaner qilolmasligi muammosini qatorlarni skaner qilish funksionalligini yaxshilash orqali tuzatish. Bu o‘zgartirish JSON ustunlarini to‘g‘ri qayta ishlashni qo‘llab-quvvatlaydi va map[string]any, massivlar ([]string, []int) va maxsus strukturalarga avtomatik JSON-dan Go‘ga konvertatsiya qilish uchun yangi dekodlash ilmoqlarini qo‘shadi.

Muammo: #818

Distinct Count bilan ishlatilganda ta’sir ko‘rsatmasligini tuzatish

goravel/framework: v1.16.7

Distinct ni Count bilan birgalikda ishlatganda kutilgan alohida hisoblash natijalarini bermasligi muammosini tuzatish. Tuzatish yozuvlarni hisoblashda Distinct bandi to‘g‘ri qo‘llanilishini ta’minlaydi.

Muammo: #856

DB.Insert kutilganidek null ustunlar bilan ishlay olmasligi

goravel/framework: v1.16.7

facades.DB().Insert() kutilganidek null ustunlar bilan ishlay olmasligi muammosini tuzatish.

go
type Product struct {
	Model
	SoftDeletes
	Name   string `db:"name"`
	Weight *int   `db:"weight"` // Ko‘rsatkich
	Height *int   `db:"height"`
}

// Agar birinchi ma’lumotda Weight bo‘lmasa, Weight e‘tiborga olinmaydi
facades.DB().Table("products").Insert([]Product{
	{Name: "count_product1"},
	{Name: "count_product2", Weight: convert.Pointer(1)},
})

// Normal
facades.DB().Table("products").Insert([]Product{
	{Name: "count_product2", Weight: convert.Pointer(1)},
	{Name: "count_product1"},
})

Muammo: #858

Noto‘g‘ri orm ichki bog‘lanishlarni yuklashni tuzatish

goravel/framework: v1.16.7

Orm Load() dan foydalanganda ichki bog‘lanishlarni qayta ishlay olmaydi.

go
facades.Orm().Query().Load(&model, "Author.Contacts")

goravel/framework: v1.16.8

goravel/redis: v1.4.1

Navbat ishchisi konkurensiyasi 1 dan katta bo‘lganda, kechiktirilgan vazifalar bir necha marta bajariladi. Buning sababi, bir nechta ishchilar bir xil kechiktirilgan vazifa mavjud bo‘lganda uni olishi mumkin. Endi bir vaqtda faqat bitta ishchi kechiktirilgan vazifani bajarishi uchun tarqatilgan qulf ishlatiladi.

MIT litsenziyasi ostida chiqarilgan