سؤال

انا املك User يتم وضع الكائن الذي، عند المصادقة الناجحة، في الجلسة (معلومات أمان SANS) لسهولة التذكير ولتحديد ما إذا كان لدينا مستخدم مصادق أو جلسة مجهولة. هناك العديد من المسارات التي يمكن للمستخدم بها تغيير بعضها أو كل معلوماته، وأرغب في إبقاء قيمة الجلسة حتى الآن. الجواب الواضح هو تحديث القيمة في afterSave() رد الاتصال، ولكن ذلك، بالطبع، ينتهك MVC.

هل هناك طريقة أخرى للالتقاط كل تغيير في مكان واحد بحيث لا بد لي من إسقاط الجلسة يكتب في كل مكان؟ لا أستطيع التفكير في أي شيء، ولم أتمكن من العثور على أي أفكار أخرى. هل أنا الشخص الوحيد الذي يحاول فعل شيء مثل هذا؟

شكرا.

حل نهائي: حددت استجابة Neilcrookes "كإجابة، بصراحة، لأنه لا يبدو أن هناك أفضل طريقة. نظرا لأن هذه الطريقة تنتهك حواس My OCD، فقد أخذت مسارا مختلفا قليلا. قررت أن يكون لدي User::authenticate() طريقة إرجاع كائن المستخدم المصادق عليه إلى المتصل حتى يتمكن من فعل ما تريده. أحد الأشياء التي يقوم بها المتصلون "يريدون" القيام به هو إسقاط هذه القيمة في الجلسة. إنه التكرار، لكنه محدود للغاية للغاية. في ذهني، شعرت بأنه أفضل من الوصول إلى الجلسة من النموذج (على الرغم من أنه من المؤكد أنه ملعون إذا فعلت، ملعونا إذا كنت لا سيناريو).

هل كانت مفيدة؟

المحلول

قد يختلف البعض لكنني برغي MVC، افعل ذلك في النموذج :: AfterSave () واستخدم $ _session - اختبار للجلسة قبل الكتابة إليها، في حالة عدم بدء تشغيلها على سبيل المثال، تقوم بحفظ النموذج في قذيفة أو شيئا ما.

MVC هو نمط عام - وهو مبدأ توجيهي، يمكنك نشر رأسك ضدها في محاولة لمعرفة كيفية تحقيق شيء لا يناسب تماما، أو مجرد طريقة أخرى والانتقال إلى شيء أكثر أهمية.

جلب النيران.

نصائح أخرى

//in users controller 
if ($this->User->save()) {
    $this->Auth->login($this->User->read());
    $this->Session->setFlash[.. etc]

وبالنسبة للسجل، لا أتفق مع إجابة Neilcrooks، لكنني أمتنان عن إطعام القزم.

بعد حفظ

استخدام مثل هذا

$this->Session->write('Auth.User.mmid', $kinde['Kindle']['id']);

يجب أن تكون قادرا على استخدام فقط AppController لإنشاء رد الاتصال الضروري الذي يحتفظ ببيانات جلسة العمل حتى الآن. لذلك، على سبيل المثال، يمكن أن يكون لديك User نموذج afterSave() تعيين خاصية تسمى changed إلى true. ثم في الخاص بك AppController->afterFilter() يمكنك التحقق من هذه الخاصية وتحديث بيانات الجلسة حسب الضرورة.

بدلا من ذلك، يمكنك كتابة مكون من خلال تحديث معلومات المستخدم الخاصة بك وكذلك بيانات الجلسة الخاصة بك. ثم يحتاج أي وحدة تحكم تحتاج إلى تغيير معلومات المستخدم فقط إلى تضمين هذا المكون.

ليست هناك حاجة لكتابة رمز زائدة أو كسر MVC.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top