\ Drupal :: moduleHandler () üzerinde bir Controller'a bağımlılık enjeksiyonunu nasıl kullanabilirim?


15

Bir denetleyici sınıfında aşağıdaki satırı kullanıyorum.

    \Drupal::moduleHandler()->alter('mymodule_myfunction', $plugin_items);

Pareview.sh bana bu hata iletisini veriyor.

\ Sınıflarda Drupal çağrılarından kaçınılmalı, bunun yerine bağımlılık enjeksiyonu kullanılmalıdır.

Bunu nasıl başarmalıyım? Bir kurucu, yöntem veya hizmet oluşturmam gerekiyor mu? Eğer öyleyse, hizmetin hangi koda ihtiyacı vardır? Bir hizmetin zaten mevcut olduğu bir durumda "Sınıflarda Drupal çağrılarından kaçınılmalı, bunun yerine bağımlılık enjeksiyonu kullan" konusunda bir örnek buldum .


createüst yöntemi aşırı yükleyecektir - burada ihtiyacınız olan hizmetleri enjekte edebilirsiniz. Yapıcı daha sonra bunları sınıftaki örnek değişkenlere atamanıza izin verir, böylece kullanabilirsiniz$this->fooInjectedClass->methodName()
Kevin

Bu konuda zaten bir sorumuz var mı? Değilse, bunu gerçekten bir kanonik yapmalıyız.
mpdonadio

Yanıtlar:


21

Bir kontrolörde servis kabını kullanarak servis enjekte edersiniz. Örneğin 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')
    );  
  }

Ardından \Drupal, enjekte edilen hizmeti kullanarak aramalardan kaçınabilirsiniz :

$this->moduleHandler->alter('mymodule_myfunction', $plugin_items);

Herhangi bir hizmeti, çekirdek / katkıda bulunan mevcut hizmetleri veya özel kodda tanımladığınız hizmetleri bir *.services.ymldosyaya enjekte edebilirsiniz .

Genel olarak baktığım temel hizmet adını bulmak için core.services.yml, çünkü IDE'nizde bir drupal proje üzerinde çalışırken en hızlı yol budur.

Drupal Console'u sadece temelden değil tüm hizmetleri listelemek için kullanabilirsiniz :

drupal debug:container

Bir ad aramanıza izin veren Devel modülünü de kullanabilirsiniz :

/devel/container/service

1
Bu tür bir soru / cevap, kabul ettiğimde genişletilmeli ve drupal.org belgelerine katkıda bulunmalıdır. Orada bazı orada, ama bu her zaman yardım gibi gerçek dünya örnekleri hissediyorum.
Kevin

4
ControllerBaseSınıf zaten uygulayan ContainerInjectionInterfacebir arayüz. Genişleyen implements ContainerInjectionInterfacebir sınıfa eklemeye gerek yoktur ControllerBase.
kiamlaluno

Doğru, @kiamlaluno ile aynı şeyi fark ettim; cevabı güncellemek büyük olurdu!
Stefanos Petrakis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.