Table of Contents
ساخت یک CMS بدون سر و صدا در Directus با الگوی کارخانه Abstract
مدیریت محتوا مدرن نیاز به انعطاف پذیری، مقیاس پذیری و تفکیک شفاف از نگرانی ها دارد. Directus - CMS بدون سر که یک API شهودی را بر هر پایگاه داده SQL لایه می کند - توسعه دهندگان می توانند سیستم های محتوای بسیار سازگار را ایجاد کنند.یکی از موثرترین الگوهای طراحی برای دستیابی به این ماژولار (LT:2) کارخانه [شکل مستقیم] است که به شما اجازه می دهد تا یک الگوی داده های لینک داده های دقیق (و یا ابزار پاسخ داده های دقیق را ایجاد کنید.
درک الگوی کارخانه انتزاعی در یک زمینه بی سر
الگوی کارخانه انتزاعی یک رابط برای ایجاد خانواده های اشیاء مرتبط یا وابسته فراهم می کند.در CMS سنتی مانند وردپرس، این ممکن است بلوک ها یا تم ها را کنترل کند.در Directus، الگوی به طور طبیعی به تولید مجموعه، پیکربندی زمینه، فرم های پاسخ API یا اجزای جلویی به طور پویا، به جای اتصال کد خود را به طور مستقیم به مجموعه های خاص Directus یا ساختارهای مورد خاص، شما کارخانه های انتزاعی را تعریف می کنید که تنظیمات چندگانه را تولید می کنند، یا سیستم های چند منظوره مانند تنظیمات چند منظوره مختلف مانند تنظیمات مشتری متفاوت مانند، به عنوان ابزار چند منظوره مانند ابزارهای مختلف برچسب مشتری.
استفاده از الگو در یک پلاگین Directus یا Ex
Directus اجازه می دهد تا افزونه های سفارشی (hooks، Endpoint، پانل ها، ماژول ها) را به طور کامل در این افزونه ها متناسب کند.شما می توانید یک کارخانه را تعریف کنید که بر اساس تنظیمات یا نقش های کاربر، تنظیم صحیح کنترل کننده ها، زنجیره ای ها و اعتباربخشی های زمینه، این امر باعث می شود تا شل و نگهداری آسان تر در نسخه ها یا استقرار ها.
مرحله 1: رابط های انتزاعی را برای اجزای محتوا تعریف کنید
با ایجاد رابط های TypeScript یا JavaScript برای اشیایی که کارخانه شما تولید می کند، شروع کنید.برای یک پلاگین Directus Endpoint، این ممکن است اشیاء ارائه داده باشد:
// Interface for a content renderer used in an API response
interface ContentRenderer {
render(item: Record<string, any>): Record<string, any>;
}
// Interface for a field formatter
interface FieldFormatter {
format(value: any, field: string): any;
}
مرحله دوم: پیاده سازی کلاس های بتنی برای خانواده های محتوا خاص
کلاس های بتنی را توسعه دهید که این رابط ها را برای موارد مختلف استفاده می کنند - به عنوان مثال، یک رندر “blog” در مقابل یک “ کاتالوگ محصول” ارائه می دهد:
class BlogContentRenderer implements ContentRenderer {
render(item: Record<string, any>): Record<string, any> {
return {
title: item.title,
excerpt: item.excerpt,
date: item.date_created,
body: this.sanitizeHtml(item.body)
};
}
private sanitizeHtml(html: string): string {
return html.replace(/<script[^>]*>.*?<\/script>/gi, '');
}
}
class ProductCatalogRenderer implements ContentRenderer {
render(item: Record<string, any>): Record<string, any> {
return {
name: item.title,
price: item.price,
image: item.image,
inStock: item.quantity > 0
};
}
}
ایجاد کارخانه انتزاعی در یک مجتمع Directus
رابط کارخانه روش هایی را برای ایجاد هر نوع از اجزای محتوا (renderer، formatter، Authenticator و غیره) اعلام می کند.کارخانه های بتنی خانواده های این اشیاء را با هم تولید می کنند.
نمونه ی بازی Factory Interface
interface ContentModuleFactory {
createRenderer(): ContentRenderer;
createFormatter(): FieldFormatter;
createValidator(): ItemValidator;
}
پیاده سازی کارخانه بتن برای ماژول وبلاگ
class BlogModuleFactory implements ContentModuleFactory {
createRenderer(): ContentRenderer {
return new BlogContentRenderer();
}
createFormatter(): FieldFormatter {
return new BlogFieldFormatter(); // formats dates, slugs, etc.
}
createValidator(): ItemValidator {
return new BlogItemValidator(); // ensures required fields for posts
}
}
ادغام کارخانه به نقطه پایانی مستقیم
با کارخانه در محل، شما می توانید یک نقطه انتهایی سفارشی Directus بسازید که از خانواده مناسب بر اساس پارامتر پرس و جو یا متغیر محیطی استفاده می کند:
export default (router, { services, database }) => {
const { ItemsService } = services;
router.get('/content/:module', async (req, res) => {
const module = req.params.module;
let factory: ContentModuleFactory;
switch (module) {
case 'blog':
factory = new BlogModuleFactory();
break;
case 'products':
factory = new ProductModuleFactory();
break;
default:
factory = new DefaultModuleFactory();
}
const renderer = factory.createRenderer();
const validator = factory.createValidator();
const itemsService = new ItemsService(module, { database });
const items = await itemsService.readByQuery({ limit: 20 });
// Validate and render each item
const result = items.map(item => renderer.render(validator.process(item)));
res.json({ data: result });
});
};
استفاده پیشرفته: چند دهم خانواده محتوا
Directus در چند دهمگی با طرح های متعدد یا فیلترهای دسترسی به آن، با استفاده از الگوی کارخانه انتزاعی، می توانید پیکربندی های مختلف کارخانه را بر اساس درخواست شناسه مستاجر بارگیری کنید.هر مستاجر ممکن است مجموعه ای از زمینه های خود را داشته باشد، منطق رندر جاسازی شده یا حتی ساختارهای مختلف Directus را داشته باشد.
مزایای الگوی کارخانه انتزاعی در Directus
- قابلیت: سوئیچ بین خانواده های محتوا (blog، کاتالوگ، داشبورد) بدون بازنویسی منطق هسته ای.
- [در این میان] [و] حقّی: [[[۱]] [۱۰] [۱]] هر خانواده ای منزوی است؛ تغییراتی که بر دیگران اثر نمی گذارد.
- قابلیت های: اضافه کردن یک خانواده محتوا جدید به معنی پیاده سازی یک کارخانه بتن جدید و کلاس های آن - هیچ گونه تغییر در کارخانه های موجود و یا مصرف کنندگان.
- قابلیت تست: کارخانه ها و محصولات خود را می توان به طور مستقل تست، بهبود کیفیت کد.
- جدایی پاک الگوی اعمال قانون مسئولیت واحد، و باعث می شود که افزونه های مستقیم خود را آسان تر درک کنید
بررسی های عملی برای Directus Developers
در حالی که الگوی کارخانه انتزاعی ساختار پیش رو را اضافه می کند، به عنوان پروژه Directus شما رشد می کند.با یک کارخانه ساده برای یک یا دو خانواده محتوا شروع کنید، سپس به عنوان نیاز به حداقل رساندن رابط کاربری خود گسترش می یابد - فقط آنچه مصرف کنندگان خود را در واقع استفاده می کنند، استفاده از سیستم های مختلف برای ایجاد ایمنی در سراسر خانواده ها، اگر شما یک پانل توسعه مستقیم برای پیکربندی برنامه مدیریت، با استفاده از پایگاه های مجوز و یا رندر کردن فیلد مجوز.
مثال: کارخانه برای پنل مدیریت Widgets
در یک پنل Directus سفارشی، شما ممکن است ویجت هایی داشته باشید که داده ها را از مجموعه های مختلف خلاصه می کنند.کارخانه تصمیم می گیرد که کدام جزء ویجت را به Instantiate برساند:
interface DashboardWidget {
type: string;
props: Record<string, any>;
render(container: HTMLElement): void;
}
class UsersWidget implements DashboardWidget { ... }
class OrdersWidget implements DashboardWidget { ... }
class Factory {
createWidget(type: string): DashboardWidget {
if (type === 'users') return new UsersWidget();
if (type === 'orders') return new OrdersWidget();
throw new Error('Unknown widget type');
}
}
وقتی که از این الگو استفاده نکنید
الگوی کارخانه انتزاعی یک گلوله نقره ای نیست که از آن برای خانواده های ساده و یک محتوا یا زمانی که طرح مستقیم شما به ندرت تغییر می کند، اجتناب کنید.بیش مهندسی یک افزونه کوچک با سلسله مراتب کارخانه کامل می تواند پیچیدگی های غیرضروری را اضافه کند، زمانی که شما خانواده های متعدد، اضافه های مکرر، یا زمانی که شما نیاز به مبادله خانواده ها بر اساس پیکربندی زمان دارید.
برای یک شیرجه عمیق تر به معماری و الگوهای طراحی بی سر در Directus، گزینه ی را بررسی کنید و مثال های پیاده سازی (قابل اطمینان به Node.js).
نتیجه گیری
ادغام الگوی کارخانه انتزاعی در فرآیند توسعه Directus شما منجر به یک سازمان یافته تر، سازگار و مقیاس پذیر از CMSless می شود. آن را تشویق می کند معماری کد تمیز، سیستم خود را برای گسترش آینده آماده می کند و انعطاف پذیری Directus را بدون قربانی کردن خانواده های محتوا از طریق کارخانه های انتزاعی، شما می توانید CMS خود را در کنار نیازهای کسب و کار خود را با حداقل اختلال تکامل دهید.