Santehnick Спасибо.
Цитата (Santehnick @ 5.04.2018 - 08:34) |
P/S Советую это всё изучать на пет-проекте. От простого к сложному. Не надо без опыта пытаться применить доменную модель на рабочем проекте. Зафакапишь все сроки или за пару дней до дедлайна будешь делать как попало лишь бы работало и в итоге сделаешь еще хуже, чем без неё. |
<?php
namespace App\Models\Shop;
use App\Models\Shop\Product;
/**
* Shop
*
*/
class CatalogueReader
{
protected $calculator;
public function __construct()
{
$this->calculator = new Calculator;
}
/**
* Генерируем список продуктов
*
* @return array
*/
public function process()
{
$products = Product::find()->with(
['promotion' => function ($query) {
return $query->andWhere(['<=', 'date_start','NOW()'])
->andWhere(['>=', 'date_end', 'NOW()']);
}])
->order('priority');
return $products->getCatalogue($this->calculator);
}
}
<?php
namespace App\Models\Shop;
use ABC\Core\ActiveRecord\Model;
/**
* Shop
*
*/
class Product extends Model
{
protected function getPromotion()
{
return $this->belongsTo(Promotion::class);
}
/**
*
*
* @return object
*/
public function getCatalogue(calculator $calculator)
{
$products = $this->all();
foreach ($products as $product) {
$price = $this->calculatePrice($product, $calculator);
$product->newPrice = $price;
$collect[] = $product->asDTO();
}
return $collect;
}
/**
* Вычисляем цену с учетом скидки
*
* @return float
*/
protected function calculatePrice($product, $calculator)
{
if (!is_object($product->promotion)) {
return $product->price;
}
$discount = $product->promotion->discount;
return $calculator->createPrice($product->price, $discount);
}
}
array (
[0] => ABC\Core\ActiveRecord\DTO object (
[id] => 1
[promotion_id] => 1
[name] => Тандыр большой «Премиум»
[description] =>
[price] => 10000.00
[photo] =>
[priority] => 1
[newPrice] => 8000
)
[1] => ABC\Core\ActiveRecord\DTO object (
[id] => 2
[promotion_id] =>
[name] => Тандыр Большой «Семейный»
[description] =>
[price] => 30000.00
[photo] =>
[priority] => 2
[newPrice] => 30000.00
)
[2] => ABC\Core\ActiveRecord\DTO object (
[id] => 3
[promotion_id] => 2
[name] => Тандыр Средний «Дачный»
[description] =>
[price] => 40000.00
[photo] =>
[priority] => 3
[newPrice] => 20000
)