Kullanıcı alanlarına erişilsin mi?


18

$account = \Drupal::currentUser()kullanıcı nesnesini içine yükler $account, ancak kullanıcı nesnesinde oluşturduğum özel alanlara nasıl erişebilirim (yönetici kullanıcı arayüzü üzerinden)?

İle dpm($account)özel alanlarımı göremiyorum.


Özel alanların henüz değeri yok mu? Gerçekte bir değer ayarlanana kadar varlık nesnesinden eksik olduklarını hatırlarlar.
— Clive

Evet, değerleri var. Uid ile alabilir \Drupal::currentUser()->id()ve sonra bir veritabanı sorgusu yapabilir, ancak D7 zaten nesnenin üzerinde vardı?
— 24ma13wg

Bu sorun sadece kuş üzümü kullanıcısı değil; genellikle kullanıcı nesnesiyle ilgilidir. api.drupal.org/api/drupal/... yarım orada alır, ancak genellikle Drupal Dokümanlar ile olduğu gibi, bu karanlıkta daha hala bırakır
— sea26.2

Yanıtlar:


29

\Drupal::currentUser()bir Drupal\Core\Session\AccountInterfacenesneyi döndürür . Bu tam bir kullanıcı olabilir (a olurdu Drupal\user\UserInterface), ancak şu anda varsayılan kimlik doğrulama yöntemi için değil.

Kullanıcı varlığını ve tüm alanları elde etmek için bunu kullanın:

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

D7 tam olarak aynı davranışa sahipti, şimdi fark sadece D7'de sadece farklı stdClass'es, şimdi ikisini farklılaştırmak için açık arayüzlere sahip olmanız.


Aşağı oylamaya rağmen, bu cevap doğrudur, Drupal 7 hakkında bile. Drupal 7'de $GLOBALS['user']tam yüklü bir kullanıcı nesnesi içermez; yalnızca kullanıcılar tablosunda bulunan bilgileri içerir.
— kiamlaluno

Evet, bunun neden bir indirgendiğinden emin değilim. Hem D7 hem de D8 hakkında doğrudur.
— mpdonadio

Bu sadece cevabın bir parçası. Ve aslında, verilere orijinal "çözüm" den daha yakın değil. Verileri nesneden "almanız" gerekir. Bunu yapmak için aşağıdaki @batigolix tarafından yayınlanan çalışma çözümüne bakın.
— sea26.2

Değeri olmayan alanların değerler dizisinde görünmeyeceğini unutmayın.
— JAyenGreen

16

Ve işte bu nesneden nasıl çıkarılacağı:

// 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;

// Some default getters include.
$email = $user->get('mail')->value;
$name = $user->get('name')->value;
$uid= $user->get('uid')->value;

1
İle kullanıcı kimliğini alırsınız $user->id().
— kiamlaluno

Ayrıca, Kullanıcı varlığının bir gövde tabanı alanı yoktur. Bu, kullanıcı arayüzünden eklenen bir alansa alan adı field_ ile başlar . Kullanıcıların Drupal çekirdek kodundan eklenen bir temel alan olduğunu düşünmesini sağladığı için bu örneği kullanmam.
— kiamlaluno

1

Drupal::currentUser()bir nesne uygulamasını döndürür Drupal\Core\Session\AccountProxyInterface. Bu, User::load()bir nesnenin uygulandığı, geri döndüğünden farklıdır Drupal\user\UserInterface.

Bu User, alanları yüklü olarak tam bir nesne aldığınızdan emin olmadığı anlamına gelir , ancak bir Usernesne aldığınızdan bile emin değildir . Sonuç olarak, Usersınıftan kullanılabilen bazı yöntemleri çağırın User::get(). AccountInterface::id()Kullanıcı kimliğini döndüren arayabilirsiniz ; bununla, tam Usernesneyi yükleyebilir User::load()ve varlığa bağlı tüm alan modüllerine erişebilirsiniz.

use Drupal\Core\Session\AccountProxyInterface;
use Drupal\user\Entity\User;

$account = User::load(\Drupal::currentUser()->id());

İle $accountbir kullanıcı hesabıyla ilişkili tüm alanlara erişebilirsiniz.


Belki de, yine de şu soruyu sorar: "ÖZEL alanlara nasıl erişirsiniz". Yukarıdaki cevaba bakınız @batigolix
— sea26.2

Soru daha fazla Neden $account = \Drupal::currentUser(): dpm($account);herhangi bir özel alan gösterilmiyor? ancak bu cevap kullanıcı varlık alanlarına nasıl erişileceğini açıklar. Soru OP'nin hangi alanlara erişmeye çalıştığını söylemediğinden, cevap sadece hangi yöntemi kullanacağını söylüyor. @Batigolix tarafından verilen yanıt yok.
— kiamlaluno

-2

İşte API işlevini kullanan bir astar:

$account = \Drupal::currentUser()->getAccount();

Bundan sonra kullanıcı alanlarına erişilebilecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.