コード例 #1
0
ファイル: UserService.php プロジェクト: samizdam/Kingdom
 /**
  * Выбросить один или несколько предметов
  * @param User $user
  * @param Item|Item[] $items
  * @param int $quantityToDrop Сколько предметов выбросить
  * @return bool
  * @throws ItemNotFound
  * @throws NotEnoughItems
  */
 public function dropItems(User $user, $items, int $quantityToDrop) : bool
 {
     $items = $this->prepareItemsArray($items);
     $inventoryItems = $this->inventoryItemRepository->findByUser($user);
     $inventoryItemCollection = new ArrayCollection($inventoryItems);
     foreach ($items as $item) {
         $criteria = Criteria::create();
         $criteria->where(Criteria::expr()->eq('item', $item));
         $collectedInventoryItem = $inventoryItemCollection->matching($criteria);
         if ($collectedInventoryItem->isEmpty()) {
             throw new ItemNotFound();
         }
         $inventoryItem = $collectedInventoryItem->first();
         $itemQuantity = $inventoryItem->getQuantity();
         $itemQuantityAfterDrop = $itemQuantity - $quantityToDrop;
         if ($itemQuantityAfterDrop == 0) {
             $this->inventoryItemRepository->remove($inventoryItem);
         } elseif ($itemQuantityAfterDrop > 0) {
             $inventoryItem->setQuantity($itemQuantityAfterDrop);
         } else {
             throw new NotEnoughItems();
         }
     }
     $this->inventoryItemRepository->flush();
     $this->logDroppedItems($user, $items, $quantityToDrop);
     return true;
 }
コード例 #2
0
ファイル: UserService.php プロジェクト: alarionov/Kingdom
 /**
  * Выбросить предмет
  * @param User $user
  * @param Item $item
  * @param int  $quantityToDrop Сколько предметов выбросить
  * @return int Количество оставшихся предметов
  * @throws ItemNotFound
  * @throws NotEnoughItems
  */
 public function dropItem(User $user, Item $item, $quantityToDrop)
 {
     $inventoryItem = $this->inventoryItemRepository->findOneByUserAndItemId($user, $item->getId());
     if (!$inventoryItem) {
         throw new ItemNotFound();
     }
     $itemQuantity = $inventoryItem->getQuantity();
     $itemQuantityAfterDrop = $itemQuantity - $quantityToDrop;
     if ($itemQuantityAfterDrop == 0) {
         $this->inventoryItemRepository->remove($inventoryItem);
     } elseif ($itemQuantityAfterDrop > 0) {
         $inventoryItem->setQuantity($itemQuantityAfterDrop);
     } else {
         throw new NotEnoughItems();
     }
     $this->inventoryItemRepository->flush($inventoryItem);
     $this->logger->info(sprintf('[%d]%s выбросил предмет: [%d]%s x %d шт. (осталось %d)', $user->getId(), $user->getName(), $item->getId(), $item->getName(), $quantityToDrop, $itemQuantityAfterDrop));
     return $itemQuantityAfterDrop;
 }