你在这里

在表单上应用依赖注入

原文链接:https://www.drupal.org/node/2203931

依赖于Drupal服务或者自定义服务的表单应该通过依赖注入来访问该服务。

如一个表单(与Form API in Drupal 8 中的类似)使用'current_user'服务来获取当前用户的uid。假设模块名的modules/example,那么文件 /modules/example/lib/Drupal/example/Form/ExampleForm.php 内容:

<?php
/**
* @file
* Contains \Drupal\example\Form\ExampleForm.
*/
namespace Drupal\example\Form;
use Drupal\Core\Form\FormBase;
/**
* Implements an example form.
*/
class ExampleForm extends FormBase {
  /**
   * @var AccountInterface $account
   */
  protected $account;
  /**
   * Class constructor.
   */
  public function __construct(AccountInterface $account) {
    $this->account = $account;
  }
  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    // Instantiates this form class.
    return new static(
      // Load the service required to construct this class.
      $container->get('current_user')
    );
  }
  /**
   * {@inheritdoc}.
   */
  public function getFormID() {
    return 'example_form';
  }
  /**
   * {@inheritdoc}.
   */
  public function buildForm(array $form, array &$form_state) {
    // Get current user data.
    $uid = $this->account->id();
    // ...
  }
  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, array &$form_state) {
    // ...
  }
}
?>

 

create方法是一个返回ExampleFormObject新实例的工厂方法,加载一个或者多个服务。这些服务可以是任何核心服务,在core.services.yml 或者任何 *.services.yml 文件中定义。

ExampleForm::__construct 使用create方法中加载的服务并且保存在类的变量中。ExampleForm::create中加载服务的顺序需要与ExampleForm::__construct中的参数顺序一致。

create方法位于Drupal\Core\DependencyInjection\ContainerInjectionInterface中,允许控制器使用服务来初始化。Drupal\Core\Form\BaseForm已经实现了此接口。其他继承自Drupal\Core\Form\BaseForm的表单可以使用依赖注入,如ConfigFormBase 与 ConfirmFormBase。