Какова лучшая практика для соединения информации двух организаций? - PullRequest
0 голосов
/ 19 февраля 2012

Мне немного сложно выразить свои вопросы словами, но я попробую.

У меня есть две сущности. Один называется Товар, другой - Продажа. У каждого товара есть поле, определяющее количество доступных товаров этого товара. Каждая продажа имеет поле с указанием количества проданных товаров одного товара. Продукт для продажи - это отношения OneToMany.

Теперь, если я хочу выяснить, продан ли товар, мне нужно создать функцию, которая вычитает общее количество проданных товаров из номера начальной доступности товара. Что-то вроде function getAvailableQuantity().

Мой вопрос: где мне разместить этот метод? У меня возникает соблазн поместить его в репозиторий продуктов, но поскольку этому методу требуется доступ к сущности «Продажи», это противоречит внедрению зависимости. Однако размещение его в контроллере кажется ненужным обходным путем, поскольку я теряю возможность вызова {{ product.getAvailableQuantity }} в шаблонах Twig.

Какой путь?

Спасибо за любую помощь!

Ответы [ 3 ]

2 голосов
/ 19 февраля 2012

Я бы посоветовал вычесть проданные вещи сразу из Product::available_items.Это решит проблему сразу, потому что Product::available_items всегда будет отражать количество доступных предметов.

Метод №.1

Сразу же вычтите Sale::quantity из Product.

public function setProduct(ProductInterface $product)
{
    $new_count = $product->getAvailableItems() - $this->getQuantity();
    $product->setAvailableItems($new_count);

    $this->product = $product;
}

Вы также должны будете выполнить вычитание во всех контроллерах, которые могут изменить доступное количество элементов.


Метод №.2

Лично я на самом деле предпочел бы этот метод первому, потому что он хранит логику в одном месте и, как правило, приводит к более коротким контроллерам.Кроме того, мои сущности обычно достаточно длинные без всей логики домена.

Предполагая, что Sale имеет ссылку на Product, я бы поместил логику в службу (менеджер сущностей, ориентированный на сущность,например, UserManager. В нашем случае это будет называться SaleManager).Метод в нем будет выглядеть примерно так:

public function updateSale(SaleInterface $sale, $flush = true)
{
    $product   = $sale->getProduct();
    $new_count = $product->getAvailableItems() - $sale->getQuantity();

    if ($new_count < 0) {
        throw new NegativeQuantityException();
    }

    $product->setAvailableItems($new_count);

    $this->em->persist($sale);

    if (true === $flush) {
        $this->em->flush();
    }
}

Я не затрагивал вопрос о том, что произойдет, если вы удалите Sale из Product или переключите Product in a sale, но вы, конечно, должны это учитывать.

1 голос
/ 19 февраля 2012

Где разместить этот метод?

Подумайте о создании службы ProductSalesManager, в которую вы добавляете менеджер сущностей.С контроллера у вас будет что-то вроде:

$productSalesManager = $this->get(product_sales.manager);
$products = $productSalesManager->getProductsWithAvailableQuantity();

Теперь вы можете поместить свою логику в менеджер, не заботясь о том, в каком хранилище он находится. Он также отделяет ваш контроллер от самой Doctrine.

И я не уверен, что поддержание текущих запасов в самом продукте - хорошая идея, но это действительно ваше дело.

0 голосов
/ 19 февраля 2012

Поскольку имеющееся количество сильфона для Продукта, я думаю, что работа должна быть выполнена Компанией Продукта.

Если вы используете Doctrine, он сгенерировал функцию addSale в вашей сущности продукта (имя зависит от того, как вы определяете отношение). Я должен изменить эту функцию, чтобы сделать расчет. Предполагая, что поле в вашей сущности продукта называется available_quantity, а поле в вашей сущности продажи - items_number:

public function addSale ( $sale )
{
    $this->setAvailableQuantity($this->getAvailableQuantity() - $sale->getItemsNumber());
    $this->sales[] = $sale;
}

Затем в вашем контроллере вы добавляете продажу к товару:

// get the product
$product = $this->getDoctrine()
    ->getRepository('AcmeStoreBundle:Product')
    ->find($id);
// build your Sale object
$sale = new Sale();
...
// add it to the product
$product->addSale($sale);

// save all
$em = $this->getDoctrine()->getEntityManager();
$em->persist($sale);
$em->persist($product);
$em->flush();

В вашем шаблоне вы можете получить доступное количество вашего продукта:

{{ product.availableQuantity }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...