web-dev-qa-db-ja.com

プラグイン/ブロックの依存性注入を使用する方法[\ Drupal :: formbuilder()および\ Drupal :: config()]?

私はこの依存性注入理論を理解することができません。以下のメソッドを依存関係の注入に対応させるにはどうすればよいですか?

\Drupal::routeMatch()->getParameter('node');
\Drupal::request();
\Drupal::formBuilder()->getForm('Drupal\enquirycart\Form\EnquiryForm');
\Drupal::config()

これは https://pareview.sh/ で表示したときにこの警告メッセージを修正する必要があるクラスです

「\ Drupal呼び出しはクラスでは避けてください。代わりに| |依存性注入を使用してください」

    class EnquirycartBlock extends BlockBase implements BlockPluginInterface {

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    $default_config = \Drupal::config('enquirycart.settings');

    return [
      'label_display' => FALSE,
      'enquiry_email' => $default_config->get('enquirycart.email'),
    ];

  }

  /**
   * {@inheritdoc}
   */
  public function build() {

    $builtForm = \Drupal::formBuilder()->getForm('Drupal\enquirycart\Form\EnquirycartButtonForm');
    $renderArray['form'] = $builtForm;

    return $renderArray;

  }

  /**
   * {@inheritdoc}
   */
  public function blockForm($form, FormStateInterface $form_state) {
    $form_new = parent::blockForm($form, $form_state);

    return $form_new;

  }
5
danuddara

将来の参考のために、@ Kevinによるリンクから:

プラグインに依存性注入を使用させるための鍵は、 ContainerFactoryPluginInterface を実装することです。プラグインが作成されると、コードはまずプラグインがこのインターフェースを実装しているかどうかをチェックします。使用する場合は、create()および__construct()パターンを使用します。使用しない場合は、__ construct()パターンのみを使用します。 - Acquiaのレッスン11.4から-依存性注入とプラグイン

以下のサンプルコードは ChromaticMart Matsoo によって記述されています。こちらの記事全体を確認してください: https://chromatichq.com/blog/dependency-injection-drupal-8-plugins 。 @Kevinがコメントですでに述べたように、プラグインでの依存性注入に関する素晴らしい記事です。

ブロック内の依存性注入の例

$container->get('current_user')メソッドのcreate()を介した 'current_user'サービスの注入に注意してください。そこで追加のサービスを渡すことができます。

_<?php

namespace Drupal\heytaco\Plugin\Block;

use Drupal\Core\Session\AccountProxy;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Provides a Hey Taco Results Block
 *
 * @Block(
 *   id = "heytaco_block",
 *   admin_label = @Translation("HeyTaco! Leaderboard"),
 * )
 */
class HeyTacoBlock extends BlockBase implements ContainerFactoryPluginInterface {

  /**
   * @var $account \Drupal\Core\Session\AccountProxyInterface
   */
  protected $account;

  /**
   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
   * @param array $configuration
   * @param string $plugin_id
   * @param mixed $plugin_definition
   *
   * @return static
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->get('current_user')
    );
  }

  /**
   * @param array $configuration
   * @param string $plugin_id
   * @param mixed $plugin_definition
   * @param \Drupal\Core\Session\AccountProxyInterface $account
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, AccountProxyInterface $account) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->account = $account;
  }
_

コントローラでの依存性注入の例

ここでも同じ概念が適用され、$container->get()メソッドのcreate()を介して追加のサービスを渡します。

_<?php

namespace Drupal\heytaco\Controller;

use Drupal\Core\Session\AccountInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Controller\ControllerBase;

/**
 * Controller routines for HeyTaco! block.
 */
class HeyTacoController extends ControllerBase {

  protected $account;

  public function __construct(AccountInterface $account) {
    $this->account = $account;
  }

  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('current_user')
    );
  }
_
12
mvdgun

@kevinのおかげで、このDIを思い通りに機能させることができました。コアサービスを確認したい場合は、以下のリンクをクリックしてください。

すべてのサービスはコアAPIにリストされています https://api.drupal.org/api/drupal/core%21core.services.yml/8.3.x

質問で述べたすべての\ Drupalサービスを使用するサンプルクラスを投稿するだけです。これがあなたのやり方です。

namespace Drupal\enquirycart\Plugin\Block;

use Drupal\Core\Block\BlockBase;
use Drupal\Core\Block\BlockPluginInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Form\FormBuilderInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Drupal\Core\Routing\CurrentRouteMatch;

class EnquirycartBlock extends BlockBase implements BlockPluginInterface, ContainerFactoryPluginInterface {


    /**
     * @var  \Drupal\Core\Form\FormBuilderInterface $formbuilder
     */
    protected $formbuilder;

    protected $configfactory;

    protected $routematch;

    protected $requestmatch;

    /**
    * @param array $configuration
    * @param string $plugin_id
    * @param mixed $plugin_definition
    * @param \Drupal\Core\Form\FormBuilderInterface $form_builder
    */
    public function __construct(array $configuration, $plugin_id, $plugin_definition, FormBuilderInterface $form_builder, ConfigFactoryInterface $config_factory, CurrentRouteMatch $route_match, RequestStack $requestdi) {
        parent::__construct($configuration, $plugin_id, $plugin_definition);

        $this->formbuilder = $form_builder;
        $this->configfactory = $config_factory;
        $this->routematch = $route_match;
        $this->requestmatch = $requestdi;
       /*  dpm($this->configfactory->get('enquirycart.settings'));     
         dpm($this->routematch->getParameter('node')->getTitle()); 
         dpm($this->requestmatch->getCurrentRequest()->getSession()->get('enquire'));*/
    }

   /**
   * {@inheritdoc}
   */
    public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
       return new static(
            $configuration,
            $plugin_id,
            $plugin_definition,
            $container->get('form_builder'),
            $container->get('config.factory'),
            $container->get('current_route_match'),
            $container->get('request_stack')   
          );
    }


}
1
danuddara