Как лучше построить архитектуру интернет-магазина?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
pr-dm
Сообщения: 1
Зарегистрирован: 2017.11.17, 13:49

Как лучше построить архитектуру интернет-магазина?

Сообщение pr-dm »

Приветствую!

Я новичок. Хочу разобраться как лучше построить архитектуру интернет-магазина. С учетом текущих потребностей и опыта.
А потребности такие:
1. Удобство дополнения/изменения функционала, масштабируемость.
2. Инкапсуляция и низкая (по возможности) связанность – не переделывать на каждый чих половину кода.
3. Ну и чтоб не стыдно было за работу)

Буду благодарен ElisDN, если найдте возможность ответить на вопрос.

Итак. Часть I.
После просмотра известного интенсива взял за общий шаблон разработанную там корзину, разделенную на несколько слоев.
При дополнении класса Cart методами reduce(), set() и др. ощутил удобство работы.

Примерная схема магазина (на данный момент вижу такие сущности):

*Client
*Payment
*Delivery
*ShopService
****Product
****Category
****Cart
****Order
****Stock
****Shares
****Manager

Внутри ShopService компоненты видят верхний слой друг друга, модели имеют связи внешних ключей и находятся в едином namespace app\models.

В некоторых местах классы только делегируют функционал, например:

Код: Выделить всё

class Product
{
    public function getByCategory(int $category_id)
    {
        return $this->storage->getByCategory($category_id);
    }
}

Код: Выделить всё

class DbStorage implements IProductStorage
{
    public function getByCategory(int $category_id)
    {
        return ProductModel::find()->where(['category_id' => $category_id]);
    }
}
Так нормально делать?

В моделях и таблицах БД все равно есть связь, не вижу смысла через конструктор внедрять объект Product.

По этой части вопросы такие:
1. В правильном направлении я мыслю?
2. Правильно ли составлена видимость слоев и моделей?

Часть II.

upd. Ответ на эту часть нашел тут, первая часть все еще актуальна.

Client (например) будет обращаться к Product через метод ShopService, а там нарисовался громадный конструктор.
К правильно инициализировать объект ShopService? С одной стороны, не хочется каждый раз писать полный перечень компонентов и иметь какой-то набор по-умолчанию. Со второй – хочется оставить возможность подмены некоторых входящих компонентов. С третьей – если я правильно понял, нельзя через приватные свойства инициализировать ShopService в конфигурации приложения:

Код: Выделить всё

class ShopService
{
    private $cart;
    private $cart_storage;
    private $cart_calculator;
    …
}
- не прокатит.

На ум приходят методы init и initDefault.

Как лучше сделать?
Ответить