• Извлечь имя из текста на php возможно?

    @Flying
    Сильно зависит от реальной задачи, которая в вопросе не указана.

    Одно дело если ваш текст имеет определённый формат и вы знаете что имя в тексте точно есть и где его искать. Или вы знаете что имена могут быть не произвольными, а строго из какого-то списка. В этом случае вам, естественно, могут помочь регулярки, поиск по словарю и т.п.

    Если же речь идёт о произвольном тексте - то здесь всё сильно интереснее. Ведь имён очень много, они могут иметь разные формы (полное / краткое имя), падежи (Саша, Саше, Сашу, Сашей и т.п.), могут быть написаны с ошибками, опечатками, неоднозначностями написания (Артем / Артём), транслитом и т.п.

    Здесь я бы рекомендовал в первую очередь обращаться к специализированным сервисам. Если речь идёт о русском языке - в голову первым делом приходит, конечно же, dadata.ru и их API по стандартизации имён. Да, это стоит каких-то денег, но работает очень хорошо, могу сказать по своему опыту.
    Ответ написан
    9 комментариев
  • Как устранить некорректное отображение шрифта в Firefox?

    @Flying
    Приведённая вами ссылка показывает причину проблемы и направление для её исправления.

    Дело в том, что Rubik является variable шрифтом.

    Подключение шрифта у вас выглядит вот так:
    https://fonts.googleapis.com/css2?family=Rubik&display=swap

    а в стилях используется font-weight: 600. Если вы посмотрите внутрь CSS, загружаемой для подключения шрифта, вы (естественно) увидите там подгрузку шрифта для font-weight: 400, ведь именно это значение соответствует Regular и используется по-умолчанию.

    Таким образом вы ненамеренно создаёте ситуацию, когда вы используете начертание шрифта, которого нет. Очевидно где-то в Firefox (явно в списке зависимостей этого issue) есть проблема рендера variable fonts, причём специфичная для Windows т.к. я проверил (через BrowserStack) на MacOS и там всё нормально.

    Исправление тоже очевидно - вам необходимо корректно подключать шрифты, указывая списки нужных вам начертаний. Для вашего примера это будет:
    https://fonts.googleapis.com/css2?family=Rubik:wght@600&display=swap

    результат сразу становится корректным:

    60644c49505c3379108506.png
    Ответ написан
    1 комментарий
  • Авторизация разными ключами?

    @Flying
    Security firewalls имеют возможность указания паттерна запроса для своего применения.

    Таким образом вам достаточно определить множество firewall'ов для разных url pattern'ов и для каждого из них настроить разные условия авторизации пользователя.

    Подробности есть в документации.
    Ответ написан
    2 комментария
  • Трюк с тернарным оператором PHP?

    @Flying
    В целом то, что вам нужно скорее ближе к новой функциональности в PHP 8: throw expression. В этом случае ваш код мог бы выглядеть, к примеру, вот так:
    Auth::check() ?? throw new AuthenticationRequiredException("Вам необходимо сначала авторизоваться");

    Однако, если вы реально хотите именно такой конструкции как ваша - то здесь, конечно, тоже есть варианты, ведь начиная с PHP 7 нам доступен uniform function call syntax и, следовательно, возможны конструкции вида:
    Auth::check() ?? (function(){echo "Вам необходимо сначала авторизоваться";})();

    Конечно, я ни в коем случае не призываю делать именно так, это плохое решение, но технически возможное.

    Существенно лучшим вариантом в этом случае на самом деле будет просто создание отдельной функции, которая будет брать на себя реакцию на такие ситуации:
    function failure(string $error): void 
    {
      // Просто для того чтобы быть ближе к вашему примеру, 
      // в реальности здесь должна быть нормальная логика обработки, 
      // к примеру тот же throw new RuntimeExcepton($error);
      echo $error;  
    }

    в этом случае ваш пример сводится к:
    Auth::check() ?? failure("Вам необходимо сначала авторизоваться");

    Помимо этого обратите внимание на то, что использование null coalescing operator ?? подразумевает, что тип возвращаемого значения функции Auth::check() - это mixed|null что выглядит странно, поскольку от результата проверки ожидается тип boolean.

    В реальности здесь лучше подходит сокращённая версия тернарного оператора, т.н. elvis operator. В этом случае ваш код может выглядеть вот так:
    class Auth {
        public static function check(): bool 
        {
            return false;
        }
    }
    
    function failure(string $error): void 
    {
        // В реальности, как указано выше, лучше использовать 
        // throw new RuntimeException($error);   
        // echo используется для примера
        echo $error;
    }
    
    Auth::check() ?: failure('Вам необходимо сначала авторизоваться');

    Проверить можно здесь.
    Ответ написан
  • Почему развалился сайт после обновления хрома до 89 версии?

    @Flying
    В общем, поигравшись немного с предоставленным кодом, стало понятно следующее:

    Это явно проблема браузера, так что имеет смысл сообщить о ней разработчикам, написав bug report в их трекер.

    При этом проблема несколько не в том месте где ожидалось: элементы страницы позиционируются правильно, а вот отрисовываются некорректно:

    60521d719ba8e466217077.png

    Здесь видно, что картинка с точки зрения браузера находится в одном месте, а по факту нарисована в другом.

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

    Я подготовил пример, демонстрирующий вариант решения. По сути он сводится к добавлению стиля, который производит визуально почти незаметное изменение стилей, которое, однако, заставляет браузер перерисовать всю область:
    .chat-item__content.force-repaint .content-chat-content__message {
        opacity: 0.99;
    }

    Остаётся только "дёрнуть" CSS класс force-repaint на элементе контейнера - и всё сразу встаёт на место, поскольку осуществляется перерисовка. Например вот так:

    function forceRepaintToFixChrome89Issue() {
        if (!navigator.appVersion.match(/\sChrome\/(89|9\d)\./)) {
            // Apply only for Chrome 89 and 90+
            return;
        }
        window.requestAnimationFrame(function () {
            const e = document.querySelector('.chat-item__content');
            if (!e) {
                return;
            }
            const fr = 'force-repaint';
            e.classList.add(fr);
            window.requestAnimationFrame(function () {
                e.classList.remove(fr);
            });
        });
    }


    В примере я добавил для этого кнопку, но в реальном приложении логично делать это, например, при изменении содержимого контейнера.
    Ответ написан
    1 комментарий
  • Есть ли у Postman адекватные альтернативы написанные НЕ на electron?

    @Flying
    Не полноценно, конечно, но в какой-то степени в качестве замены можно рассматривать HTTP Client в IDE от JetBrains, к примеру в PHPStorm.
    Ответ написан
    3 комментария
  • Почему на сайте английский буквы и цифры толще чем русские?

    @Flying
    Это происходит в случае, если для отображения текста используется шрифт, не содержащий глифов для символов, использованных в тексте. В этом случае для отображения используется следующий шрифт из списка fallback шрифтов, указанных в стилях для элемента или, если его нет - то шрифт по-умолчанию для соответствующего семейства шрифтов.

    Таким образом вам необходимо проверить какие символы вы грузите в шрифте. Обычно это следствие необдуманного subsetting'а.
    Ответ написан
    1 комментарий
  • Какую библиотеку или методику лучше использовать для работы с ценами в интернет-магазине?

    @Flying
    Для работы с денежными значениями есть минимум две библиотеки:
    1. moneyphp/money
    2. brick/money

    Первая более популярная, её используют многие библиотеки. Но в последние полгода разработка встала, так что в своём проекте я решил использовать вторую из них, работает хорошо.

    Если смотреть на зависимые от них пакеты - можно найти ещё много всего интересного по этой теме.
    Ответ написан
    2 комментария
  • Как в Doctrine из Entity получить все записи?

    @Flying
    У вас некорректные mapping'и.

    У меня не очень хорошо получилось понять что вы хотели изобразить здесь... Из ваших классов следует, что интервью может быть многих типов одновременно, а не наоборот?

    Но, вне зависимости от того как это должно быть - у вас по факту всё равно должна быть связь 1:N, а не 1:1, именно здесь основная ошибка.

    Смените тип ассоциации, тогда со стороны OneToMany у вас будет коллекция entities, откуда вы их сможете получить.

    Aside note: почитайте на досуге PSR-1, PSR-2, PSR-12
    Ответ написан
    Комментировать
  • Не удается обновить плагин в composer.json?

    @Flying
    Там ведь прямо написано: у вас установлен Composer 2, а в composer.lock находится symfony/flex версии 1.4.6, работающий только с Composer 1.x.

    Либо откатывайте Composer на 1.x (чего лучше не делать без веских причин) либо обновляйте symfony/flex на совместимую версию, 1.8 или выше.

    Судя по всему этот процесс у вас идёт где-то в CI pipeline или чём-то похожем. Поэтому локальная уствновка пакета не поможет, важно чтобы нужная версия была в composer.lock.
    Ответ написан
  • Как ограничить очередь на выполнение только 200 задач в час?

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

    На самом деле, поскольку вы используете Messenger - то вы уже весьма близки к цели, поскольку Messenger перезапускает обработку сообщения в случае неполной обработки. Просто настройте retry_strategy под свои нужды и оно будет работать. Надо только мониторить failed messages.

    Также, если вы можете позволить себе использовать Symfony 5.2 - то в этой версии появился отдельный компонент RateLimiter, который специально предназначен для решения именно таких задач. Сделайте Messenger middleware для того чтобы помечать сообщения на отправку только если это разрешает RateLimiter, а для остальных бросайте RecoverableMessageHandlingException чтобы отменить обработку. Но, опять же, не забудьте про настройки retry strategy чтобы это не приводило к потерянным сообщениям.
    Ответ написан
    5 комментариев
  • Файловая структура БЭМ замедляет css?

    @Flying
    Никто не использует исходную структуру файлов напрямую.

    Посмотрите на любые сборщики frontend assets, в первую очередь на webpack. Их задача - взять все исходные файлы и сформировать asset bundles, оптимальные для загрузки на реальный сайт.

    Т.е. другими словами - у вас в исходниках может быть любая структура, которая позволяет вам писать поддерживаемый код, а дальше в действие должны вступать механизмы, которые из неё готовят реально используемые данные.
    Ответ написан
    Комментировать
  • Можно ли и нужно ли и нужно ли выносить Symfony форму в сервис или её лучше оставить в контреллере?

    @Flying
    1. В Symfony best practicies рекомендуют, да
    2. Собственно см.п.1. В частности это улучшает поддерживаемость кода, особенно в случае более-менее сложных форм или форм, требующих дополнительной логики инициализации / конфигурирования. Собственно ваш код как раз и использует форму как сервис, попробуйте скопировать содержимое класса CandidateType сюда и сравнить полученный код.
    3. Код обработки формы скорее всего выносить в сервис не стоит т.к. он прямо завязан на преобразование Request => Response, а для этого контроллеры и существуют.
    Ответ написан
    Комментировать
  • Где скачать полный дистрибутив Firefox?

    @Flying
    Любая версия, под любую платформу, всегда есть на официальном FTP.
    Ответ написан
    1 комментарий
  • График работы персонала, как записывать в базу (mysql)? какую структуру создать?

    @Flying
    Ответ kisaa в первом приближении даёт общую картину того как может выглядеть структура базы данных.

    Однако скорее всего нужно ещё учесть то, что вероятно день "по факту" будет отличаться от дня "по плану". К примеру кто-то взял отгул за свой счёт или неожиданно заболел. Поэтому, вероятнее всего, должны быть два графика - планируемый и реальный, при этом данные из "планируемого" должны будут каждый день копироваться в "реальный" с последующим внесением корректировок.

    Также, если всё это будет ещё и учитываться при расчёте заработной платы - нужно учесть ещё целый ряд параметров:
    1. Реально отработанное время, если оно влияет на расчёт зарплаты
    2. Переработки, возможно с указанием оплачиваемая / нет и мультипликатора
    3. Уважительная / неуважительная причина (вычитается из зарплаты или нет)

    Это, конечно, только навскидку, вероятно могут быть и другие факторы, но информации в вопросе недостаточно для ответа.

    Также, думаю, очень важно выяснить зачем в принципе делается подобное решение, а не используются готовые решения на базе 1С? Там всё-таки так много нюансов и сценариев что есть почти 100% шанс потратить кучу времени, набить массу шишек и породить весьма неприятные ситуации из-за ошибок расчёта зарплаты, особенно не имея опыта в этой области.
    Ответ написан
  • Что может вызывать ошибку 502?

    @Flying
    HTTP 502 - это Bad Gateway. Как видно из описания - это означает что proxy (в вашем случае, предположу, nginx) не может получить ответа от upstream'а (php-fpm в вашем случае). Приведённый вами текст ошибки это прямо подтверждает.

    Из этого можно сделать первый вывод: куда-то пропадают процессы php-fpm. Поскольку рабочие процессы php-fpm даже при падении перезапускает основной процесс php-fpm - навскидку можно сделать несколько первичных предположений:
    1. У вас просто не хватает рабочих процессов php-fpm для обслуживания имеющихся запросов. Проверяйте логи php-fpm и подстраивайте параметры pm, pm.max_children, pm.min_spare_servers
    2. Что-то роняет сами процессы php-fpm. Смотрите логи самого PHP и php-fpm на предмет записей об ошибках, устраняйте их

    Также просто понаблюдайте что происходит с процессами php-fpm на вашем сервере, возможно это даст подсказки.

    Конечно есть шанс что проблема в другом, например, действительно, в базе данных. Но здесь для принятия решения явно не хватает имеющейся информации. Однако надеюсь что все тяжёлые процессы вы запускаете не через php-fpm, а в виде фоновых процессов.
    Ответ написан
    4 комментария
  • Почему не работает xdebug c PhpStorm 2020.3 c php 7.4 и xdebug-2.7.2?

    @Flying
    Это ошибка в PHPStorm 2020.3 (WI-56500, WI-57282), уже исправлена, обновление обещают через неделю.

    Пока что можно обновить XDebug до 3.0.x или 2.9.8, это решает проблему. Либо откатиться на PHPStorm 2020.2.4
    Ответ написан
    Комментировать
  • Почему не работает шрифт на сайте в Mozilla?

    @Flying
    Так при чём здесь Firefox, у вас файла шрифта на сервере нет:
    5fd8ddf5a36e8870077851.png
    Ответ написан
  • Symfony - Как изменить форму Бандла?

    @Flying
    Если форма реализована в виде сервиса - то всё становится довольно просто. Любой сервис имеет идентификатор и вся работа с сервисом идёт по этому идентификатору.

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

    Простейший вариант: сделать свой класс формы, наследованный от оригинала (который, естественно, в конечном итоге должен реализовывать FormTypeInterface) и переопределить в нём метод buildForm() на что-то вроде:
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);
        $builder->remove('nameOfTheFieldToRemove');
    }

    далее, в config/services.yaml вы просто регистрируете свой класс как сервис с идентификатором оригинального сервиса.

    Ситуация может оказаться чуть сложнее в случае если оригинальный сервис формы не имеет публичного идентификатора. Маловероятно что такое произойдёт в случае формы, но если вдруг это так - нужно будет смотреть код формирования контейнера в целевом bundle и писать свой compiler pass для внесения нужных вам изменений.
    Ответ написан