• Какой метод реализации при подходе CQRS правильный?

    vhood
    @vhood
    Не забывайте отмечать решения
    Архитектура монолит.
    например для Order это его классы которые лежать в папке Order, его Aggregate Root
    У Вас модуль = агрегат? Это не одно и то же.

    За пределами своего неймспейса модуля, классы напрямую не используются и не вызываются, кроме Api service классов
    Модуль - самостоятельная единица, которая должна работать без других модулей. Low coupling, high cohesion. Представьте, что он может подключаться через composer, вот каким он должен быть? У Вас так?
    Что за паттерн "Api service", который какие-то DTO отдает? У агрегата может быть id другого агрегата и этого ему должно быть достаточно.

    У Вас один контекст? Когда кто-то говорит "Store" (или, скорее всего, склад), все имеют ввиду одно и то же? Store с точки зрения покупателя и Store с точки зрения какого-то другого актора (например, поставщика) - одно и то же?
    Если нет, Вам стоит разделить 2 контекста и сделать 2 Store. Один самостоятельный, и один как поддомен у Order и тогда вся логика будет в Order.
    spoiler
    слой Application одного контекста не может ссылаться на слой Domain другого контекста

    Если контекст единый, может Store не заслуживает быть самостоятельным агрегатом? Если все-таки заслуживает, Order может выполнять свои обязанности, имея только id из Store? Это "на подумать".

    В любом случае, один агрегат может воспользоваться другим (но не получать напрямую его объекты для реализации своей логики, только использовать функционал Aggregate Root), но если ими можно воспользоваться в слое Apprication последовательно - это будет лучше.

    сперва у модуля Store проверить работает ли этот store, то есть проверить его рабочие часы и дневной лимит на продажу
    Мне кажется, очевидно, что если это все-таки 2 разных агрегата одного контекста, то Store даже бизнес-логику тут не реализует, нужно просто проверить спецификацию. Делать это нужно в Application, вызвать 2 агрегата последовательно. Не нужно делать это ответственностью Order.
    Ответ написан
  • Как найти в строке текст который содержит спецсимволы с помощью регулярного выражения?

    vhood
    @vhood
    Не забывайте отмечать решения
    Судя по предоставленным данным, от поставщика некий артикул всегда находится в конце строки.

    Регулярные выражения тут не нужны.

    Предлагаю просто отформатировать ответ от поставщика и вывести пересечения

    $items = array_intersect(
        $companyItems, // на сайте
        array_map(
            function (string $item) {
                $parts = explode(' ', $item);
                return end($parts);
            },
            $supplierItems // от поставщика
        ),
    );
    Проверка

    spoiler
    если не доставать отдельно имена товаров на сайте, можно собрать артикулы с товаров поставщика в один массив, пройтись по товарам на сайте и проверить in_array($item['name'], $supplierNames, true)
    Ответ написан
    8 комментариев
  • Как настроить перенос текста в vscode?

    vhood
    @vhood
    Не забывайте отмечать решения
    Если их убрать и сохранить, то эти переносы появляются в других местах
    Если я правильно понял, речь про перенос слов не по строкам. К сожалению, номеров строк на скриншотах нет, что-бы в этом убедиться.

    Нажмите Alt+Z для быстрой смены переноса слов.

    В настройках settgs.json это называется "editor.wordWrap"6711000e57b34008907863.png
    Ответ написан
    Комментировать
  • Есть ли RoadMap от middle до Senior php разработчику?

    vhood
    @vhood
    Не забывайте отмечать решения
    сменить работу - пока не вариант
    Когда будет вариант, ищите сразу позицию senior.

    Пока нет варианта, остается только узнать у текущего руководства что нужно для перехода на позицию senior.

    spoiler
    Иногда ответ бывает нереалистичный (например, мне однажды ответили "приведи 10 мидлов"). В таком случае только уходить на позицию выше сразу, и уделять время до увольнения больше своим навыкам и созданию портфолио, нежели быстрому выполнению задач в текущей компании
    Ответ написан
    Комментировать
  • Как упростить метод, выполняющий операции для всех других методов класса, если он получается слишком раздутым?

    vhood
    @vhood
    Не забывайте отмечать решения
    Здесь Вы принимаете type
    public function makeRequest(array $args, string $type) {
    Здесь выполняете логику в зависимости от typeif($type === "source1") {

    Для каждого type нужно создать класс, который будет выполнять логику, описанную в его блоке if.
    пример

    class SpecificTypeApiService implemets ApiServiceInterface
    {
        public function send()
       {
    //код ниже просто скопирован, стоит вынести что-то в параметры, что-то в конструктор и сделать код более элегантным
    //можно сделать абстрактный класс и делегировать ему общий для разных type (сервисов) функционал
        $proxiesArr = array('72.37.217.3:4145', '174.77.111.196:4145');
              
              $randProx = array_rand($proxiesArr, 1);
              
              $proxyIp = $proxiesArr[$randProx];
            
    //      $proxyIp = '174.77.111.196:4145';
            $url1 = $args[0] . $args[1];
                $headers = [
                'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.105 YaBrowser/21.3.3.230 Yowser/2.5 Safari/537.36'
                ];
    
                $curl = curl_init();
    
            curl_setopt($curl, CURLOPT_PROXY, $proxyIp);
            curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
            curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_VERBOSE, 1); 
            curl_setopt($curl, CURLOPT_POST, false);
            curl_setopt($curl, CURLOPT_URL, $url1);
    
            $result = curl_exec($curl);
    
            if(curl_exec($curl) === false)
            {
            echo 'Ошибка curl: ' . curl_error($curl);
            } else {
            echo 'Операция завершена без каких-либо ошибок';
            }
    
            return $result;
       }
    }


    После, с помощью DI и полиморфизма, отрефакторить существующий код следующим образом:

    Здесь Вы принимаете сервис вместо type
    public function makeRequest(array $args, ApiServiceInterface $apiService) {

    Здесь выполняете логику, но выполнение делегируете сервису$apiService->send();

    Стоит получше подумать над именами классов, переменных и функций.
    Ответ написан
    Комментировать
  • Как значения из одного массива преобразовать в другой массив?

    vhood
    @vhood
    Не забывайте отмечать решения
    С помощью функций для работы с массивами и/или конструкций для итерации массивов.

    UPD:
    Если только configuration_value, то можно напрямую
    //$array - исходный массив
    //$configurationValue - новый массив
    $configurationValue = $array['configuration_value'];
    Однако смысла в этом никогда нет, только память расходовать. Значения по ключу можно получать там, где это нужно, не сохраняя их в отдельную переменную.
    Ответ написан
    Комментировать
  • Почему не выравниваются элементы в flex контейнере а растягиваются?

    vhood
    @vhood
    Не забывайте отмечать решения
    Растяните result__money на 100%.

    flex тут не причем, у родителя result__money (result__input-inner) нет flex.
    Ответ написан
    Комментировать
  • Как убрать отступы в коде?

    vhood
    @vhood
    Не забывайте отмечать решения
    $BaseSiteMap = preg_replace('/\s{2,}/m', '', $BaseSiteMap);

    В песочнице
    Ответ написан
    Комментировать
  • Как избежать слипшихся ссылок?

    vhood
    @vhood
    Не забывайте отмечать решения
    ^(?:^https?\:\/\/)?(?:www\.)?[a-z0-9-]+\.[a-z]+(?:[?\/].*)?$

    проверка
    Ответ написан
    Комментировать
  • Есть ли смысл применять CQRS/MediatR?

    vhood
    @vhood
    Не забывайте отмечать решения
    Query может использовать отдельную базу данных с денормализацией и индексами под поиск, а Command другую базу данных с нормальными формами и без лишних индексов для ускорения вставки. В случае микросервисной архитектуры это будет 2 отдельных микросервиса, что позволит эффективно всем управлять. Но настроить такую систему сложнее и дольше.

    Независимо от БД и архитектуры, для Query и Command стоит делать разных пользователей в базе данных с разными правами, что только усиливает безопасность.
    Ответ написан
    Комментировать
  • Как указать в миграции в Yii2 как преобразовывать данные USING square::double precision?

    vhood
    @vhood
    Не забывайте отмечать решения
    Примерно так:
    public function safeUp()
    {
        $this->execute(sprintf(
            "ALTER TABLE %s ALTER COLUMN square TYPE float USING square::double",
            $this->scheme_table
        ));
    }
    Ответ написан
    Комментировать
  • Как в Yii2 правильно разделить контроллер?

    vhood
    @vhood
    Не забывайте отмечать решения
    Документация
    'urlManager' => [
        'rules' => [
            [
                'GET site/<id>' => 'site-new/view',
            ]
        ],
    ]
    Ответ написан
  • Как разрешить merge конфликт?

    vhood
    @vhood
    Не забывайте отмечать решения
    Правильно ли я понимаю, что будет нечто:
    Да

    git merge master
    После этой команды нужно будет решить конфликты в файлах

    git add .
    После этой команды нужно будет сделать коммит

    spoiler
    git checkout master
    git pull origin
    Это не обязательно, можно сразу:
    git checkout branch-b
    git pull
    git merge origin/master
    Ответ написан
    Комментировать
  • Как сделать Index с типом Hash?

    vhood
    @vhood
    Не забывайте отмечать решения
    public function safeUp()
    {
        return $this->execute("CREATE INDEX name ON table USING HASH (column)");
    }
    Ответ написан
    Комментировать
  • Как правильно установить YII?

    vhood
    @vhood
    Не забывайте отмечать решения
    1. Установить docker
    2. Загрузить в папку проекта готовое docker окружение
    3. Следуя документации, сбилдить и запустить контейнеры, внтури php контейнера установить фреймворк

    В готовом окружении уже
    установлены и настроены nginx и так далее
    Ответ написан
    Комментировать
  • Как из контроллера дернуть команду?

    vhood
    @vhood
    Не забывайте отмечать решения
    в ней происходит просто обращение курлом по ссылке и получение картинки
    Вынесите этот функционал в отдельный сервис и используйте его и в команде, и в контроллере.
    Ответ написан
    Комментировать
  • RegEx: Выделить только одни значения в таблице?

    vhood
    @vhood
    Не забывайте отмечать решения
    Ответ написан
    Комментировать
  • Как передать функцию в конфигах в Yii2?

    vhood
    @vhood
    Не забывайте отмечать решения
    $pushSender = Yii::$app->getModule('server-chat')->push_sender;
    
    $pushSender($message, $preparedData, $title, $type, $userID);
    Ответ написан
  • Как использовать атрибуты для маршрутов в Laravel?

    vhood
    @vhood
    Не забывайте отмечать решения
    Через пакет какой-нибудь, например
    Ответ написан
    Комментировать
  • Может кто то объяснить для чего это расширение?

    vhood
    @vhood
    Не забывайте отмечать решения
    Для удаления пустых строк в конце файла
    Ответ написан