web-dev-qa-db-fra.com

Comment charger l'objet utilisateur?

J'ai besoin d'obtenir l'objet global $user Dans Drupal 8. J'ai fait $account = \Drupal::currentUser(); dans la définition de getSubscribedEvents() (une méthode statique) à l'intérieur d'un fichier de classe.

J'obtiens l'erreur suivante lors de l'exécution de drush cr:

exception
[erreur] 'Drupal\Core\DependencyInjection\ContainerNotInitializedException' avec le message '\ Drupal :: $ container n'est pas encore initialisé.\Drupal :: setContainer () doit être appelé avec un vrai conteneur. ' dans /Applications/MAMP/htdocs/drupal-8.0.x-dev/core/lib/Drupal.php:129

Qu'est-ce qui ne va pas dans mon code?

5
neha

Voici tout mon morceau de code qui fonctionne bien maintenant:

À l'intérieur de mon_module.service.yml

services:
  myModule.event_subscriber:
    class: Drupal\my_module\EventSubscriber\MymoduleSubscriber

    tags:
      - {name: event_subscriber}

Inside MymoduleSubscriber.php

<?php

namespace Drupal\my_module\EventSubscriber;

use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class myModule implements EventSubscriberInterface {



  public function xyz(GetResponseEvent $event) {
    $user_id = $this->accountProxy->id();
    if($user_id) {
    }
  }
  /**
   * {@inheritdoc}
   */
  static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = array('xyz');
    return $events;

  }

  public function __construct() {
    $user = \Drupal::currentUser();
    $this->accountProxy = $user;
  }

}
2
neha

Vous ne pouvez pas obtenir l'utilisateur actuel dans getSubscribedEvents ()

Ce n'est ni possible ni nécessaire. Il n'y a pas de conteneur à ce stade.

La seule chose que vous pouvez y faire est de renvoyer une liste des événements auxquels vous souhaitez vous inscrire. Ces informations sont ensuite stockées dans le conteneur compilé et doivent être identiques pour toutes les requêtes, elles ne doivent pas être conditionnelles.

Toute logique doit être à l'intérieur des méthodes que vous y enregistrez.

10
Berdir

Puisque vous utilisez une méthode statique getSubscribedEvents(), je comprends que vous implémentez un abonné aux événements. Dans ce cas, vous n'accédez pas à \Drupal::currentUser() (et à toute méthode statique renvoyant un service que \Drupal Expose) dans cette méthode car elle serait appelée trop tôt, lorsque Drupal n'a pas encore initialisé le conteneur de dépendances.
Cette méthode statique est censée renvoyer un tableau statique décrivant les événements auxquels le module souhaite s'abonner; les méthodes utilisées pour s'abonner aux événements prendront éventuellement une action différente en fonction de l'utilisateur actuellement connecté et des autorisations utilisateur dont dispose le compte utilisateur.

Les abonnés aux événements sont des services, et en tant que tels, ils reçoivent leur dépendance injectée. Au lieu d'utiliser \Drupal::currentUser(), vous définissez @current_user comme l'un des arguments de votre service, ce que fait le service authentication_subscriber .

class: Drupal\Core\EventSubscriber\AuthenticationSubscriber
arguments:
  - '@authentication'
  - '@current_user'
tags:
  - { name: event_subscriber }

Si vous regardez AuthenticationSubscriber::__construct() , vous verrez comment il obtient l'objet utilisateur actuel.

public function __construct(AuthenticationProviderInterface $authentication_provider, AccountProxyInterface $account_proxy) {
  $this->authenticationProvider = $authentication_provider;
  $this->filter = ($authentication_provider instanceof AuthenticationProviderFilterInterface) ? $authentication_provider : NULL;
  $this->challengeProvider = ($authentication_provider instanceof AuthenticationProviderChallengeInterface) ? $authentication_provider : NULL;
  $this->accountProxy = $account_proxy;
}

Dans votre cas, j'utiliserais le code suivant.

mymodule.services.yml

services:
  mymodule.eventsubscriber:
    class: Drupal\mymodule\EventSubscriber\MyModuleSubscriber
    arguments:
      - '@current_user'
    tags:
      - { name: event_subscriber }

src/EventSubscriber/MyModuleSubscriber.php

namespace Drupal\mymodule\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class MymoduleSubscriber implements EventSubscriberInterface {

  /**
   * {@inheritdoc}
   */
  static function getSubscribedEvents() {
    // Return the array describing the events to which you subscribe.
  }

  public function __construct(AccountProxyInterface $account_proxy) {
    $this->accountProxy = $account_proxy;
  }

}

Notez que @current_user est une instance de AccountProxyInterface , donc par exemple, vous pouvez vérifier que l'utilisateur dispose de certaines autorisations utilisateur avec $this->accountProxy->hasPermission().

9
kiamlaluno

Vous devez utiliser l'espace de noms pour charger l'objet utilisateur actuel.

// Load the current user.
$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());

// get field data from that user

$email = $user->get('mail')->value;
$name = $user->get('name')->value;
2
Sanjay