Должен ли мой Сервис реализовывать метод транзакции и фиксации? - PullRequest
0 голосов
/ 15 мая 2011

Допустим, я хочу сделать массовое обновление пользователя в моем UsersController.

В моем UsersController я делаю:

foreach ($users as $user) {
    $userService = new UserService();
    $user->updateUser($data);
}

Если пользователей много,он может работать медленнее, потому что метод UserService :: updateUser просто делает persist() / flush()

Так что мне интересно, может ли быть хорошей идеей сделать что-то подобное:

class UserService {
  public function setUseTransaction($flag)
  {
      $this->useTransaction = $flag;
      return $this;
  }

  public function updateUser($data)
  {
     // some data mapping

     $entityManager->persist($user);

     if ($this->useTransaction) {
       $entityManager->flush();
     }
   }

   public function commit()
   {
      $entityManager->flush();
   }
}

Тогда в моем UsersController я могу сделать:

$userService = new UserService();
$userService->setUseTransaction(true);

foreach ($users as $user) {
    $userService = new UserService();
    $user->updateUser($data);
}

$userService->commit();

Что вы думаете?

Ответы [ 2 ]

3 голосов
/ 15 мая 2011

Я бы не хотел показывать какие-либо вещи по управлению транзакциями выше моего уровня обслуживания.Я бы, вероятно, запихнул все эти вещи в свой сервис и открыл два открытых метода updateUser (userEntity) (для одноразового использования с неявным сбросом) и updateUsers (array-of-users) (для пакетных обновлений)

Примерно так:

class UserService {

    public function updateUser(User $user){
        $this->_updateUser();
        $this->em()->flush();        
    }

    public function updateUsers(array $users){
        foreach($users as $u) $this->_updateUser($u);
        $this->em()->flush();     
    }

    private function _updateUser(User $user){
        //do stuff to $user
        $this->em()->persist($user);
    }
}

Затем, если позже вы решите разделить обновления на группы по 100 штук или что-то в этом роде, вся ваша логика массовых обновлений будет хорошо учтена в сервисе.вместо потенциально нескольких мест в вашем контроллере (ах).

0 голосов
/ 15 мая 2011

Завершение всего этого в транзакции, безусловно, ускорит процесс.

Запись всего массового обновления в виде одного SQL-запроса будет происходить в сотни раз быстрее.

...