• Как результат dd() записать в переменную?

    @Flying
    dd() - всего лишь обёртка над VarDumper::dump(), так что источник получения этого html для вас очевиден.

    Любой перехват вывода в PHP делается через output bufering control.
    Ответ написан
    Комментировать
  • Как будет выглядеть запрос с QueryBuilder?

    @Flying
    Напрямую - никак, поскольку в DQL нет функции RAND(). Если хотите - можете добавить свою.

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

    @Flying
    В первую очередь отказываться от любых переходов по страницам и реализовывать все как single page application. Всю навигацию делать самостоятельно используя history api. После этого появится много вопросов о том как оптимизировать работу с DOM и памятью, их придётся решать, а также появятся ещё более сложные вопросы о responsive поведении - их тоже придётся решать.

    У instagram интересное решение, но оно сильно специфично и, думаю, подходит только для их контента.
    Ответ написан
    2 комментария
  • Какая есть бесплатная альтернатива Adobe Photoshop для верстальщика?

    @Flying
    Мы используем Zeplin, очень нравится
    Ответ написан
    Комментировать
  • Каким браузером можно заменить chrome?

    @Flying
    "Достаточно много" - это сколько? У меня сейчас в Firefox открыта 1441 (тысяча четыреста сорок одна) вкладка, по загрузке выглядит вот так:
    5f04580782afc164262030.png
    понятно что большинство вкладок неактивны, но сам факт показателен.

    Для сравнения - Chrome с 19 (девятнадцатью) вкладками:
    5f045884a1181564630052.png

    Всё это на ноутбуке шестилетнего возраста с i7 с 4 ядрами и 24Gb памяти. Оба браузера запущены два дня назад, но вообще я их никогда не закрываю, просто ноут перегружал. Весь браузинг идёт только в Firefox, в Chrome висит Gmail, несколько Google Docs и штук 5 других страничек.
    Ответ написан
  • Можно ли работать по ПСН без УСН?

    @Flying
    Если УСН есть - вы обязаны подавать налоговую декларацию (пусть даже нулевую). У меня в прошлом году налоговая счета заблокировала как раз из-за того что я подумал что декларация не нужна, в итоге решилось штрафом в 1000 рублей. Также могут попросить объяснить ситуацию из-за которой у вас по счёту есть движение, а в декларации ноль. Достаточно в свободной форме описать почему так, указать номер патента и т.п. данные.

    Обязательные взносы ИП в ПФР и т.п. тоже платить должны. 1% с суммы превышающей 300 т.р. - только если сумма предполагаемого дохода, обозначенная в патенте больше 300 т.р., т.е. исчисление идёт не по фактической сумме дохода, а по той что в патенте. Конечно если у вас ещё какие-то доходы по видам деятельности не попадающие под патент - то по ним всё считается отдельно, по правилам, применяемым для УСН.

    Можно ли убрать УСН полностью - не знаю если честно, тут прокомментировать не могу.
    Ответ написан
    2 комментария
  • Как удалить уволенного сотрудника из всех репозиториев GitHub?

    @Flying
    Если у вас аккаунт организации - то там всё просто: На основной странице организации вкладка People, дальше слева выбираете либо Members либо Outside collaborators, там выбираете нужного человека и слева внизу будет кнопка "Remove from all repositories".

    Если же у вас просто личный аккаунт - то там такого не предполагается (что естественно).

    Возможно вам стоит рассмотреть вариант перевода вашего аккаунта в аккаунт организации (Settings -> Organisations -> Transform account) если по факту это всё равно организация. Конечно в этом случае поменяется схема биллинга, но GitHub недавно сильно снизил цены для GitHub for Teams так что вполне можно пользоваться.
    Ответ написан
  • Дергается скролл на на телефоне на комп версии прокрутка нормальная?

    @Flying
    В первую очередь вам необходимо профилировать нагрузку на отрисовку через профайлер, "дёргание" означает просадку по fps, а просадка по fps означает что задачи основного потока выполнения не влезают в 16ms чтобы обеспечить 60fps.

    Если открыть сайт в Firefox, то он сразу указывает на возможную причину: "This site appears to use a scroll-linked positioning effect. This may not work well with asynchronous panning; see https://developer.mozilla.org/docs/Mozilla/Perform..."

    Быстрый просмотр показывает что это действительно так - у вас подключен jquery.sticky.js, созданный аж в 2012-м и реализующий то, что сейчас делается через position: sticky или IntersectionObserver путём навешивания обработчика на событие scroll. Это приводит к тому что на каждое движение страницы запускается JavaScript обработчик и создаёт изменения в DOM которые приводят к необходимости пересчёта стилей, а то и layout'а.

    Изменения в DOM - в целом довольно дорогая операция, а уж пересчёт layout'а - тем более, так что логично что на более слабых CPU мобильных устройств это не влезает в бюджет по времени.

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

    Таким образом начните с замены jquery.sticky.js на нормальное решение, а потом перепроверяйте результат через профайлер и смотрите что ещё вы можете выбросить. Ваша страница визуально явно не требует тех 900кб скриптов что вы на неё грузите.
    Ответ написан
    Комментировать
  • Пропорции блоков на css. Есть ли современное решение?

    @Flying
    Да, есть свойство aspect-ratio которое потихоньку начинает появляться в современных браузерах. Однако, поигравшись с ним немного - могу сказать что пока что использовать его на практике смысла никакого, придётся подождать пару лет как минимум.

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

    @Flying
    Если делать корректно - то вам стоит использовать libphonenumber, есть её порт на PHP.

    Однако если речь идёт о частном случае - то всё можно сделать намного проще:
    function formatPhone($phone)
    {
        $number = preg_replace('/\D+/', '', $phone);
        if (strlen($number) === 10) {
            $number = '7' . $number;
        }
        return [
            'display' => sprintf('+%s (%s) %s-%s-%s', substr($number, 0, -10), substr($number, -10, 3), substr($number, -7, 3), substr($number, -4, 2),
                substr($number, -2, 2)),
            'link'    => sprintf('tel:+%s', $number),
        ];
    }
    
    $phone = '(495) 123-45-00';
    $formatted = formatPhone($phone);
    
    echo "${formatted['display']}\n{$formatted['link']}\n";

    Посмотреть вживую можно здесь.
    Ответ написан
    Комментировать
  • Как работать в symfony env в продакшне?

    @Flying
    Ответ на ваш вопрос есть в документации Symfony:

    Начиная Symfony Flex 1.2 появилась команда composer dump-env prod которая создает обычный PHP файл из имеющихся у вас в .env файлах переменных, тем самым устраняя необходимость их разбора.

    Сам загрузчик Symfony Framework поддерживает загрузку переменных окружения из этого PHP файла.
    Ответ написан
    1 комментарий
  • Как в scss & преобразовать в текст?

    @Flying
    selector-parse(&), детали см. в документации.
    Ответ написан
    Комментировать
  • Как symfony загружает классы через входные данные?

    @Flying
    Этому посвящена добрая часть документации компонента Dependency Injection и Service Container'а, который является центральной частью этого компонента.

    Если совсем вкратце - то вы либо описываете сервисы вручную через конфигурацию (есть несколько поддерживаемых форматов, включая аннотации, хотя они вроде реализуются внешним пакетом) либо используете преимущества autowiring'а, предоставляя Symfony всё описать за вас (с помощью compiler pass'ов, если потребуется). Собственно основная "магия" преобразования всех источников данных в кучу компилированного PHP находится как раз в compiler pass'ах, их много и можно писать свои.

    Поскольку у вас в примере - controller's action - то здесь вся магия реализуется через обработку тега controller.service_arguments, который по-умолчанию добавляется ко всем контроллерам в конфиге сервисов.
    Ответ написан
    5 комментариев
  • Как перейти к конкретной реализации при использовании принципа Dependency inversion?

    @Flying
    Поскольку вопрос не о выполнении кода, а об IDE - то конкретный ответ будет сильно зависеть от того какая IDE используется и даже от того какой framework используется.

    По сути вопрос сводится к умению IDE (самостоятельно или через плагины) доставать информацию относящуюся к runtime'у приложения. А это в свою очередь зависит от того умеет ли конкретное приложение (или framework на котором оно построено) предоставлять эту информацию в виде, который умеет понимать IDE. Если да - будет вам счастье перехода на реально используемые реализации, нет - будете переходить на абстрактные интерфейсы и искать реализацию самостоятельно. В целом здесь начинает хорошо помогать привычка прописывать везде типы через аннотации (в вашем примере этого нет), но, конечно, у этого подхода есть свои минусы т.к. необходимо самому следить чтобы указанные типы совпадали с реальными. Здесь в свою очередь помогают ещё несколько хороших привычек связанных с процессом написания кода, но так можно глубоко забраться в offtopic...

    В качестве примера приведу пожалуй PHPStorm в связке с плагином Symfony Support в сценарии работы с Symfony. Поскольку в Symfony DI container является компилируемым и, помимо этого, он генерирует машинно-читаемое представление контейнера - через плагин IDE получает кучу информации о том что там в реальности используется в runtime'е и навигация по коду (а также масса других вещей) становится сильно проще.

    Но не всем наборам IDE + framework так везёт, к примеру поддержка приложения на ZF2, которым тоже приходится заниматься, такого не предоставляет, приходится искать всё руками. PHPStorm и здесь, конечно, очень выручает, но со сценарием Symfony конечно не сравнить.
    Ответ написан
    Комментировать
  • Doctrine как разрешить состояние гонки?

    @Flying
    По сути в вашем случае запись в базу данных является критической секцией. Соответственно вам необходима реализация любого из способов синхронизации потоков для избегания состояния гонки. Вариантов множество, но конкретно в Symfony именно для этого (и для других подобных сценариев) существует компонент Lock, он предоставляет реализации готовых примитивов синхронизации.

    Вот здесь можно посмотреть на практически готовый пример того как должен выглядеть ваш код коммита изменений с учётом использования lock'а.
    Ответ написан
    1 комментарий
  • Какие есть хорошие примеры реальных веб приложений на гитхабе?

    @Flying
    На GitHub есть такая прекрасная вещь как real world - сборник реализаций одного и того же реального приложения (по общей спецификации) на разных языках и framework'ах.

    Реализация на Go занимает второе место по популярности, а вообще там несколько реализаций backend'а на Go.
    Ответ написан
    Комментировать
  • Как правильно конфигурировать сторонний бандл в своём?

    @Flying
    Переопределение конфигурации в Symfony вне основного процесса загрузки конфигурационных файлов - не самое простое дело. Этот процесс закрыт от прямой кастомизации т.к. основной процесс загрузки и обработки конфигурации bundles целиком отдан на откуп им самим. Причина подобных ограничений в том что загрузка конфигурации - один из самых ранних этапов работы и, как и для всех подобных частей кода - там довольно мало пространства для манёвров. В связи с этим путь (и сама возможность) переопределения конфигурации будет очень сильно зависеть от того что же именно вы хотите переопределить.

    Для того чтобы лучше понять как это происходит - вам стоит подробнее изучить вопрос того как именно организована загрузка и обработка конфигурации в Symfony.

    Если вкратце:
    1. В процессе конфигурации контейнера происходит сбор данных конфигурации из конфигурационных файлов. Эти данные сохраняются в container'е через ContainerBuilder::loadFromExtension().
    2. Далее, собранные данные передаются в качестве основы в bundle extension (через метод load()). То, как именно bundle extension будет работать с собранными данными - целиком зависит от кода bundle'а, так что в целом с ними может произойти всё что угодно.

    Как вы, надеюсь, понимаете - из-за п.2 какого-то общего подхода к переопределению данных в Symfony не существует. Поэтому, как я уже писал выше, вам необходимо определиться с тем что именно вы хотите переопределить, а дальше смотреть на код загрузчика соответствующего bundle (вот он для LiipImagineBundle).

    Как видно - в случае LiipImagineBundle в целом ничего страшного не происходит, полученная конфигурация сразу отправляется в processing и потом используется для регистрации сервисов и параметров.

    Поскольку процесс сборки контейнера начинается с merge pass, то вы не можете вмешаться в этот процесс через compiler pass, как это делается обычно, однако вы можете воспользоваться вот этим куском логики для того чтобы добиться своей цели: вам достаточно определить в своём bundle собственный extension и отметить что он реализует PrependExtensionInterface. Это позволит вашему extension получить экземпляр ContainerBuilder до того как будут загружаться остальные extensions, именно это позволит вам воспользоваться ContainerBuilder::loadFromExtension() для добавления параметров конфигурации к нужному вам bundle.

    Несколько нетривиально, но должно работать :)
    Ответ написан
  • SASS placeholder может быть в любом месте кода?

    @Flying
    Вложен внутри селектора - да, может, но внешние по отношению к нему селекторы будут добавляться ко всем селекторам, использующим placeholder.
    Вложен внутри mixin'а - да, может.
    Вложен внутри @media запроса - да, может, но @media запрос будет также применяться. Также такой placeholder не может быть использован внутри другого @media - это приведёт к ошибке.

    Ответы на все эти вопросы довольно очевидны если помнить что placeholder - это по сути просто CSS селектор с возможностью дописывания к нему новых селекторов через запятую.

    Поиграться можно здесь.
    Ответ написан
    Комментировать
  • Как сделать производительнее?

    @Flying
    Не буду присваивать себе ответ, просто поделюсь ссылкой на Stack Overflow. Думаю что этот вариант будет самым производительным если не учитывать варианты предварительной обработки.
    Ответ написан
  • Почему Microsoft Edge не определяет кодировку?

    @Flying
    Так происходит потому что вы просматриваете ответ сервера в браузере вместо того чтобы просматривать его в оригинале. Конечно кажется что браузер показывает то что ему прислали, на уровне обывательского опыта это так и есть, но как разработчик вы обязаны помнить что браузер - очень сложная система и его задача - рендер присланных html страниц. Вы же пытаетесь заставить браузер интерпретировать ваш, по сути, вывод в отладочный лог не побеспокоясь о том чтобы объяснить браузеру что же вы ему прислали. Да, это удобно, но тем самым вы неосознанно полагаетесь на эвристики браузера - именно это и приводит к описанному вами эффекту.

    Если говорить более конкретно - то ваша ошибка состоит в том что вы не использовали ни одного из возможных вариантов увидеть данные "как есть" и не сообщили браузеру что за данные вы ему передаёте.

    Навскидку вы могли:
    1. Сообщить что вы посылаете текстовые данные, а не html, через header('Content-Type: text/plain; charset=utf-8');
    2. Сообщить что вы посылаете данные в кодировке utf-8 через header('Content-Type: text/html; charset=utf-8');
    3. Смотреть на исходный текст, а не на рендер страницы (Ctrl+U вроде бы)
    4. Просто вывести данные в текстовый лог через error_log($data,3,__DIR__.'/debug.log');
    Ответ написан