shield icon indicating copy to clipboard operation
shield copied to clipboard

Bug: UserModel cannot save an array

Open MGatner opened this issue 3 years ago • 1 comments

PHP Version

8.1.2

CodeIgniter4 Version

4.2.7

Shield Version

develop

Which operating systems have you tested for this bug?

Linux

Which server did you use?

apache

Database

MySQL 8

Did you customize Shield?

No

What happened?

Calling model(UserModel::class)->save() with a array representing an existing user causes $tempUser to be null: https://github.com/codeigniter4/shield/blob/f4cdfb672b600a032a6f0bfc0b7735411bee0cae/src/Models/UserModel.php#L250

Which makes the call to saveEmailIdentity() fail: https://github.com/codeigniter4/shield/blob/f4cdfb672b600a032a6f0bfc0b7735411bee0cae/src/Models/UserModel.php#L261

Steps to Reproduce

This is obviously contrived but should cause the error:

$user = fake(UserModel::class);
$user->email = '[email protected]';

model(UserModel::class)->save($user->toArray());

Expected Output

No exception

Anything else?

Trace:

1) Tests\Integration\UserShieldTest::testSave
Error: Call to a member function saveEmailIdentity() on null

vendor/codeigniter4/shield/src/Models/UserModel.php:261
vendor/codeigniter4/framework/system/BaseModel.php:656
vendor/codeigniter4/shield/src/Models/UserModel.php:284

MGatner avatar Oct 08 '22 20:10 MGatner

The code in Steps to Reproduce runs without errors. So I can't write test code, but the fix is the following:

--- a/src/Models/UserModel.php
+++ b/src/Models/UserModel.php
@@ -253,6 +253,10 @@ public function update($id = null, $data = null): bool
             /** @throws DataException */
             $result = parent::update($id, $data);
         } catch (DataException $e) {
+            if ($this->tempUser === null) {
+                return true;
+            }
+
             $messages = [
                 lang('Database.emptyDataset', ['update']),
             ];

kenjis avatar Oct 09 '22 00:10 kenjis