كيفية إضافة المزيد من سمات جلسة هوية المستخدم في Yii2؟
سؤال
في Yii2، يمكنك الوصول إلى واجهة الهوية للمستخدم الحالي باستخدام كائنidentInterface من داخل فئة \yii\web\User بشيء مثل هذا
\Yii::$app->user->identity->id;
هل هناك طريقة للحصول على معلمات إضافية وتعيينها (دون توسيع فئة الهوية)؟
في الأساس يعادل Yii 1.x getState()
, ، و setState()
طرق في CWebUser
لتخزين واسترجاع معلومات الجلسة مثل هذا
Yii::app()->user->setState("some_attribute",$value);
Yii::app()->user->getState('some_attribute',$defaultValue);
المحلول
حسنًا، يبدو أن هذا قد تمت إزالته عمدًا لتجنب "الارتباك".يرى https://github.com/yiisoft/yii2/issues/167.لذا فإن الطريقة الوحيدة للقيام بذلك هي استدعاء فئة الجلسة مباشرة.
\Yii::$app->session->set('user.attribute',$value);
\Yii::$app->session->get('user.some_attribute');
نظرًا لأنه تم تخزينه الآن مباشرة في الجلسة بدون بادئة، فمن الأفضل تسمية المفاتيح بمعرفات مثل user.xxxx
لتجنب الاصطدام مع مجموعة مفاتيح أخرى في نقطة مختلفة من التطبيق.
نصائح أخرى
أفضل طريقة لإضافة سمات للمستخدم هي إنشاء سمة عامة في فئة المستخدم الخاصة بك.
class Yiidentity extends ActiveRecord implements \yii\web\IdentityInterface{
public $awesomeAttribute = "foo";
}
كيف تستعمل:
Yii::$app->user->identity->awesomeAttribute;
في يي2 \Yii::$app->user->identity تحتوي على مثيل فئة الهوية.لذلك، إذا كنت تريد بعض البيانات المتعلقة بـidentClass - فما عليك سوى استخدامها مثل مثيل الهوية.
يمكنك أيضًا استخدام أ getter وظيفة لتشمل معلومات هوية إضافية للمستخدم.على سبيل المثال، استرجاع fullname
من جدول الملف الشخصي.
class User extends ActiveRecord implements \yii\web\IdentityInterface
{
// Other code goes here...
public function getFullname()
{
$profile = Profile::find()->where(['user_id'=>$this->id])->one();
if ($profile !==null)
return $profile->fullname;
return false;
}
}
وبعد ذلك، يمكنك استخدامه كما لو كان لديك سمة مسماة fullname
, ، مثل ذلك
Yii::$app->user->identity->fullname;