Ответы пользователя по тегу PHP
  • Как быть с событиями из агрегата, который используется в агрегате уровнем выше?

    ghost404
    @ghost404
    PHP Developer
    Для начала рекомендую глянуть библиотеку для реализации доменных событий
    https://github.com/gpslab/domain-event

    Еще рекомендую определится с терминологией. "Покупка лучшего фильма", "Лучшие фильмы" и "Покупка фильма" это не домены, а ограниченные контексты (Bounded Context).

    Не может быть агрегата уровнем выше. У вас неправильное понимание термина Агрегат. И с доменными событиями тоже самое. Доменные события должны бросаться в сущностях, а не сервисах прикладного уровня.

    Далее. Вы списываете баланс со счета пользователя, потом выдаёте ему доступ к фильму и потом бросаете событие и все это делаете последовательно, да ещё и заварачиваете в БД транзакцию, хотя это бизнес транзакция.

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

    И все же вернёмся к вашей проблеме.
    > пользователь может подписаться на услугу "Дайте мне доступ к лучшему фильму недели"

    Вы явно описали понятие Услуга. И у вас есть две, скажем так, услуги:
    - Лучшие фильмы недели
    - Покупка одного фильма

    Отсюда у вас появляется:
    interface Service
    {
        public function price(): Money;
    
        // ...
    }
    
    class OneFilmService implements Service
    {
        public function __construct(Film $film)
        {
            // ...
        }
    
       // ...
    }
    
    class BestFilmsService implements Service
    {
        // ...
    }
    
    class User
    {
       // ...
    
        public function buyService(
            AccountRepository $repository,
            Service $service
        ) {
            // получаем текущий счёт пользователя
            // и выполняем покупку
            $repository
                ->get($this->id)
                ->buy($service->price())
            ;
    
            // добавляем пользователю
            // преобретенную услугу
            $this->services[] = $service;
    
            // бросаем доменное событие
            $this->raise(new ServicePurchased(
                $this->id,
                $service->id()
            );
        }
    }

    Простой и наглядный способ покупки услуги.

    Получение денег от клиента по средствам СМС инкапсулированно в UserAccount.

    Если между покупкой и получением доступа к услуге должно пройти несколько минут, можно ввести понятие -
    Активация заказанной услуги.

    То есть, пользователь покупает/заказывает услугу и возможно даже видит ее в своём личном кабинете, но активация услуги и соответственно доступ к ней выполняется только после поступления средств от клиента через СМС или ещё как.
    Ответ написан
  • Как документировать тип переменной в классе-наследнике в PHP?

    ghost404
    @ghost404
    PHP Developer
    еще вариант с повторным определением свойства с корректный phpDoc
    class SomeCollection extends IterableCollection
    {
        /**
         * @var SomeClass[]
         */
        protected $items = [];
    
        public function doSomeWork()
        {
            $this->items[0]->someMethod();
        }
        ...
    }
    Ответ написан
  • Работа без высшего образования, это реально?

    ghost404
    @ghost404
    PHP Developer
    Скажу по своему опыту.
    Фрилансить начал еще в школе. Поступал в вышку на вечерку потому что родители сказали что не будут меня обеспечивать и мне пришлось идти работать. Опыта у меня было мало, но я без особых проблем нашел себе работу программиста. К окончанию вуза у меня была не только корочка, но и большой практический опыт. Опыт работы в крупной социальной сети и зп на порядок выше чем у любого выпускника вуза.

    Образование в вузах всегда отстает от нынешнего положения на несколько лет. Выйдя из вуза у вас может быть большой багаж устаревших теоретических знаний которые на практике могут и не пригодится. Поэтому практика обязательна и чем больше проект тем лучше. Устраивайтесь джуниором на мизерную зарплату в крупную компанию и работайте в команде разработчиков. Это даст вам большой, незаменимый опыта, вы получить рекомендации от работодателя для следующей компании и стаж в трудовой с красивыми словами.
    Ответ написан
  • Как в элоквенте выбирать подключения на ходу?

    ghost404
    @ghost404
    PHP Developer
    Не понял о чем вы и о каком фреймворке идет речь

    на вскидку
    class Product extends \Model
    {
        public function getCategory()
        {
            return $this->getDbConnection('connection_second')
                ->getModel('Category')
                ->find($this->cat_id);
        }
    }

    получние категории продукта
    Product::on('connection_first')->find($product_id)->getCategory();
    Ответ написан