代码之家  ›  专栏  ›  技术社区  ›  koen

使用存储或对象状态后更改的对象

  •  0
  • koen  · 技术社区  · 15 年前

    例子:

    class UserStorage {
        public function addUser(User $user) { //saves to db }
    }
    
    class User {
        public function setName($name);
    }
    

    2 回复  |  直到 15 年前
        1
  •  1
  •   Pras    15 年前

    我同意Peter的观点,上面的模型在我看来有点古怪,我建议不要隐式保存到数据存储。

    此外,要使用的模式类似于:

    class UserStorage {
       $_user;
    
       function addUser(User user, commit = true) {
          if (commit) {
            // save to db
          } else {
            // populate your internal instance
            $_user = user;
          }
       }
    }
    

    如果你在一个PHP应用程序中使用多个更新,那么

    addUser(user,false) 
    

    addUser(user)
    

    这将减少对数据库的多次插入/更新的需要。

        2
  •  1
  •   Peter Bailey    8 年前

    隐式写入数据库可能是个坏主意。这应该是一个明确的,可控的操作。

    你的模式对我来说有点奇怪,但我认为你应该这样做

    class UserStorage
    {
        const ACTION_INSERT = 'INSERT';
        const ACTION_UPDATE = 'UDPATE';
    
        public function addUser(User $user)
        {
            $this->saveUser($user, self::ACTION_INSERT);
        }
    
        public function updateUser(User $user)
        {
            $this->saveUser($user, self::ACTION_UPDATE);
        }
    
        protected function saveUser(User $user, $action)
        {
            switch ($action) {
                case self::ACTION_INSERT:
                    //  INSERT query
                    break;
                case self::ACTION_UPDATE:
                    //  UPDATE query
                    break;
                default:
                    throw new Exception('Unsupported action');
            }
        }
    }
    
    class User
    {
        public function setName($name)
        {
            // whatever
        }
    }
    
    $userStorage = new UserStorage();
    $user = new User();
    
    $userStorage->addUser($user);
    
    $user->setName('Peter');
    
    try {
        $userStorage->updateUser($user);
    } catch (Exception $e) {
        echo "There was an error saving this user: " . $e->getMessage();
    }
    

    ActiveRecord .