it-swarm.com.de

Holen Sie sich aktuell angemeldeten Benutzer

Ich stehe vor einem fast ähnlichen Problem: Wenn ich Folgendes tue:

$userCurrent = \Drupal::currentUser();
$name = $userCurrent->getUsername(); 

Ich erhalte den Namen des Site-Kontos anstelle des angemeldeten Benutzers. Welches ist der richtige Weg, um den angemeldeten Benutzernamen oder die angemeldeten Rollen zu erhalten. Ich habe sogar versucht:

$user = Drupal\user\Entity\User::load($userCurrent->id());

Aber das alles scheint nicht zu funktionieren.

Irgendwelche Vorschläge?

5
john

Versuche dies

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

// get field data from that user
$website = $user->get('field_website')->value;
$body = $user->get('body')->value;


$email = $user->get('mail')->value;
$name = $user->get('name')->value;
$uid= $user->get('uid')->value;
?>

Oder

$uid = \Drupal::currentUser()->id();
$user = \Drupal\user\Entity\User::load($uid);
$name = $user->getUsername();

Sie erhalten weitere Details zu ser :: getUsername .

7
DRUPWAY

Wenn Sie den Namen des Site-Kontos anstelle des angemeldeten Benutzers erhalten, ist zum Zeitpunkt der Ausführung des Codes kein Benutzer angemeldet.

\Drupal::currentUser() erhält einen Account. Dies kann ein Benutzer oder eine anonyme Sitzung sein. Beide haben dieselbe Schnittstelle und dieselben Methoden.

Ihr Code ist in Ordnung. Warum Sie das falsche Konto erhalten, ist schwer zu sagen, da die Frage nicht genügend Details enthält. Es könnte ein Caching-Problem sein. Dann müssten Sie einen Cache-Kontext für den Benutzer hinzufügen.

3
4k4

Könnte es sein, dass Sie vor dem Versuch, den Benutzernamen für den aktuellen Benutzer zu erhalten, zunächst prüfen sollten, ob der Benutzer ein authentifizierter Benutzer ist, z.

    $userCurrent = \Drupal::currentUser();
    if ($userCurrent->isAuthenticated()) {
        $name = $userCurrent->getAccountName();
    }
    else{
        $name = "Anonymous/Unauthenticated User";
    }
1
Mo-ster

Sie können den Benutzernamen und die E-Mail-Adresse des aktuell angemeldeten Benutzers wie folgt abrufen:

function tropical_preprocess_page(&$variables){
   # gets current username
   $user_logged_in_name = $variables['user']->getDisplayName();

   # Capitalize first letter
   $variables['user_logged_in_name'] = ucfirst($user_logged_in_name);


  # gets User Email
  $user_email = $variables['user']->getEmail();
  $variables['user_email'] = $user_email;
}

Sie können die Ergebnisse im HTML wie folgt ausgeben:

<h2>Welcome back, {{ user_logged_in }}!</h2>
<p>The email for this user is: <strong>{{ user_email }}<strong></p>

Ich bin mir nicht sicher, ob Sie das wollen. Ich hoffe, es hilft...

0
Manuel Abascal

Diese Frage hängt davon ab, wo Sie versuchen, auf diese Informationen zuzugreifen.

Die Abhängigkeitsinjektion ist der ideale Weg, um drupal -Dienste) aufzurufen.

Oft können Sie zu core ([webroot]/core/lib/core) gehen und sich core.services.yml ansehen. In dieser Datei werden Tonnen von Diensten verwendet, was sie zu einem hervorragenden Bezugspunkt macht.

Wenn Sie beispielsweise den aktuellen Benutzer möchten, suchen Sie nach "Benutzer" und suchen Sie nach "@ [Dienstname] -Definitionen". In diesem Fall finden Sie einen '@current_user'.

Dies bedeutet, dass ein Dienst mit diesem Namen vorhanden ist. Dieser Dienst ist zufällig auch in dieser Datei definiert. Weiter unten finden Sie die Service-Definition 'current_user:'.

current_user:
  class: Drupal\Core\Session\AccountProxy
  arguments: ['@event_dispatcher']

Darin können Sie sehen, welche Klasse aufgerufen wird. Wenn Sie diesen Dienst einfügen oder den aktuellen Benutzer über \Drupal::currentUser() aufrufen, ist dies die Klasse, die er aufruft.

Sie können diese Klasse dann öffnen, um zu sehen, was zur Verwendung verfügbar ist.

Wenn Sie ein benutzerdefiniertes Modul schreiben, fügen Sie eine Datei [module_name] .services.yml hinzu, definieren den Dienstnamen Ihres Moduls und fügen dann den Dienst @current_user ein.

Dies bedeutet, dass Sie Ihre @ service-Werte zum Argumentarray der durch Kommas getrennten Werte hinzufügen.

Zum Beispiel:

services:
  commerce_custom_shipping_carts:
    class: '\Drupal\commerce_custom_shipping_carts\EventSubscriber\CommerceCustomShippingCartsEventSubscriber'
    arguments: ['@messenger', '@string_translation', '@current_user']
    tags:
      - { name: 'event_subscriber' }

Übergeben Sie dann in Ihrem Klassenkonstruktor den Dienst:

   * Messenger Interface.
   *
   * @var \Drupal\Core\Messenger\MessengerInterface
   */
  protected $messenger;

  /**
   * String Translation Interface.
   *
   * @var \Drupal\Core\StringTranslation\TranslationInterface
   */
  protected $stringTranslation;

  /**
   * Current user session.
   *
   * @var \Drupal\Core\Session\AccountProxy
   */
  protected $currentUserSession;

  /**
   * Constructs a new CartEventSubscriber object.
   *
   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
   *   The messenger.
   * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
   *   The string translation.
   * @param \Drupal\Core\Session\AccountProxy $currentUserSession
   *   The current user session.
   */
  public function __construct(MessengerInterface $messenger, TranslationInterface $string_translation, AccountProxy $currentUserSession) {
    $this->messenger = $messenger;
    $this->stringTranslation = $stringTranslation;
    $this->currentUserSession = $currentUserSession;
  }

Dann können Sie alles in der Klasse verwenden mit: $this->currentUserSession->[method_name]([method_parameters]);

0
KazaJhodo