ویژگی جدید دروپال هوک – انجمن DEV

در اعلامیه نسخه جدید چیزی نظر من را جلب کرده است. از عنوان می دانید که این ویژگی هوک است.
برای افرادی که با ویژگی های php آشنایی ندارند، چندی پیش پستی در مورد آن نوشتم.
روشی که شما برای افزودن قلاب نیاز داشتید برای من دردناک بود، زیرا دروپال 8 به سمت روشی شی گرا برای ساختار کد حرکت کرد.
استفاده از نام ماژول برای پیشوند توابع و استفاده از فایل .module برای افزودن همه توابع، حس کد اسپاگتی را برای من به همراه داشت.
و الان تقریبا درستش کردند. تقریباً به این دلیل که دسته ای از قلاب ها وجود دارد که هنوز رویه ای هستند. برنامه حذف قلابهای رویهای در دروپال 12 است، بنابراین در نسخههای کوچک بعدی دروپال شاهد ناپدید شدن آن هوکها خواهیم بود.
مزایای آن چیست؟
به جای افزودن توابع به فایل .module، هوک ها در دایرکتوری src ماژول قرار دارند.
پیشنهاد میکنم برای شناسایی راحتتر از فهرست فرعی Hooks استفاده کنید. یا پسوند Hooks را به نام کلاس اضافه کنید.
از آنجا که این یک ویژگی است که می توانید چندین هوک را به یک روش متصل کنید.
// module.module
function module_comment_insert(CommentInterface $comment) {
module_comment_manipulation($comment);
}
function module_comment_update(CommentInterface $comment) {
module_comment_manipulation($comment);
}
function module_comment_manipulation(CommentInterface $comment) {
// do something
}
// with Hook attribute
class CommentHooks {
#[Hook('comment_insert')]
#[Hook('comment_update')]
public function commentInsertOrUpdate(CommentInterface $comment) {
// do something
}
}
برای افرادی که ماژول ها را برای نسخه های دروپال قبل از 11.1 نگهداری می کنند، یک ویژگی اضافی وجود دارد، LegacyHook. این به شما امکان می دهد کد هوک را به کلاس با ویژگی hook منتقل کنید. و نسخه های قدیمی دروپال تابع را در فایل .module اجرا می کنند، اما نسخه های جدیدتر فقط متد کلاس را اجرا می کنند.
// module.module
#[LegacyHook]
function module_comment_insert(CommentInterface $comment) {
new CommentHooks()->commentInsertOrUpdate($comment);
}
#[LegacyHook]
function module_comment_update(CommentInterface $comment) {
new CommentHooks()->commentInsertOrUpdate($comment);
}
نحوه استفاده از ویژگی هوک
همانطور که از نمونه های کد قبلی مشاهده می کنید، ویژگی به متد اضافه می شود.
اما می توانید متد را نیز به کلاس اضافه کنید.
#[Hook('comment_insert')]
#[Hook('comment_update')]
class CommentManipulationHook {
public function __invoke(CommentInterface $comment) {
// do something
}
}
همانطور که در مثال نشان می دهم، پیشنهاد می کنم نام کلاس را توصیفی تر کنید. و به جای Hooks از پسوند Hook استفاده کنید.
می توانید ویژگی های Hook را به کلاس اضافه کنید و متد را به عنوان پارامتر دوم اضافه کنید. من این را توصیه نمی کنم، در این صورت اضافه کردن ویژگی به متد پاک تر است.
یک پارامتر هوک سوم، ماژول وجود دارد. و این به شما امکان می دهد یک کلاس هوک را از ماژول دیگری اجرا کنید. به عنوان مثال #hook('comment_insert', 'commentInsert', 'my_comment_module')
.
من در مورد یک مورد استفاده برای این فکر کردم، اما نتوانستم آن را پیدا کنم.
اگر یکی را می شناسید به من بگویید.
نتیجه گیری
من دوست دارم ببینم کد دروپال در مسیر درست حرکت می کند.
تنها چیزی که مرا آزار می دهد این است که قلاب ها ثابت جادویی هستند. اما پلان برای تمام ویژگیهای hook با کلاس پایه ویژگی Hook است. بنابراین به جای #[Hook('comment_insert')]
خواهد بود #[CommentInsert]
.
راه دیگری که آنها می توانند این کار را انجام دهند استفاده از enums است که بر اساس ماژول گروه بندی شده اند.
enum CommentHooks {
case Insert;
case Update;
}
اطلاعات این پست بر اساس مستندات و نگاه سریع من به پیاده سازی است. وقتی این ویژگی را آزمایش کردم، بهروزرسانیهایی برای ارسال یا یک پست اضافی وجود خواهد داشت.