• Зачем нужна база данных для тестов в Yii2?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Тестовая бд нужна для тестовых манипуляций, вы же не будете в боевой удалять и добавлять, делать продажи и выптсывать документы? Или будете? ;) Не будете же реальным адресам отправлять письма?

    Тестовая бд -- база-имитация. Почти как настоящая, но с нестоящими данными. Тестируйте в ней.
    Ответ написан
    4 комментария
  • Как запустить envoy Laravel?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Ключ сгенерировали на удаленном сервере?

    Ведь именно там выполняется команда, которая подтянет git репозиторий, соответственно ключ удаленного сервера должен быть в учетной записи в Bitbucket указан.

    То есть за кодом идет удаленный сервер и он сам авторизуется на git хостинге
    Ответ написан
  • Как добавить поле в entity Doctrine во время сериализации?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Removed deprecated method JsonSerializationVisitor::addData, use :visitProperty(new StaticPropertyMetadata('', 'name', null), 'value') instead

    Источник: https://github.com/schmittjoh/serializer/blob/mast...

    В UPGRADING.md обычно в библиотеках пишут, что поменяли из обратносовместимого...

    Для чего сделали: (довольно поверхностно посмотрел код на Гитхабе)
    повысили уровень абстракции — использовали полиморфизм, чтобы можно было более гибко работать с сериализацией/десериализацией/группами и прочее для работы со свойством сущности, для управления условиями добавления этого поля и т.д. возложив ответственность на объект MetaData (на языке паттернов: Стратегия)

    Дискусия появления решения: https://github.com/schmittjoh/serializer/pull/45
    Ответ написан
    Комментировать
  • Как вывести все значения строки, если изначально не знаешь сколько их будет?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    $massive = "1H|\^&|||ttt|||||h|BATCH|P|1 P|1 O|1|5331|598^0012^1^^S1^SC|^^^133^1\^^^140^1|R||20190625132832||||N||||1|||||||20190625135509|||F R|1|^^^133/1/not|1.52|uIU/ml||N||F||admin|||E1 R|2|^^^140/1/not|4.99|pmol/l||N||F||admin|||E00 21 L|1|N 43";
    
    // Ищем все числа из трех цифр, перед которыми стоит ^^^ 
    // и результат записываем в matches
    preg_match_all('~\^{3}(?P<target>\d{3})~', $massive, $matches);
    
    // В массиве matches c индексом 'target' лежат наши значения
    //  [
    //     0 => "133"
    //     1 => "140"
    //     2 => "133"
    //     3 => "140"
    //  ]
    var_dump($matches['target']);

    https://ideone.com/e6U7yB

    Далее циклом пройдитесь по этим значениям, например отфильтруйте их, очистите от дублей, и сопоставьте со своим словарем и выводите в html уже.
    И все это динамически, то есть не завязано на порядок этих символов
    Ответ написан
    1 комментарий
  • Почему не роботает envoy run deploy?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Необходимо в PATH указать папку bin скриптов для composer, в доке указано:
    5d16479600afd882435725.pnghttps://laravel.com/docs/5.8/envoy#installation

    Нужно выполнить команду (а лучше добавьте ее сразу в свой файлик ~/.bash_profile и перезайдите):
    export PATH="$PATH:~/.composer/vendor/bin"
    Ответ написан
  • Какую архитектуру выбрать для системы с задачами, которые требуют множественной обработки/подтверждения?

    Maksclub
    @Maksclub
    maksfedorov.ru
    State Machine

    Хорошо себя показывает в разного рода CRM, колл-центрах, Order Proceesing в сложных системах.
    Из одного состояния можно перейти только в определенные, каждое состояние валидно, открыты только определенные переходы и в целом такой подход к проектированию помогает бороться со сложностью условий и контролем состояний.

    Пример схемы 1
    5d150bd349906770079074.png
    Пример схемы 2
    5d150cbb9ab7f176798816.png
    Ответ написан
    3 комментария
  • Почему ошибка об отсутствии класса в Laravel?

    Maksclub
    @Maksclub
    maksfedorov.ru
    {!! JsValidator::formRequest('App/Http/Requests/ProductsRequest') !!}

    Неймспейсы пишутся с обратным слешем:
    App\Http\Requests\ProductsRequest
    Ответ написан
    Комментировать
  • Почему в PHP строки и массивы не являются объектами?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    От Никиты Попова (разраб из core team языка) есть библиотечка в виде php-extension:
    Extension
    Пример имплементации

    Не видел распространения такого в языке PHP вообще никогда, но сейчас пишу на Python и мне очень нравятся скалярные объекты.
    Одно точно — не все используют PHP в ООП стиле, хотя он уже де-факто доминирует в промышленной разработке на этом языке

    Обсуждение на Reddit: https://www.reddit.com/r/PHP/comments/2xmawu/are_s...

    UPD: В опросе того, что хотят увидеть в PHP 8 год назад, скалярные объекты заняли 4 место с неплохим результатом: https://blog.nikolaposa.in.rs/2018/09/23/community...
    may be...
    Ответ написан
    2 комментария
  • Где лучше качество кода?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Все плохо
    • Глобальные переменные — зло
    • На лицо некий код, который и с сессией работает и с БД — явное нарушение общепринятных принципов, например SRP
    • $dao как инициализирована? Явно не через конструктор
    • Использование цифры, вот сиди гадай по ней — это плохо, используйте именованную константу. Например 3 — это некий статус для desktop, вот и назовите ее STATUS_DESKTOP, хотя далее...
    • вы обращаетесь к одному методу, который шибко умный — работает с флагами, тем самым нарушая SRP и сам содержит if/else, сделайте просто 2 раздельных метода:
      getMobileOpinionList()
      getDefaultOpinionList()

    • Предикат лучше вынести в отдельный метод isMobileOnly(), тк условия могут поменяться в нем, не будете же везде в if менять по всему проекту
    Ответ написан
    33 комментария
  • Как оптимизировать работу postgres из-за медленных запросов?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Быстродействие не только от индексов зависит, если по 10 секунд -- запросы могут тупить из-за блокировок... То есть просто запрос ждет разблокировки

    Где-то или транзакции работают не так, как нужно или еще что-то, потому вы и не находите
    (!если и EXPLAIN одинаковый, конечно) разницы... или что-то такое, разница из-за того, что на бою реальная нагрузка, а на тесте вы тестируете только то, что нужно...

    Кстати потому некоторые команды боевой трафик (ну его копию) пускают на тестовый стенд, чтобы баги поймать
    Ответ написан
    2 комментария
  • Как получить количество в Doctrine orm?

    Maksclub
    @Maksclub
    maksfedorov.ru
    1 СПОСОБ:
    вам нужно логику выборки вынести в репозиторий DigRepository в некий метод
    там же в репозитории сделать метода для получения количества
    все этих методы будут работать с неким общим методом, который возвращает QueryBuilder.
    Рекомендую начать с этого способа

    2 СПОСОБ:
    Сделать некий объект Criteria, который бы собирал нужный QueryBuilder и отдавал нужный ответ (сами данные или их число)

    ПРЯМОЙ ОТВЕТ:
    Вам нужен еще один запрос почти с тем же набором для QueryBuilder, только запрашивать $qb->select('count($dig.id)')
    И в конце $qb->getQuery()->getSingleScalarResult()

    Потому и предложил выше вынести код туда, где ему место и сделать его более общим, чтобы можно и поиск делать и запрашивать количество записей

    Экономически -- так и так делать 2 запроса, но зато код проще станет и удобнее будет его переиспользовать
    Ответ написан
  • Зачем нужен контейнер если php умирает?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Пишем код, кода становится много, его нужно обслуживать и бороться со сложностью, также нужно тщательно тестировать, тк деньги и надежность пользователей

    Чтобы тестировать методы класса и не зависеть от реализации -- соблюдается принцип инверсии зависимостей (и некоторые другие)

    Инверсия зависимостей -- нужно помнить и держать зависимости к нашему классу где-то и сам конкретный сервис наполнять нужно этими зависимостями, руками делать это
    накладно

    try {
        echo
            (new PurchaseOrder(
                new LocalOrderStorage(
                    new NullOrderStorage()
                ),
                new OrderId($inputParams['order_id'])
            ))
                ->newInvoice(
                    new InvoiceNumber(
                        new Vendor(
                            new LocalVendorStorage(),
                            new VendorId($inputParams['vendor_id'])
                        ),
                        new VendorInvoiceNumber($inputParams['vendor_invoice_number']),
                        new DateTime($inputParams['date_time'])
                    ),
                    new VendorInvoiceNumber($inputParams['vendor_invoice_number']),
                    new DateTime($inputParams['date_time']),
                    new InvoiceAmount(
                        new Amount($inputParams['amount']),
                        new Currency($inputParams['currency'])
                    )
                )
                    ->json()
        ;
    } catch (Exception $exception) {
        return
            (new ErrorResult())
                ->json($exception->getCode(), $exception->getMessage())
            ;
    }

    Кроме того появляется куча параметров в проекте.

    На помощь приходит паттерн Dependency Injection Container (Service Container), который за нас это делает и всасывает в себя эту заботу, а мы продолжаем писать код и делать это быстро, доставляя features for customers
    Ответ написан
    1 комментарий
  • Как вывести названия из массива отдельно друг от друга?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Прямой ответ на вопрос:
    Вы в шаблон передаете строку, которую собрали из массива.

    1. Передавайте сразу массив
    $this->render('builders/index.html.twig', ['names' => $names])

    2. И на стороне Twig циклом расставляйте как нужно данные в верстке

    Дополнительно:
    Почему вы работаете с массивами? Может лучше собрать объекты застройщиков и также в цикле в запросе раскидать? Без массивов
    Ответ написан
  • Как добавить возможность живого редактирования сайта?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Если ваша загвоздка именно в том, чтобы у разных сущностей статьи было свое оформление в виде html (классы, структура вложенных тегов и прочее), то можно пойти на встречу тем людям, кто редактируем и совсем спрятать от них эти детали, причем убрать любую возможность сломать верстку

    В разных компаниях делают по-разном, где-то юзают маркдаун, где-то контент-билдер, который перетягиванием как конструктор собирает статью, но есть вот такой вариант:
    https://editorjs.io/

    Попробовать в-живую: https://vc.ru/writing

    Сделан одни издательством (vc.ru, TJournal) -- редактор просто позволяет накидывать разные сущности статьи, на выходе JSON, который вы можете трансформировать в разные блоки... В документации почитаете, как расширить словарь этих сущностей.

    У меня в блоге например некий подвариант маркдауна, вставляешь 2 картинки -- парсер видит соседство и генерирует код слайдера, если отдельно -- парсер генерирует 2 тега img со своими атрибутами. Блог -- обычная CMS, сделан Ильей Бирманом
    Ответ написан
    1 комментарий
  • Что будет с траекторией, если расстояние от Земли до Солнца уменьшить в 100 раз?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Скорость движения планеты та же.

    При уменьшении расстояния -- сила притяжения увеличится, потому если у Земли не хватит скорости, то она притянется к Солнцу витками

    Формула гравитации
    5d05dc98d219a936817906.png
    Ответ написан
    Комментировать
  • Возможно на гитхабе хранить разные редакции кода?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Теги — некие метки или точки/срезы, вешаются на определенный коммит, фиксируя состояние, которое можно получить достав по этой метке. Благодаря им можно делать версии, пакетные менеджеры в разных языках (инструкция для npm в JS, инструкция для composer в PHP) могут работать с ними.
    Ответ написан
    Комментировать
  • Где учить Redux?

    Maksclub
    @Maksclub
    maksfedorov.ru
    В Redux есть некий набор принципов. Некое поведение, которое могло слегка поменяться -- лишь локальное изменение фасада и глобально на корневые принципы не влияет... изучайте в любом виде, но в первую очередь поймите эти принципы и суть

    Flux-архитектура
    Redux в картинках

    И отдельно изучите конечный автомат и паттерн State Machine, не знаю насколько они имплементированы в Flux/Redux (я не работал на самом деле с ними), но тема довольно пересекается
    Ответ написан
    Комментировать
  • Возможно ли установить FMBbCodeBundle на Symfony 4?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Используйте вот этот пулл-реквест, автор PR пишет, что работает...
    https://github.com/helios-ag/FMBbCodeBundle/pull/147

    Походу сам автор подзабил на свой бандл, сделайте форк, разместите на пакажисте
    Ответ написан
  • Как найти значение в массиве и удалить?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    Задача: нужно отфильтровать элемент массива по некому критерию (у вас это -- наличие урла в одном из его подэлементов)

    Решение: используем фильтр (функция array_filter сделано именно для этих операций), который проверит на нужное условие (наш критерий) и вернет false или true, тем самым скажет -- оставить весь элемент или удалить.

    $badUrl = "example.com";
    
    $resultArray = array_filter($startArray, function($arr) use ($badUrl) {
        return !(isset($arr['url']) && $arr['url'] === $excludeUrl);
    });


    В PHP 7.4 (когда будут доступны короткие лямбды):
    $badUrl = "example.com";
    $resultArray = array_filter(
        $startArray, 
        fn($arr)  => !(isset($arr['url']) && $arr['url'] === $excludeUrl)
    );


    Пример работы для вашего примера: https://ideone.com/eXWm3o
    Документация: https://www.php.net/manual/ru/function.array-filter.php
    Ответ написан
    1 комментарий
  • Как считать вклад в проект при долевой собственности?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Долю вынести на определенные этапы -- пересчеты доли:
    • стартовый пересчет доли,
    • привлечение новых финансов,
    • уход долевика -- его долю раскидать на всех

    Текущие вклады (не долевые) принимать как обмен работы на деньги (не дивиденды, а именно затраты). Соответственно кто сколько тратит времени, сил и какая эффективность часа -- все отражается в зарплате.

    Просто доля -- очень скользкий момент и его вплетать во все аспекты нельзя, лопнет логика почти сразу

    Если что, можно на старте выделить некий ничейный пулл из стартовой доли, который будет тратиться на "вознаграждение долей" в процессе работы. Можно придумать правила его распределения и лимиты по времени -- ну к примеру через год все нужно дораспределить.
    Этот пункт гибкий тем, что на входе у всех и есть доля и при этом не большая и походу жизни проекта можно донакинуть тем, кто делает большой вклад.

    В целом -- справедливости не добиться, но можно добиться прозрачных правил
    Ответ написан
    2 комментария