Dalam modul saya menggunakan kode di bawah ini untuk mendapatkan url alias dari url yang diberikan:
$alias = \Drupal::service('path.alias_manager')->getPathByAlias($_POST['url']);
Tapi yang saya jalankan Ulasan Otomatis ( http://pareview.sh/ ) dalam modul saya, saya mendapatkan peringatan di bawah ini:
16 | PERINGATAN | \ Panggilan Drupal harus dihindari di kelas, gunakan injeksi ketergantungan sebagai gantinya
Bagaimana saya bisa memperbarui kode di atas menggunakan injeksi ketergantungan? Seluruh kode kelas saya diberikan di bawah ini.
<?php
namespace Drupal\my_module\Controller;
use Drupal\Core\Controller\ControllerBase;
/**
* MyModule Class defines ajax callback function.
*/
class MyModule extends ControllerBase {
/**
* Callback function for ajax request.
*/
public function getUserContent() {
$alias = \Drupal::service('path.alias_manager')->getPathByAlias($_POST['url']);
$alias = explode('/', $alias);
$my_module_views = views_embed_view('my_module', 'default', $alias[2]);
$my_module= drupal_render($my_module_views);
return array(
'#name' => 'my_module_content',
'#markup' => '<div class="my_module_content">' . $my_module. '</div>',
);
}
}
8
dependency-injection
ARUN
sumber
sumber
Jawaban:
Ambil
BlockLibraryController
kelas sebagai contoh; itu memperluas kelas yang sama dengan controller Anda.Anda mendefinisikan:
create()
yang mendapatkan nilai dari wadah dependensi, dan membuat objek baru kelas AndaDalam kasus Anda, kode akan serupa dengan yang berikut.
Jangan lupa letakkan
use \Drupal\Core\Path\AliasManagerInterface;
di bagian atas file yang berisi kode yang Anda tampilkan .Sebagai catatan tambahan, kode yang Anda gunakan untuk membuat tampilan salah: Anda tidak perlu menggunakan
drupal_render()
karenaviews_embed_view()
sudah mengembalikan array yang dapat diulang.Kemudian, array render yang Anda kembalikan mungkin tidak memberikan output yang Anda harapkan. #name mungkin tidak akan digunakan dari Drupal, dan #markup menyaring markup yang Anda lewati, seperti yang dijelaskan pada ikhtisar Render API .
sumber
views_embed_view()
dikembalikan.views_embed_view()
yang ditampilkanArray
Untuk menggunakan injeksi dependensi, kelas Anda perlu mengimplementasikan
ContainerInjectionInterface
antarmuka.ContainerInjectionInterface
mengamanatkan bahwa kelas implementasi harus memilikicreate()
metode. Dengan konstruktor kelas tambahan yang menerima dependensi yang disuntikkan,create()
metode mengembalikan instance kelas Anda dengan meneruskan turunan dependensi yang ditentukan ke kelas Anda.Pembaruan: Seharusnya ditunjuk oleh @kiamlaluno yang
ContainerInjectionInterface
tidak diperlukan dalam kasus ini karenaControllerBase
sudah mengimplementasikannya.sumber
ControllerBase
; tidak perlu diterapkanContainerInjectionInterface
karena itu sudah dilakukan dariControllerBase
.Ini adalah cara lain untuk menyelesaikan masalah. https://www.previousnext.com.au/blog/injecting-dependencies-into-drupal-8-plugins
sumber