إنشاء خدمات مخصصة في Drupal 8: دليل شامل
الحقن المعتمد هو نمط تصميم أساسي في Drupal 8 يعزز إعادة استخدام الكود وقابليته للصيانة. من خلال فصل الوظائف، يمكننا كتابة كود أكثر كفاءة يسهل اختباره وصيانته. دعونا نستكشف كيفية تنفيذ الخدمات المخصصة باستخدام الحقن المعتمد.
الخدمات الأساسية في Drupal 8
تم تعريف الخدمات الأساسية لـ Drupal في ملف `core.services.yml`. فيما يلي مثال على كيفية إعلان خدمة أساسية:
services:
path.current:
class: Drupal\Core\Path\CurrentPathStack
arguments: ['@request_stack']
يتضمن هذا الإعلان ثلاثة عناصر رئيسية:
- اسم الخدمة (`path.current`)
- الفئة المنفذة
- الاعتمادات المطلوبة (تمرير كمعاملات)
لاستخدام هذه الخدمة في سياق ثابت:
// ملاحظة: يجب تجنب استدعاءات الخدمة الثابتة عندما يكون ذلك ممكنًا
$currentPath = \Drupal::service('path.current');
$path = $currentPath->getPath();
إنشاء خدمة مخصصة
دعونا ننشئ خدمة مخصصة في وحدة تسمى "mymodule". أولاً، قم بإنشاء ملف يُسمى `mymodule.services.yml` في دليل الوحدة الجذري:
services:
mymodule.tools:
class: Drupal\mymodule\MyTools
arguments: ['@database']
الآن، دعونا ننفذ فئة الخدمة (`MyTools.php`) في الدليل `src`:
namespace Drupal\mymodule;
use Drupal\Core\Database\Connection;
/**
* يوفر وظائف مساعدة للعمل مع العقد.
*/
class MyTools {
/**
* اتصال قاعدة البيانات.
*
* @var \Drupal\Core\Database\Connection
*/
protected $database;
/**
* ينشئ خدمة MyTools جديدة.
*
* @param \Drupal\Core\Database\Connection $connection
* اتصال قاعدة البيانات.
*/
public function __construct(Connection $connection) {
$this->database = $connection;
}
/**
* يسترجع معرف المؤلف للعقدة.
*
* @param int $nid
* معرف العقدة.
*
* @return int|null
* معرف المستخدم لمؤلف العقدة، أو null إذا لم يتم العثور عليه.
*/
public function showAuthor($nid) {
$query = $this->database->select('node_field_data', 'nfd')
->fields('nfd', ['uid'])
->condition('nfd.nid', $nid);
$result = $query->execute()->fetchAll();
return !empty($result) ? $result[0]->uid : NULL;
}
}
الوصول إلى الخدمات المخصصة
هناك طريقتين رئيسيتين للوصول إلى الخدمات:
1. حاوية الخدمة الثابتة (غير موصى بها)
// تجنب هذا النهج في الكود الذي يعتمد على التوجيه الكائني
$toolService = \Drupal::service('mymodule.tools');
$authorId = $toolService->showAuthor(15);
2. الحقن المعتمد (موصى به)
/**
* يوضح الحقن المعتمد بشكل صحيح.
*/
class MyController extends ControllerBase {
/**
* خدمة الأدوات المخصصة.
*
* @var \Drupal\mymodule\MyTools
*/
protected $myTools;
/**
* ينشئ MyController جديدة.
*
* @param \Drupal\mymodule\MyTools $my_tools
* خدمة الأدوات المخصصة.
*/
public function __construct(MyTools $my_tools) {
$this->myTools = $my_tools;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('mymodule.tools')
);
}
/**
* مثال على الطريقة باستخدام الخدمة.
*/
public function exampleMethod($nid) {
$authorId = $this->myTools->showAuthor($nid);
// معالجة $authorId كما هو مطلوب
}
}
أفضل الممارسات
1. استخدم دائمًا الحقن المعتمد في الفئات بدلاً من استدعاءات الخدمة الثابتة
2. قم بتسمية الخدمات بشكل متسق، بدءًا باسم الوحدة الخاصة بك
3. قم بتوثيق فئات الخدمة والأساليب بشكل كامل
4. قم بتضمين تلميحات النوع الصحيحة وإعلانات نوع العودة
5. التعامل مع حالات الخطأ وإرجاع القيم الافتراضية المناسبة
من خلال اتباع هذه الأنماط، ستنشئ كودًا أكثر قابلية للصيانة والاختبار والذي يتكامل بشكل جيد مع بنية حاوية الخدمة في Drupal.
