Global değişkene erişmekten kaçınan geçerli kullanıcı nesnesini elde etmek için bir işlev var mı?


29

Her zaman bununla gittim global $user;. Bununla birlikte, geçerli kullanıcı nesnesini global kullanmadan döndüren katkıda bulunan bir modülde bir şey gördüğümü hatırlıyor gibiyim $user.

Böyle bir işlev Drupal 7 çekirdeğinde var mı, yoksa mevcut kullanıcı nesnesini elde etmek için fiilen önerilen şekilde global değişkeni kullanıyor mu?


neden sadece global $ kullanıcısını kullanmıyorsun?
saadlulu

5
Global $ kullanıcısını kullanmak, daha sonra kodda dikkatsizce değiştirilirse, olası istenmeyen davranışlara neden olabilir.
Alex Weber

Yanıtlar:


22

Kullanabileceğiniz işlev user_uid_optional_load () ; bağımsız değişkenler olmadan, oturum açmış olan kullanıcı için kullanıcı nesnesini döndürür. Yine de global kullanır $userve tüm nesneyi kullanıcılarla ilişkili alanlar da dahil olmak üzere veritabanından yükler, ancak kodunuzdan kaynaklanmadığından, kodunuzun genel değişkenin içeriğini yanlışlıkla değiştirmesini önler $user.

function user_uid_optional_load($uid = NULL) {
  if (!isset($uid)) {
    $uid = $GLOBALS['user']->uid;
  }
  return user_load($uid);
}

Eğer tam nesneye ihtiyacınız yoksa, diğer cevaplarda daha önce bildirilmiş olan kodu kullanabilirsiniz. Genel nesneyi değiştirmediğinizden emin olmak istiyorsanız, genel değişkeni aşağıdaki snippet'te olduğu gibi yerel bir değişkene kopyalayabilirsiniz.

$account = $GLOBALS['user'];
// Use $account.

Drupal 8'de, \Drupal::currentUser()Drupal 7'nin eşdeğerini elde etmek $GLOBALS['user']ve \Drupal\user\Entity\User::load(\Drupal::currentUser()->id())tüm alan API alanları ile tam olarak yüklenmiş bir nesne elde etmek için statik yöntemi kullanmanız yeterlidir . Artık tüm sonuçları içeren küresel bir değişkeni geçersiz kılma riski yoktur.
Geçerli kullanıcıyı, örneğin isimsiz bir kullanıcıyla değiştirmeniz gerekirse, Drupal 8'de kullandığınız kod aşağıdaki gibidir.

$accountSwitcher = Drupal::service('account_switcher');
$accountSwitcher->switchTo(new Drupal\Core\Session\AnonymousUserSession());

// Your code here.

// Eventually, restore the user account.
$accountSwitcher->switchBack();

20

$userNesne ya da kullanmak için gerekmez erişmek istediğiniz eğer öyleyse, küresel değişken olarak tanımlanır:

global $user;
$account = $user;

veya

$account = $GLOBALS['user'];

Bunu aslında Drupal'da yapmanın standart bir yolu yok gibi görünüyor. Örneğin düğüm modülüne bakarsanız, node_access_grants()işlev bu kodu kullanır:

if (!isset($account)) {
  $account = $GLOBALS['user'];
}

Oysa dosyadaki bir sonraki fonksiyon node_access_view_all_nodes(), bunu kullanır:

global $user;
if (!$account) {
  $account = $user;
}

Basit cevap, her ikisinin de geçerli olduğudur. Bence kullanımı, $GLOBALSadlandırılan değişkenin $usermevcut kapsamda aktif olmaması ve bu nedenle örneğin $user = NULLfonksiyonun devamında yapılan dikkatsiz bir çağrı ile üzerine yazılmamasıdır . Buna rağmen% 100 değilim.


Son ifadesinde bildiğim ve anladığım şey bu.
saadlulu

1
global $user;değişken bir kereden fazla kullanıldığında genellikle kullanılmalı $GLOBALS['user']ve işlev kodunda yalnızca bir kez kullanıldığında kullanılmalıdır; Drupal kodu bunun içinde sabit değildir. global $user;Gerekli olan bir durum var : drupal_alter()üçüncü taraf modüllerin şu anda aktif olan kullanıcıyı değiştirmesine izin vermek için kullanıcı nesnesi geçirildiğinde (bu aslında Drupal'da uygulanmayan bir şey).
kiamlaluno

1
global $useruser_uid_optional_load () ile aynı şey değildir. Birincisi oturumdan yüklenir ve ikincisi ise tam yüklü bir kullanıcı nesnesi değildir (alanlar ve kancalar çağrılır). Bu yüzden bunu bir seçenek olarak listelemem. Bu işlevin amacı, isteğe bağlı olarak bir kullanıcı kimliğini kabul edebilen ve geçerli kullanıcı için varsayılan olan adlandırılmış menü argümanları için kullanılır. / user / uid birincil örnektir.
Berdir

@Berdir Teşekkürler global $user, varsayılan olarak tam olarak yüklenmediğini bilmiyordum (daha önce merak ettim ve daha önce merak ettiğim bazı şeyleri açıklasa da ). Cevaptan çıkardım.
Clive

Teşekkürler Clive, global $ kullanıcısını kullanarak ve onu $ hesap değişkenine kopyalamak muhtemelen en güvenli alternatiftir. Aslında gerçekte user_uid_optional_load () 'ı arıyordum :)
Alex Weber

3

İşleviniz kapsamında (var olan) global $ kullanıcı nesnesini bildirmek kadar basittir:

global $user;

Bu nesnede yapılan değişikliklerin onu küresel olarak etkilediğini unutmayın.

global $user;
$user->uid = 1;

şimdiki kullanıcıya kullanıcı kimliği 1 ayrıcalıkları verdi. Bu nedenle, genellikle $ kullanıcısı $ hesabına atanır, böylece oturum açmış olan kullanıcıyı gerçekten etkilemeden verileri (örneğin elbette istemiyorsanız) etkilemeksizin düzeltilebilir.

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.