يحتوي إطار العمل iris على نمطين لربط المسارات، الأول هو الوظيفي والآخر هو MVC. يقوم الوضع الوظيفي بربط وظيفة معالجة بمسار URL محدد، في حين يقوم وضع MVC بربط متحكم بمسار URL. يقوم الإطار بتوليد مسارات URL مقابلة تلقائيًا استنادًا إلى قواعد التسمية لأساليب المتحكم، ويربط بشكل تلقائي الوظائف المتحكمة المقابلة.

ربط المسارات الوظيفي

أبسط نموذج توجيه في إطار iris، حيث يمكنك ربط وظيفة بأي URL.

func main() {
    // قم بإنشاء تطبيق iris مع middleware الافتراضي:
    // بشكل افتراضي، يستخدم مستوى تسجيل "debug".
    // يدعم التعريب الموجود تحت الدليل "./locales".
    // القوالب HTML موجودة تحت الدلائل "./views" أو "./templates".
    // يتم حفظ سجلات الوصول في "./access.log"،
    // وتم ربط المنهك (دون تعطل) و middleware لهوية الطلب بالفعل.
    app := iris.Default()

	// قم ببساطة بربط وظائف المسار استنادًا إلى طريقة الطلب HTTP والمسار، على غرار آلية التوجيه في Gin و echo والإطارات الأخرى.
    app.Get("/someGet", getting)
    app.Post("/somePost", posting)
    app.Put("/somePut", putting)
    app.Delete("/someDelete", deleting)
    app.Patch("/somePatch", patching)
    app.Header("/someHead", head)
    app.Options("/someOptions", options)
    
	// الاستماع على المنفذ
    app.Listen(":8080")
}

المعلمات في المسار

func main() {
    app := iris.Default()

    // سيطابق هذا المعالج /user/john ولكن ليس /user/ أو /user
    app.Get("/user/{name}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        ctx.Writef("مرحبًا %s", name)
    })
    
    // ومع ذلك، سيطابق هذا المعالج /user/john/ و /user/john/send
    // إذا لم يتطابق مع المسار /user/john، فإنه سيقوم بإعادة توجيه إلى /user/john/
    app.Get("/user/{name}/{action:path}", func(ctx iris.Context) {
        name := ctx.Params().Get("name")
        action := ctx.Params().Get("action")
        message := name + " " + action
        ctx.WriteString(message)
    })
    
    // بالنسبة لكل طلب مُطابق، ستحتفظ السياق بتعريف المسار
    app.Post("/user/{name:string}/{action:path}", func(ctx iris.Context) {
        ctx.GetCurrentRoute().Tmpl().Src == "/user/{name:string}/{action:path}" // صحيح
    })
    
    app.Listen(":8080")
}

أنواع المعلمات المدمجة المتاحة:

نوع المعلمة نوع Go شرط التحقق طريقة الاسترجاع
:string string أي حرف (قطاع مسار واحد) Params().Get
:uuid string uuidv4 أو تنسيق v1 (قطاع مسار واحد) Params().Get
:int int -9223372036854775808 إلى 9223372036854775807 (x64) أو -2147483648 إلى 2147483647 (x32)، اعتمادًا على بنية الجهاز المضيف Params().GetInt
:int8 int8 -128 إلى 127 Params().GetInt8
:int16 int16 -32768 إلى 32767 Params().GetInt16
:int32 int32 -2147483648 إلى 2147483647 Params().GetInt32
:int64 int64 -9223372036854775808 إلى 9223372036854775807 Params().GetInt64
:uint uint 0 إلى 18446744073709551615 (x64) أو 0 إلى 4294967295 (x32)، اعتمادًا على بنية الجهاز المضيف Params().GetUint
:uint8 uint8 0 إلى 255 Params().GetUint8
:uint16 uint16 0 إلى 65535 Params().GetUint16
:uint32 uint32 0 إلى 4294967295 Params().GetUint32
:uint64 uint64 0 إلى 18446744073709551615 Params().GetUint64
:bool bool "1" أو "t" أو "T" أو "TRUE" أو "true" أو "True" أو "0" أو "f" أو "F" أو "FALSE" أو "false" أو "False" Params().GetBool
:alphabetical string حروف صغيرة أو كبيرة Params().Get
:file string حروف صغيرة أو كبيرة، أرقام، شرطة سفلية (_)، شرطة (-)، نقطة (.)، لا يمكن أن يحتوي على مسافات أو رموز خاصة غير صالحة أخرى لأسماء الملفات Params().Get
:path string أي حرف، يمكن فصله بواسطة شرطة مائلة (قطاع مسار)، ولكن يجب أن يكون آخر جزء من مسار المسار Params().Get
:mail string عنوان بريد إلكتروني، عنوان المجال غير مُحقق Params().Get
:email string عنوان بريد إلكتروني، المجال مُحقق Params().Get
:date string التنسيق yyyy/mm/dd، على سبيل المثال /blog/{param:date} يتطابق مع /blog/2022/04/21 Params().GetTime و Params().SimpleDate
:weekday uint (0-6) أو string تنسيق السلسلة كاسم اليوم الطويل لtime.Weekday ("sunday" إلى "monday" أو "Sunday" إلى "Monday")، على سبيل المثال /schedule/{param:weekday} يتطابق مع/schedule/monday Params().GetWeekday

توجيه المجموعة

في بعض الأحيان، يكون هناك حاجة إلى إدارة إصدارات واجهة برمجة التطبيقات (API)، أو تعيين بادئة موحدة لتوجيه وحدة كبيرة. هنا تأتي قدرة توجيه المجموعة إلى الأمام.

func main() {
    app := iris.Default()

    // مجموعة بسيطة: v1
    v1 := app.Party("/v1")
    {
        v1.Post("/login", loginEndpoint)
        v1.Post("/submit", submitEndpoint)
        v1.Post("/read", readEndpoint)
    }
    
    // مجموعة بسيطة: v2
    v2 := app.Party("/v2")
    {
        v2.Post("/login", loginEndpoint)
        v2.Post("/submit", submitEndpoint)
        v2.Post("/read", readEndpoint)
    }
    
    app.Listen(":8080")
}

توجيه نموذج-عرض-تحكم (MVC)

يدعم إطار العمل Go Iris نمط MVC، حيث يتم ربط المسارات بوظائف التحكم المحددة من خلال قواعد معينة.

package main

import (
	"strings"
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/middleware/logger"
	"github.com/kataras/iris/v12/middleware/recover"
	"github.com/kataras/iris/v12/mvc"
)

// إنشاء تطبيق iris
func newApp() *iris.Application {
	app := iris.New()
	// ضبط مرتين وسيطتين
	// يتم استخدام recover لالتقاط أخطاء الانهيار لتجنب إنهاء البرنامج بشكل غير طبيعي
	// logger يتم استخدامه لتسجيل الطلبات
	app.Use(recover.New())
	app.Use(logger.New())

	// تسجيل التحكم بـ "/" بمسار الجذر هنا.
	mvc.New(app).Handle(new(ExampleController))
	
	// يمكن أيضًا تسجيلها تحت مسار محدد بمساعدة تجميع المسارات
	// مثال: تسجيل التحكم تحت مسار /books
	// mvc.New(app.Party("/books")).Handle(new(ExampleController))
}

func main() {
	// إنشاء التطبيق
	app := newApp()

	// http://localhost:8080
	// http://localhost:8080/ping
	// http://localhost:8080/hello
	// http://localhost:8080/custom_path
	app.Listen(":8080")
}

// تعريف ExampleController للتعامل مع الطلبات لـ "/", "/ping", و "/hello".
type ExampleController struct{}

// التعامل مع الطلب النوع GET
// URL الطلب: http://localhost:8080
func (c *ExampleController) Get() mvc.Result {
	return mvc.Response{
		ContentType: "text/html",
		Text:        "<h1>مرحبًا</h1>",
	}
}

// GetPing يخدم
// الطريقة: GET
// URL الطلب: http://localhost:8080/ping
func (c *ExampleController) GetPing() string {
	return "pong"
}

// GetHello يخدم
// الطريقة: GET
// URL الطلب: http://localhost:8080/hello
func (c *ExampleController) GetHello() interface{} {
	return map[string]string{"message": "مرحبًا Iris!"}
}

// GetHelloWorld يخدم
// الطريقة: GET
// URL الطلب: http://localhost:8080/hello/world
func (c *ExampleController) GetHelloWorld() interface{} {
	return map[string]string{"message": "مرحبًا Iris! DefaultPath"}
}

العلاقة بين توجيه نموذج-عرض-تحكم وقاعدة تسمية وظائف التحكم.

عنوان المسار: تجميع المسار + اسم الطريق الفرعي + اسم الدالة (بالأحرف الصغيرة)

على سبيل المثال:

func (c *ExampleController) GetPing() string {
	return "pong"
}

نظرًا لعدم تحديد تجميع مسار، يمكن لهذه الدالة التعامل مع طلبات GET للمسار http://localhost:8080/ping.