افزودن صفحات جدید به دروپال 8 در غیاب hook_menu

افزودن صفحات جدید به دروپال 8 در غیاب hook_menu

برای افزودن صفحات جدید به دروپال 6 و دروپال 7، تابع hook_menu را در ماژولی که خودمان می نوشتیم، پیاده سازی می کردیم. در مقاله «برنامه نویسی ماژول دروپال در 5 گام ساده» مراحل این کار را در دروپال 7 توضیح دادم. در مقاله «نمایش محتوای یک صفحه (path) در قالبی به جز قالب پیش فرض دروپال» نیز استفاده پیشرفته تری از hook_menu را بررسی کردم.

مسیریابی دروپال 8 با کامپوننت های سمفونی2

اینکه چطور در دروپال 8 یک صفحه جدید در ماژولی که می نویسیم به دروپال اضافه کنیم را در مقاله «برنامه نویسی اولین ماژول دروپال 8 در 6 گام ساده» نوشتم. مکانیزم جدیدی برای ثبت مسیر صفحات (route) با استفاده از کامپوننت های Routing و CMF Routing سمفونی2، در دروپال 8 معرفی شده است. بنابراین روش شناساندن مسیر ها در ماژول های دروپال 8 به کلی در مقایسه با نسخه های قدیمی تر دروپال تغییر کرده است.

بنابراین از این به بعد بیشتر از واژه route و routing استفاده می کنیم. Route ها، مسیر و آدرس صفحات را به توابع callback ای که محتوای صفحه را درست می کنند و دسترسی به صفحه را کنترل می کنند، تطابق می دهند. این کار قبلا در hook_menu به شرحی که در مقاله های گذشته توضیح دادم، انجام می شد. هوک منو، مفاهیم آدرس و روتینگ را با منو آیتم ها، منو تب ها (local task)، اکشن لینک ها و لینک های زمینه ای (Contextual links) مخلوط می کرد. با معرفی مکانیزم های جدید در دروپال 8، این مفاهیم از یکدیگر استقلال پیدا کرده اند. در تصویر زیر این موضوع مشخص شده است:

تفاوت های hook_menu در دروپال 7 با روتینگ دروپال 8

همانطور که می بینید، مفاهیمی که گفته شد، هر یک در yml فایل های مختلفی معرفی می شوند.

معرفی مسیرها در دروپال 8 در فایل .routing.yml

معرفی مسیر ها و تطابق آنها با توابعی (callback) که محتوای صفحه را ایجاد می کنند و یا دسترسی را کنترل می کنند در فایلی که با اسم ماژول شروع می شود و به .routing.yml ختم می شود، انجام می شود ([module_name].routing.yml). تطابق مسیر به تابع تولید محتوایش، تنها کاری نیست که در سیستم جدیدی روتینگ دروپال انجام می شود، بلکه تطابق بر اساس متد HTTP و هاست نیز پشتیبانی می شود.

نکات بیشتری درباره تفاوت های hook_menu و روتینگ دروپال 8

  • قبلا در آدرس صفحات را در hook_menu معرفی می کردیم، ولی در دروپال 8 آنها را در فایلی که با نام ماژول شروع می شود و به .routing.yml ختم می شود، با فرمت YAML تعریف می کنیم (module_name.routing.yml).
  • هر route با یک نام ماشین مشخص می شود. قرارداد ما در دروپال این است که این نام با اسم ماژول شروع می شود، بعد از آن یک نقطه قرار می گیرد و بعد نام فرعی تر ان مسیر نوشته می شود (module_name.sub_name).
  • هر route یک مسیر است که با کاراکتر / شروع می شود.
  • قبلا از علامت های % و یا %name استفاده می کردیم که پارامتر های آدرس را مشخص کنیم ولی الان نام پارامتر ها را درون علامت های آکولاد باز و بسته قرار می دهیم مثلا {name}.
  • قبلا در hook_menu از page callback برای معرفی تابع تولید کننده محتوای صفحه استفاده می کردیم، ولی در دروپال 8 از کلید _content که در فایل module_name.routing.yml استفاده می کنیم.
  • کلید های _controller یا _content که در معرفی route ها استفاده می کنیم، اسم تابع نمی گیرند بلکه آنها به متد های یک کلاس باید اشاره کنند مثل
    \Drupal\drupalika_module\Controller\DrupalikaDevelopController::content
  • کلید های _controller یا _contentمی توانند به یک سرویس ثبت شده اشاره کنند. مثلا _controller: mymodule_controller:someMethod که از نام سرویس و دو نقطه به اضافه متد آن تشکیل شده است.
  • در صورتی که route معرفی شده، نباید محتوای HTML بدهد یا در قالب پیش فرض دروپال نمایش داده شود، از کلید _controller استفاده می کنیم.
  • در سیستم جدید می توان از چند امکان کنترل دسترسی به صورت همزمان برای یک route استفاده کرد.
  • هوک منو را در دروپال 8 نداریم. هوک دیگری داشتیم به نام hook_menu_alter که در ماژول خودمان برای ایجاد تغییر در مسیر هایی که قبلا ثبت شده آن را پیاده سازی می کردیم. حالا این هوک را هم نداریم ولی برای انجام مسئولیتی که داشت از روشهای دیگری مثل ثبت RouteSubscriber می توانیم استفاده کنیم.

در این مقاله از ساختار و محتوای مستندات سایت دروپال درباره جایگزینی hook_menu با سیستم روتینگ جدید با اندکی تغییر استفاده شده است.

ارسال نظر