depolama veya kullanılan nesne-devlet sonra değişen nesne

2 Cevap php

Örnek:

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

class User {
    public function setName($name);
}

Ne kullanıcı depolama bir kullanıcı eklemek ve daha sonra bu kullanıcı nesnesini değiştirirseniz? Bu durumda bu kullanıcı nesneleri sadece __ imha saklanmalıdır iddia edebilir. Ama bazen bu bir seçenek (örneğin, kullanıcı görüntülenir ve daha sonra güncellenir hayal değil).

2 Cevap

Veritabanına örtük yazar muhtemelen kötü bir fikir vardır. Bu bir açık, kontrollü bir işlem olmalıdır.

Sizin desen bana biraz garip, ama ben bunu yapmak istiyorum istiyorum nasıl bu düşünüyorum

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 queyr
        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();
}

Ama Şahsen ben bu sınıf tasarımı hakkında deli değilim. Böyle ActiveRecord gibi daha az kafa karıştırıcı bunun için bazı köklü desenler vardır.

Ben Peter ile, yukarıdaki modeli bana biraz tuhaf görünüyor katılıyorum ve ben veri deposuna kaydetmek örtülü karşı tavsiye ederim.

Ayrıca, kullanmak için bir desen gibi bir şeydir:

class UserStorage {
   $_user;

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

Eğer PHP uygulama yürütme Kullanıcı nesnenin birden güncellemeler var ise, kullanabileceğiniz

addUser(user,false)

tüm yol için son çağrı kadar

addUser(user)

Bu DB çoklu ekler / güncellemeleri ihtiyacını hafifletmek olacaktır.

Ancak, sonunda db kaydetmek için karar nerede uygulama sizin sorun olmaya devam, ve nesne temsilinin daha mantıksal akışı hakkında daha fazla olduğunu. Bu db için tüm nesneleri devam script bir ucunu () fonksiyonu için yararlı olabilir.