ในตัวควบคุมคุณฉีดบริการโดยใช้คอนเทนเนอร์ของบริการ ตัวอย่างเช่นModuleHandler
:
namespace Drupal\mymodule\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
class MyController extends ControllerBase {
/**
* The module handler service.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* Constructs a MyController object
*
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* The module handler service.
*/
public function __construct(ModuleHandlerInterface $module_handler) {
$this->moduleHandler = $module_handler;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('module_handler')
);
}
จากนั้นคุณสามารถหลีกเลี่ยงการ\Drupal
โทรโดยใช้บริการที่ถูกฉีด:
$this->moduleHandler->alter('mymodule_myfunction', $plugin_items);
คุณสามารถฉีดบริการใด ๆ ที่มีอยู่จากแกน / contrib หรือบริการที่คุณกำหนดไว้ในรหัสที่กำหนดเองใน*.services.yml
ไฟล์
เพื่อค้นหาชื่อบริการหลักที่ฉันมักจะพิจารณาcore.services.yml
เพราะเป็นวิธีที่เร็วที่สุดเมื่อคุณกำลังทำงานในโครงการ drupal ใน IDE ของคุณ
คุณสามารถใช้Drupal Consoleเพื่อแสดงรายการบริการทั้งหมดไม่เฉพาะจากคอร์:
drupal debug:container
คุณยังสามารถใช้โมดูล Develซึ่งช่วยให้คุณค้นหาชื่อ:
/devel/container/service
create
จะโอเวอร์โหลดวิธีการหลัก - ที่นี่คุณสามารถฉีดบริการที่คุณต้องการ ตัวสร้างจะช่วยให้คุณกำหนดตัวแปรอินสแตนซ์ในชั้นเรียนเพื่อให้คุณสามารถใช้$this->fooInjectedClass->methodName()