1. হুকস ব্যবস্থা
হুকস
ব্যবস্থা হলো ডাটাবেস অপারেশনে নির্দিষ্ট পরিবর্তনের আগে বা পরে কাস্টম লজিক যোগ করার জন্য একটি পদ্ধতি। ডাটাবেস স্কিমা পরিবর্তন, যেমন নতুন নোড যোগ করা, নোডগুলির মধ্যে এজ মুছে দেওয়া, বা একাধিক নোড মুছে দেওয়া এর মধ্যে হুকস
ব্যবহার করে ডাটা যাচাই, লগ রেকর্ডিং, অনুমতি পরীক্ষা, বা যে কোন কাস্টম অপারেশন করা সম্পর্কের জন্য ব্যাপন। এটা ডাটা সংরক্ষণের সাথে ব্যবসায়িক নিয়ম মানের সাথে সাংগত, এবং অনুমতি দেওয়ায় গুরুত্বপূর্ণ হয়, এবং এটাও ডেভেলপারদের প্রাথমিক ব্যবসায়িক লজিক বদলাই না করে অতিরিক্ত কার্যকলাপ যোগ করার সুযোগ দেয়।
2. হুক নিবন্ধনের পদ্ধতি
2.1 গ্লোবাল হুক এবং লোকাল হুক
গ্লোবাল হুক (সময় হুক) গ্রাফে সমস্ত ধরনের অপারেশনের জন্য কার্যকারিতা বাড়ানোর জন্য প্রভাবী। এটা সাধারণত সম্পূর্ণ অ্যাপ্লিকেশনে লগ রেকর্ডিং এবং মনিটরিং এর মতো লজিক যোগ করার জন্য উপযোগী। লোকাল হুক (স্কিমা হুক) বিশেষ ধরনের নোড স্কীমা এর মধ্যে সংরক্ষিত এবং শুধুমাত্র স্কীমা টাইপের পরিবর্তন অপারেশনের জন্য প্রযোজ্য। স্থানীয় হুক ব্যবহার করা হলো নির্দিষ্ট নোড ধরনের সমস্ত লজিককে একটি স্থানে একত্রিত করার জন্য, অর্থাৎ স্কীমা সংজ্ঞানার মধ্যে।
2.2 হুক নিবন্ধনের জন্য পদক্ষেপসমূহ
কোডে হুক নিবন্ধন করা সাধারণত নিম্নলিখিত পদক্ষেপগুলি যোগ করা হয়:
- হুক ফাংশন সংজ্ঞায়িত করা। এই ফাংশনটি একটি
ent.Mutator
নিয়ে এবং একটিent.Mutator
ফেরত দেয়। উদাহরণস্বরূপ, একটি সাধারণ লগিং হুক তৈরি করা:
logHook := func(next ent.Mutator) ent.Mutator {
return ent.MutateFunc(func(ctx context.Context, m ent.Mutation) (ent.Value, error) {
// মিউটেশন অপারেশনের আগে লগ প্রিন্ট করা
log.Printf("প্রিন্ট লগ: টাইপ=%s, অপারেশন=%s\n", m.Type(), m.Op())
// মিউটেশন অপারেশন করা
v, err := next.Mutate(ctx, m)
// মিউটেশন অপারেশনের পর লগ প্রিন্ট করা
log.Printf("মিউটেশনের পরে প্রিন্ট লগ: টাইপ=%s, অপারেশন=%s\n", m.Type(), m.Op())
return v, err
})
}
- ক্লায়েন্টে হুক নিবন্ধিত করা। গ্লোবাল হুকসের জন্য, আপনি ক্লায়েন্টের
Use
মেথডটি ব্যবহার করে তাদের নিবন্ধন করতে পারেন। স্থানীয় হুক গুলির জন্য, আপনি স্কীমায় তাদেরHooks
মেথডটি ব্যবহার করে তাদের নিবন্ধন করতে পারেন।
//গ্লোবাল হুক নিবন্ধন করুন
client.Use(logHook)
// স্থানীয় হুক নিবন্ধন করুন, শুধুমাত্র ব্যবহারকারী টাইপের জন্য
client.User.Use(func(next ent.Mutator) ent.Mutator {
return hook.UserFunc(func(ctx context.Context, m *ent.UserMutation) (ent.Value, error) {
// নির্দিষ্ট লজিক যোগ করুন
// ...
return next.Mutate(ctx, m)
})
})
- আপনি বহুপদের মধ্যে মড হক চেইন করতে পারেন, এবং এগুলি নিবন্ধিত তারেক।
3. হুকস প্রয়োগের ক্রম
হুকস প্রয়োগের ক্রমগুলি ক্লায়েন্টের সাথে তাদের নিবন্ধনের ক্রম দ্বারা নির্ধারণ করা হয়। যেমন, client.Use(f, g, h)
প্রয়োগ করা হবে ক্রম অনুসারে মিউটেশন অপারেশনে, f(g(h(...)))
। এই উদাহরণে, f
প্রথম হুক যা নিবন্ধন করা হয়, তারপরে g
, এবং চূড়ে h
হয়।
গুরুত্বপূর্ণ বিষয় যে, সময় হুক (Runtime hooks
) সমতল হুকসে (Schema hooks
) থেকে আগেদের অধিকতর। এর মানে হল, যদি g
এবং h
এখানে স্কীমা হুক বর্ণিত হোক, যখন f
ক্লায়েন্টে ব্যবহার করার সাথে নিবন্ধন করা হয়, তবে ক্রিয়ার ক্রম হবে f(g(h(...)))
। এটি নিশ্চিত করে যে, সব অন্যান্য হুকস প্রাধান্য দেওয়া যায়, যেমন, লগিং, সব অন্যান্য হুক এগুলির আগে এক্সিকিউট হবে।
4. হুক দ্বারা সৃষ্ট সমস্যাগুলির সাথে সম্পর্কিত সমস্যা নিয়ে যোগাযোগ করা
হুক ব্যবহার করে কাস্টমাইজড ডাটাবেস অপারেশন সম্পর্কে যখন দুর্দান্ত কেছু সমস্যা অতিক্রম করা, আমরা অনুভব করতে পারেন ইম্পোর্ট সাইকেল সমস্যা। এটা সাধারণত স্কীমা হুক ব্যবহার করার চেষ্টা করলে প্রায় ঘটে। কারণ ent/schema
প্যাকেজটি ইম্পোর্ট করতে হলে ইতিমধ্যেই ent
কোর প্যাকেজের সাথে সম্পর্কিত হতে পারে। যদি ent
কোর প্যাকেজটি আবারো ent/schema
ইম্পোর্ট করার চেষ্টা করে, তবে একটি বৃত্তাকার নিরাপত্তার সৃষ্টি হয়।
বৃত্তাকার নিরাপত্তা গুরুত্বপূর্ণ কারণ
বৃত্তাকার নিরাপত্তা সাধারণত স্কীমা সংজ্ঞানা এবং জেনারেট হোয়া একাধিক ভ্রুমোক্চিমিক সংজ্ঞা ও ভার্চুয়াল এন্টিটি কোডের মধ্যে দিকতম সংজ্ঞা থাকার একধরণের সূচনা৷ এটা পুরো ent/schema
প্যাকেজটিতে স্কীমা তথ্যের তারাতারিতভাবে ব্যাবস্থা করার জন্য চাহিদা হয়।
ঘূর্ণন সমাধান
যদি ঘূর্ণন সমাধানের একটি ঘটনা দেখা যায়, তবে আপনি নিম্নলিখিত পদক্ষেপ নিতে পারেন:
- প্রথমে,
ent/schema
এ ব্যবহৃত সমস্ত হুক এর মন্তব্য করুন। - পরবর্তীতে,
ent/schema
এ নির্ধারিত কাস্টম ধরনগুলি নতুন একটি প্যাকেজে সরান, উদাহরণস্বরূপ, আপনিent/schema/schematype
নামে একটি প্যাকেজ তৈরি করতে পারেন। -
go generate ./...
কমান্ডটি চালান - উপাদানটি আপডেট করতে, যাতে এটি নতুন প্যাকেজ পথে নির্দেশ করে, স্কিমা সংমিলনে ধরনের সনাক্ত করা হয়। উদাহরণস্বরূপ,schema.T
কেschematype.T
তে পরিবর্তন করুন। - পূর্বে মন্তব্যযুক্ত করা হুকস সংদর্ভনা পুনরায়
go generate ./...
কমান্ডটি চালান। এই সময়ে, কোড উৎপাদনে কোনও ত্রুটি ছাড়াই অগ্রসর হবে।
এই পদক্ষেপগুলি অনুসরণ করে, আমরা হুক ইম্পোর্ট দ্বারা সৃষ্ট ঘূর্ণন চালিত হয় চেক করে এবং সিদ্ধান্ত ও এইচওক বাস্তবায়নের জন্য স্কীমা এবং হুকস ইমপ্লিমেন্টেশনের যোগাযোগ সমান হতে সম্পূর্ণ হওয়ার নিশ্চয়তা দেওয়া যাবে।
5. হুক হেল্পার ফাংশনের ব্যবহার
ent
ফ্রেমওয়ার্ক একটি সেট অফ হুক হেল্পার ফাংশন প্রদান করে, যা আমাদেরকে হেল্প করতে পারে হুক ইউনিয়নের সময় নিয়ন্ত্রণ করা। উপরোক্ত কিছু সাধারণভাবে ব্যবহৃত হুক হেল্পার ফাংশনের কিছু উদাহরণ:
// শুধুমাত্র UpdateOne এবং DeleteOne অপারেশনের জন্য HookA কে অনুষ্ঠান
hook.On(HookA(), ent.OpUpdateOne|ent.OpDeleteOne)
// Create অপারেশনের সময় HookB অনুষ্ঠান না করা
hook.Unless(HookB(), ent.OpCreate)
// HookC প্রদান করা এবং "status" ক্ষেত্রটি সংশোধন করছে এবং "dirty" ক্ষেত্রটি পরিষ্কার করছে নির্দেশ করে কেবলমাত্র HookC অনুষ্ঠান করা
hook.If(HookC(), hook.And(hook.HasFields("status"), hook.HasClearedFields("dirty")))
// আপডেট (একাধিক) অপারেশনে "পাসওয়ার্ড" ক্ষেত্র পরিবর্তন নিষেধ করা
hook.If(
hook.FixedError(errors.New("password cannot be edited on update many")),
hook.And(
hook.HasOp(ent.OpUpdate),
hook.Or(
hook.HasFields("password"),
hook.HasClearedFields("password"),
),
),
)
এই হেল্পার ফাংশনগুলি আমাদেরকে বিভিন্ন অপারেশনের জন্য হুক সক্রিয়করণের শর্তগুলি নির্ধারণ করার জন্য দক্ষতাপূর্ণভাবে নিয়ন্ত্রণ করতে অনুমতি দেয়।
6. লেনদেন হুক
লেনদেন হুক লেনদেন সম্পন্ন হওয়ার সময় (Tx.Commit
) বা প্রত্যাহার করা হওয়ার (Tx.Rollback
) সময় বিশেষ হুক ব্যাপারে অনুমতি দেয়। এটা তথ্য সমন্বয় এবং অপারেশনের পরম সমতা নিশ্চিত করার জন্য অত্যন্ত গুরুত্বপূর্ণ।
লেনদেন হুকের উদাহরণ
client.Tx(ctx, func(tx *ent.Tx) error {
// লেনদেন হুক নিবন্ধন করা - hookBeforeCommit চালিত হবে পিছনের টানা হুক আগে সম্পন্ন হওয়ার আগে।
tx.OnCommit(func(next ent.Committer) ent.Committer {
return ent.CommitFunc(func(ctx context.Context, tx *ent.Tx) error {
// প্রকার সম্পন্ন হওয়ার আগে লজিক এখানে রাখা যেতে পারে।
fmt.Println("Before commit")
return next.Commit(ctx, tx)
})
})
// লেনদেনের ভিতরে একাধিক অপারেশন পরিচালনা করুন...
return nil
})
উপরের কোড প্রদর্শন করে যে লেনদেন সম্পন্ন হওয়ার আগে লেনদেন হুক নিবন্ধন করা। এই হুকটি উপাদানের সমস্ত ডাটাবেস অপারেশন সম্পন্ন হওয়ার পরে এবং লেনদেন যথার্থ সম্পন্ন হওয়ার আগে কার্যকর করা হবে।