Exemple #1
0
 /**
  * Взять предмет
  * @param User $user
  * @param Item $item
  * @param int  $quantityToTake Сколько предметов взять
  */
 public function takeItem(User $user, Item $item, $quantityToTake = 1)
 {
     $inventoryItem = $this->inventoryItemRepository->findOneByUserAndItemId($user, $item->getId());
     if ($inventoryItem) {
         $quantity = $inventoryItem->getQuantity() + $quantityToTake;
         $inventoryItem->setQuantity($quantity);
     } else {
         $inventoryItem = new InventoryItem($user, $item, $quantityToTake);
         $this->inventoryItemRepository->persist($inventoryItem);
     }
     $this->inventoryItemRepository->flush($inventoryItem);
     $this->logger->info(sprintf('[%d]%s взял предмет: [%d]%s x %d шт. (всего %d)', $user->getId(), $user->getName(), $item->getId(), $item->getName(), $quantityToTake, isset($quantity) ? $quantity : $quantityToTake));
 }
Exemple #2
0
 /**
  * Взять один или несколько предметов
  * @param User $user
  * @param Item|Item[] $items
  * @param int $quantityToTake Сколько предметов взять
  */
 public function takeItems(User $user, $items, int $quantityToTake = 1)
 {
     $itemsToTake = $this->prepareItemsArray($items);
     $inventoryItems = $this->inventoryItemRepository->findByUser($user);
     $inventoryItemCollection = new ArrayCollection($inventoryItems);
     foreach ($itemsToTake as $itemToTake) {
         $criteria = Criteria::create();
         $criteria->where(Criteria::expr()->eq('item', $itemToTake));
         $collectedInventoryItem = $inventoryItemCollection->matching($criteria);
         if ($collectedInventoryItem->count() === 1) {
             $inventoryItem = $collectedInventoryItem->first();
             $quantity = $inventoryItem->getQuantity() + $quantityToTake;
             $inventoryItem->setQuantity($quantity);
         } elseif ($collectedInventoryItem->count() === 0) {
             $inventoryItem = new InventoryItem($user, $itemToTake, $quantityToTake);
             $this->inventoryItemRepository->persist($inventoryItem);
         } else {
             throw new \RuntimeException('Найдено более одного предмета');
         }
     }
     $this->inventoryItemRepository->flush();
     $this->logObtainedItems($user, $itemsToTake, $quantityToTake);
 }