浏览代码

Fix demoting event not being registered (again) - Complete #331

Bubka 1 年之前
父节点
当前提交
bdfc70732d
共有 2 个文件被更改,包括 15 次插入14 次删除
  1. 8 11
      app/Models/User.php
  2. 7 3
      tests/Feature/Models/UserModelTest.php

+ 8 - 11
app/Models/User.php

@@ -90,18 +90,13 @@ class User extends Authenticatable implements HasLocalePreference, WebAuthnAuthe
     ];
 
     /**
-     * Perform any actions required after the model boots.
+     * User exposed observable events.
      *
-     * @return void
+     * These are extra user-defined events observers may subscribe to.
+     *
+     * @var array
      */
-    protected static function booted()
-    {
-        static::creating(function (User $user) {
-            $user->addObservableEvents([
-                'demoting'
-            ]);
-        });
-    }
+    protected $observables = ['demoting'];
     
     /**
      * Get the user's preferred locale.
@@ -137,7 +132,9 @@ class User extends Authenticatable implements HasLocalePreference, WebAuthnAuthe
      */
     public function promoteToAdministrator(bool $promote = true) : bool
     {
-        if ($promote == false && $this->fireModelEvent('demoting') === false) {
+        $eventResult = $promote ? $this->fireModelEvent('promoting') : $this->fireModelEvent('demoting');
+
+        if ($promote == false && $eventResult === false) {
             return false;
         }
 

+ 7 - 3
tests/Feature/Models/UserModelTest.php

@@ -73,11 +73,15 @@ class UserModelTest extends FeatureTestCase
      */
     public function test_promoteToAdministrator_demote_administrator_status()
     {
-        $user = User::factory()->administrator()->create();
+        $admin = User::factory()->administrator()->create();
+        // We need another admin to prevent demoting event returning false
+        // and blocking the demotion
+        $another_admin = User::factory()->administrator()->create();
 
-        $user->promoteToAdministrator(false);
+        $admin->promoteToAdministrator(false);
+        $admin->save();
 
-        $this->assertEquals($user->isAdministrator(), false);
+        $this->assertFalse($admin->isAdministrator());
     }
 
     /**