動作するコードがありますが、それをクリーンアップして、依存性注入を使用したいと思いました。 ContainerFactoryPluginInterfaceを実装するBlockBaseで作業しています。
class DefaultBlock extends BlockBase implements ContainerFactoryPluginInterface {
ユーザーオブジェクトからいくつかの情報にアクセスする必要があります。現在、Drupal\Core\Session\AccountProxyInterfaceを使用しています。これは問題なく機能しますが、期待していたすべての情報が得られるわけではありません。ユーザーにフィールドを追加するcontribモジュールがあります。 User :: load($ id)を使用すればそのフィールドにアクセスできますが、次の警告が表示されます...
DrupalクラスではUser :: loadの呼び出しを避けてください。代わりに依存性注入を使用してください
だから私はやっています。そして失敗。
このコードは動作します...
$userIdx = \Drupal::currentUser()->id();
$userx = \Drupal\user\Entity\User::load($userIdx);
$countryx = $userx->country_iso_code_2;
しかし、それをクリーンアップして正しい方法で実行すると、country_iso_code_2情報を取得できません。
ここに私が「試して」いるコードがあります...
<?php
namespace Drupal\country_selector\Plugin\Block;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Provides a 'DefaultBlock' block.
*
* @Block(
* id = "default_block",
* admin_label = @Translation("Country switcher"),
* )
*/
class DefaultBlock extends BlockBase implements ContainerFactoryPluginInterface {
protected $account;
/**
* Class constructor.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, AccountProxyInterface $account) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->account = $account;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('current_user')
);
}
/**
* {@inheritdoc}
*/
public function build() {
$build = [];
$userIdx = \Drupal::currentUser()->id();
$userx = \Drupal\user\Entity\User::load($userIdx);
$countryx = $userx->country_iso_code_2;
$userId = $this->account->id();
$country = $this->account->country_iso_code_2;
.....
デバッグすると、次のことがわかります。
$ userxはDrupal\user\Entity\Userです
$ userはDrupal\core\Session\AccountProxyです
だから、私は2つの異なることに取り組んでいると思います。依存関係の注入でUser :: loadのようなものを呼び出す方法がわからないだけです。
私はそれが理にかなっていると思います。いくつかのアドバイスが大好きです!
ユーザーストレージを取得するには、entity_type_manageを使用する必要があります。このようなもの:
<?php
namespace Drupal\country_selector\Plugin\Block;
use Drupal\Core\Session\AccountProxyInterface;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\user\UserStorageInterface;
/**
* Provides a 'DefaultBlock' block.
*
* @Block(
* id = "default_block",
* admin_label = @Translation("Country switcher"),
* )
*/
class DefaultBlock extends BlockBase implements ContainerFactoryPluginInterface {
protected $account;
protected $userStorage;
/**
* Class constructor.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, AccountProxyInterface $account, UserStorageInterface $user_storage) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->account = $account;
$this->userStorage = $user_storage;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('current_user'),
$container->get('entity_type.manager')->getStorage('user')
);
}
/**
* {@inheritdoc}
*/
public function build() {
$build = [];
$userIdx = $this->$acount->id();
$userx = $this->userStorage->load($userIdx);
$countryx = $userx->country_iso_code_2;
.....
お役に立てれば。