Я работаю над побочным проектом и в итоге оказался в положении, в результате которого у меня есть OrderProductFactory, которому требуется шаблон стратегии для оплаты, а также репозиторий, который определяет, где хранятся мои OrderProducts, например:
Код: Выделить всё
final readonly class OrderProductFactory
{
public static function create(string $orderProductPaymentStrategyType, string $repositoryType, array $repositoryParams): OrderProduct
{
return OrderProduct::for(
self::createOrderProductPaymentStrategy($orderProductPaymentStrategyType),
self::createOrderRepository($repositoryType, $repositoryParams)
);
}
private static function createOrderProductPaymentStrategy(string $type): OrderProductPaymentStrategy
{
return match ($type) {
CardPayment::name() => new OrderCardPayment(),
default => throw new InvalidArgumentException('Unsupported OrderProductPaymentStrategy type: ' . $type),
};
}
private static function createOrderRepository(string $type, array $params): OrderRepository
{
return match ($type) {
SqliteOrderRepository::name() => new SqliteOrderRepository($params['database_path'] ?? throw new InvalidArgumentException('Invalid File Path for SqliteOrderRepository')),
default => throw new InvalidArgumentException('Unsupported OrderRepository type: ' . $type),
};
}
}
Код: Выделить всё
$orderProduct = OrderProductFactory::create('card-payment', 'sqlite');
Кажется неверным, что он отвечает за:
- Создание продукта-заказа
- Создание правильной стратегии оплаты
- Управление загрузкой репозитория
- Мне также не нравится, что используется магический массив $params
Подробнее здесь: https://stackoverflow.com/questions/787 ... repository
Мобильная версия