Saya menggunakan baris berikut di kelas controller.
\Drupal::moduleHandler()->alter('mymodule_myfunction', $plugin_items);
Pareview.sh memberi saya pesan kesalahan ini.
\ Panggilan Drupal harus dihindari di kelas, gunakan injeksi ketergantungan sebagai gantinya.
Bagaimana saya harus mencapai ini? Apakah saya perlu membuat konstruktor, membuat metode, atau layanan? Jika demikian, kode apa yang harus layanan butuhkan? Saya menemukan contoh pada "Panggilan Drupal harus dihindari di kelas, gunakan injeksi ketergantungan sebagai gantinya" untuk kasus di mana layanan sudah ada.
8
services
dependency-injection
Kevin Nowaczyk
sumber
sumber
create
akan membebani metode induk - di sini Anda dapat menyuntikkan layanan yang Anda butuhkan. Konstruktor kemudian akan membiarkan Anda menetapkan mereka ke variabel instan di kelas, sehingga Anda dapat menggunakan$this->fooInjectedClass->methodName()
Jawaban:
Dalam pengontrol Anda menyuntikkan layanan dengan menggunakan wadah layanan. Sebagai contoh
ModuleHandler
:Maka Anda dapat menghindari
\Drupal
panggilan dengan menggunakan layanan yang disuntikkan:Anda dapat menyuntikkan layanan apa pun, yang ada dari inti / contrib atau layanan yang Anda tetapkan dalam kode khusus dalam
*.services.yml
file.Untuk menemukan nama layanan inti yang biasa saya lihat
core.services.yml
, karena itulah cara tercepat ketika Anda mengerjakan proyek drupal di IDE Anda.Anda dapat menggunakan Konsol Drupal untuk mendaftar semua layanan, tidak hanya dari inti:
Anda juga dapat menggunakan modul Devel , yang memungkinkan Anda mencari nama:
sumber
ControllerBase
kelas sudah mengimplementasikanContainerInjectionInterface
interface. Tidak perlu menambahkanimplements ContainerInjectionInterface
ke kelas yang diperluasControllerBase
.