phalcon / cphalcon

High performance, full-stack PHP framework delivered as a C extension.
https://phalcon.io
BSD 3-Clause "New" or "Revised" License
10.79k stars 1.96k forks source link

[BUG]: Model setters do not call during hydration #14810

Open jaguarsdv opened 4 years ago

jaguarsdv commented 4 years ago

Questions? Forum: https://phalcon.link/forum or Discord: https://phalcon.link/discord

Describe the bug During hydration using Resultset::HYDRATE_RECORDS mode Models protected/private property values sets like they are public ones instead to be set using setters.

To Reproduce Generate any model that uses setters and getters. At setters throw any kind of exception. Retrieving record by calling Model::findFirst() expected that exception will be thown in setters. But there is no any exception is thrown and we have a Model instance with setted values.

Steps to reproduce the behavior:

class User extends \Phalcon\Mvc\Model
{
    protected $id;

    public function setId($id)
    {
        throw new \Exception('Setter is called');
    }

    public function getId()
    {
        return $this->id;
    }
}

$user = User::findFirst(10);
// Exception is expected but not observed
echo $user->id;  // output: 10

$user = new User;
$user->id = 10;
// Exception is thrown as expected

Also there is another unexpected behaviour. If we override cloneResultMap method and create a new instance of base model and set a value for protected property no exception is thown as expected.

class User extends \Phalcon\Mvc\Model
{
    public static function cloneResultMap (
        $base,
        array $data,
        $columnMap,
        int $dirtyState = 0,
        bool $keepSnapshots = null
    ): \Phalcon\Mvc\ModelInterface
    {
        $class = get_class($base);
        $instance = new $class;
        $instance->id = 10; // the value is set like a public, no exception is thrown

        return $instance;
    }
}

Details Environment: OS: Linux UBT 4.15.0-74-generic #84-Ubuntu SMP Thu Dec 19 08:06:28 UTC 2019 x86_64 PHP Version: 7.4.2 PHP SAPI: cli PHP Bin: /usr/bin/php7.4 PHP Extension Dir: /usr/lib/php/20190902 PHP Bin Dir: /usr/bin Loaded PHP config: /etc/php/7.4/cli/php.ini Versions: Phalcon DevTools Version: 4.0.1 Phalcon Version: 4.0.3 AdminLTE Version: 2.3.6

jaguarsdv commented 4 years ago

Can be related to https://github.com/phalcon/cphalcon/issues/14766

Jurigag commented 4 years ago

Related ~https://github.com/phalcon/zephir/pull/2056~, https://github.com/phalcon/zephir/pull/2078, https://github.com/phalcon/zephir/issues/2057

sergeyklay commented 4 years ago

Zephir issue has been fixed in #2078. I'll release new version ASAP

sergeyklay commented 4 years ago

Zephir 0.12.18 released: https://github.com/phalcon/zephir/releases/tag/0.12.18