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.