• Symfony 4 - {{ app.request.getSchemeAndHttpHost() }} выдает http при https?

    @Flying
    Если в посмотрите в исходный код, то увидите что Request::getScheme(), которую использует Request::getSchemeAndHttpHost() вернёт вам https в зависимости от того признан ли запрос безопасным или нет методом Request::isSecure().

    Сам метод isSecure(), как видно по коду, возвращает true в двух случаях:
    1. Либо это HTTPS запрос и есть соответствующий заголовок
    2. Либо это запрос от доверенного proxy сервера и сервер передаёт информацию о том что оригинальный запрос безопасен


    Таким образом я бы предположил что у вас используется схема nginx + php-fpm и либо nginx некорректно сконфигурирован и не передаёт нужные данные либо nginx не указан в качестве trusted proxy.
    Ответ написан
    Комментировать
  • Зачем нужен then в промисах если есть await?

    @Flying
    Отвечая на вопрос в заголовке: Async functions (тот самый async/await) появился в спецификации ECMAScript только в версии ES2017, Promise же появился сильно раньше.

    Отвечая на вопрос в тексте: then() вызывается в момент когда Executor (функция, переданная в Promise) вызывает переданный ей callback для resolve'а. Вообще это как-бы самая база использования Promise, так что возможно вам стоит освежить свои знания чтением документации.
    Ответ написан
    Комментировать
  • Обновление php приложения на symfony?

    @Flying
    С точки зрения Symfony консольная команда - это просто класс, наследуемый от Symfony\Component\Console\Command\Command. Любая консольная команда - это просто запуск класса Symfony\Bundle\FrameworkBundle\Console\Application, как можно видеть в файле bin/console.

    Таким образом ничто не мешает вам "запустить консольную команду" просто создав Console\Application и запустив нужную команду в нём, сформировав правильные входные параметры.

    Изменение структуры базы данных зависит от того как именно вы ею управляете. Используете ли Doctrine или что-то ещё? Используете ли Doctrine Migrations или нет? Без этой информации дать точный ответ нельзя. Скорее всего в вашем случае было бы логичнее всего использовать Doctrine Migrations, они ведь именно для этого и созданы.
    Ответ написан
  • Что за Sass в Foundation CSS?

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

    @Flying
    Здесь есть несколько путей:
    1. Если это что-то простое и вы работаете с Symfony Framework (т.е. не со standalone контейнером) - то вам просто необходимо описать ваш сервис в конфигурации сервисов (в Symfony 4 и выше это config/services.yaml). Как это делается - описано в документации. Описание стандартного controller_resolver можно увидеть здесь, в Yaml это будет выглядеть вот так:

      services:
        controller_resolver:
          class: Full\Name\Of\Your\Implementation
          arguments:
           - '@service_container'
           - '@?logger'
         tags: 
           - {'name:':'monolog.logger', channel: 'request'}

      ваша реализация, конечно, может отличаться по зависимостям.

    2. Если это что-то более сложное - то настройка сервисов производится через compiler pass. В них вы имеете полный доступ к ContainerBuilder и можете программно сформировать в нём всё что вам необходимо. Однако сомнительно что в данном случае вам это потребуется.


    В целом все эти вопросы очень подробно разобраны в документации компонента Dependency Injection.
    Ответ написан
    Комментировать
  • Почему composer жрет ОЗУ?

    @Flying
    Проблема Composer'а с потреблением памяти при обновлении с большим количеством зависимостей - весьма известная, достаточно посмотреть в их issue tracker (1,2 и множество других).

    Jordi Boggiano, один из авторов Composer говорит (к примеру здесь) что проблема будет принципиально решена во второй версии, которая сейчас в разработке.

    Aside note: обычно команды, модифицирующие список пакетов (и требующие для этого кучу памяти) стоит запускать только при разработке (т.е. к примеру на вашей локальной машине), для деплоя проекта необходимо использовать composer install, а он много памяти не требует.
    Ответ написан
    Комментировать
  • Opensource CMS на symfony?

    @Flying
    Ответ написан
    Комментировать
  • Node SASS vs Dart SASS. Какой производительнее при каких условиях?

    @Flying
    1. dart-sass - reference implementation языка т.е. является образцом того как должен работать язык. node-sass binding libsass (реализации спецификации языка на C++) к node.js.

      dart-sass содержит в себе все последние фичи языка, к примеру там уже есть поддержка sass modules, libsass отстаёт, а node-sass отстаёт от libsass. За пруфами - сюда и сюда
    2. libsass производительнее, местами - существенно. К примеру в моих тестах интенсивная работа с sass maps в libsass примерно в 10 раз быстрее чем в dart sass. Насчёт микросекунд - у меня есть проекты которые по 15-20 секунд компилируют только стили на node-sass, на dart-sass всё намного медленнее
    3. Приведённые ссылки - сравнение тёплого с мягким. Есть реализации языков, а есть плагины для их подключения к различным сборщикам. sass - сама реализация языка, gulp-sass - binding для Gulp, sass-loader - binding для Webpack
    Ответ написан
    Комментировать
  • Symfony 3 - 5, Doctrine 2. Возможно ли используя Criteria выбрать данные из связанных таблиц одним запросом?

    @Flying
    Criteria - это просто возможность сформировать какое-то относительно сложное условие для QueryBuilder, не более того.

    Вам необходимо определиться с тем что именно вы хотите сделать:
    • Если вы хотите выбрать данные из связанных таблиц - то это можно сделать через QueryBuilder с гидрацией, к примеру, в массив. В этом случае запрос будет ровно один - тот что вы запускаете
    • Если вы хотите выбрать entities - то логика этих выборок определяется UnitOfWork и в общем может как приводить к 10 запросам так и не приводить в зависимости от содержимого identity map. Т.е., условно говоря, если бы связанные entities уже были бы в identity map - повторной выборки бы не происходило. Также выборки бы не происходило если бы вы обращались к identity полю связанной entity. Однако вы запрашиваете данные из связанной entity, причём делаете это раздельно для каждого entity, почему же вы ожидаете что Doctrine не полезет в базу за этими данными?
    Ответ написан
  • Какие есть легковесные веб-скрапперы имитирующие действия пользователя и выполняющие js?

    @Flying
    Использую связку puppeteer и pm2. Scraper запускается в несколько instances, контролируемых pm2, каждый из них использует свой puppeteer. Scraper прогоняет N циклов и корректно выходит, закрывая браузер, но pm2 настроен на автоматический перезапуск - это позволяет избежать выедания всей памяти. Всё это крутится на пачке самых дешёвых vps по 1-2 евро в месяц за штуку, такого обычно хватает на 3-4 instance'а (из-за прожорливости Chromium).

    В зависимости от специфики цели параметры могут варьироваться, в частности можно неплохо сэкономить если можно не запускать Chromium, а сделать всё средствами самой node.js, но тут надо знать специфику вашей задачи.
    Ответ написан
  • Свойство align-items: center в firefox и в chrome, как пофиксить?

    @Flying
    Это следствие разных алгоритмов обработки суб-пиксельных вычислений т.к. браузерам всё равно в конечном итоге приходится рисовать страницу на экране, состоящем из пикселей. В случае hi dpi экранов, где за один логический пиксель отвечает несколько физических задача решается проще, но для экранов с dppx=1 приходится делать выбор и вот этот выбор делается по-разному.

    На больших контейнерах это незаметно, а для маленьких - да, есть шанс того что элемент будет выглядеть "криво". Какого-то универсального решения здесь, судя по всему, нет, остаётся только подгонять, добавляя отступы в 1px туда или сюда для разных браузеров. Для того чтобы добавить CSS код только для какого-то конкретного браузера можно воспользоваться, к примеру, информацией с browserhacks, хотя, конечно, тут надо быть осмотрительным.
    Ответ написан
    Комментировать
  • Почему медиа запросы работают по-разному при сжатии окна браузера и в адаптивном режиме?

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

    В случае же если вы просто меняете размер окна браузера - такого пересчёта не происходит.
    Ответ написан
    Комментировать
  • Не могу установить composer на windows?

    @Flying
    Просто скачайте composer.phar и сохраните его куда-нибудь. Затем в любом каталоге, доступном через переменную окружения PATH создайте файл composer.bat:
    @echo off
    x:\path\to\php.exe -c x:\path\to\php.ini -f x:\path\to\composer.phar -- %*

    Естественно, замените пути на реальные. Также вам было бы хорошо иметь отдельный php.ini для Composer'а. Основные отличия:
    memory_limit = 1024M   ; Возможно даже 2048M если проекты имеют много зависимостей
    ; также необходимо отключить XDebug


    После этого можно будет обращаться к Composer'у просто через команду composer.
    Ответ написан
    Комментировать
  • Как в sass можно именовать и переиспользовать группу селекторов с их правилами?

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

    Aside note: не вставляйте код скриншотом
    Ответ написан
    Комментировать
  • Как организовать mixin по айдишникам?

    @Flying
    Ваша задача по сути сводится к динамическому обращению к переменным. Sass так не умеет. Для реализации вам необходимо сменить структуру данных и использовать maps.

    Т.е. ваш код мог бы выглядеть как-то так:

    $vars: (
      1 : #333,
      5 : #111,
      100 : #222,
    );
    
    @mixin div-color($id) {
      @if (map-has-key($vars, $id)) {
        color: map-get($vars, $id);
      }
    }

    Посмотреть в действии можно на Sassmeister.
    Ответ написан
    Комментировать
  • Как реализовать асинхронность с ReactPHP в Windows?

    @Flying
    Нет, это не из-за Windows, проблема в вашем коде, хотя она и не так очевидна как кажется, пришлось повозиться чтобы найти ответ.

    Если вкратце то основная проблема - в использовании sleep() для эмуляции задержки. Ведь в отличие от того же setTimeout() в JavaScript который нативно использует event loop, а следовательно асинхронен, sleep() в PHP - это просто задержка т.е. блокирующая операция. Ваш код не мог продолжаться дальше пока не отработает sleep(), отсюда и последовательность выполнения которая по факту практически синхронная.

    Для получения асинхронной задержки вам необходимо было использовать LoopInterface::addTimer(), тогда код начинает работать как надо.

    Немного изменённый вариант вашего кода, с форматированием и выводом задержки давал:
    [3] 3 sec
    [2] 5 sec
    [1] 6 sec

    причём и на Windows и на Linux.

    Если же использовать вариант приведённый ниже - то результат становится ожидаемым, и на Windows и на Linux:
    [1] 1 sec
    [2] 2 sec
    [3] 3 sec


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

    server.php
    <?php
    
    use React\EventLoop\Factory;
    use React\Http\Response;
    use React\Http\Server;
    
    require_once __DIR__ . '/vendor/autoload.php';
    require_once __DIR__ . '/async.php';
    
    $loop = Factory::create();
    $socket = new \React\Socket\Server($argv[1] ?? '0.0.0.0:0', $loop);
    
    $server = new Server(static function () use ($loop) {
        $test = new Async($loop);
        return $test->run()->then(static function () use ($test) {
            return new Response(
                200,
                ['Content-Type' => 'text/plain'],
                (string)$test
            );
        });
    });
    $server->listen($socket);
    
    echo 'Listening on ' . str_replace('tcp:', 'http:', $socket->getAddress()) . PHP_EOL;
    $loop->run();

    async.php
    <?php
    
    use React\EventLoop\LoopInterface;
    use React\Promise\PromiseInterface;
    
    class Async
    {
        protected $_stdout;
        /**
         * @var LoopInterface
         */
        private $loop;
    
        /**
         * @param LoopInterface $loop
         */
        public function __construct(LoopInterface $loop)
        {
            $this->loop = $loop;
        }
    
        public function __toString()
        {
            return $this->_stdout;
        }
    
        public function run(): PromiseInterface
        {
            $start = time();
            $handler = function ($x) use ($start) {
                $this->_stdout .= sprintf("[%d] %d sec\n", $x, time() - $start);
            };
            return React\Promise\all([
                $this->asyncAction(3)->then($handler),
                $this->asyncAction(2)->then($handler),
                $this->asyncAction(1)->then($handler),
            ]);
        }
    
        protected function asyncAction(int $sleep = 0): PromiseInterface
        {
            return new React\Promise\Promise(function ($resolve, $reject) use ($sleep) {
                $this->action($sleep, static function ($e, $result) use ($resolve, $reject) {
                    if ($e) {
                        $reject($e);
                    } else {
                        $resolve($result);
                    }
                });
            });
        }
    
        protected function action(int $sleep, callable $callback): void
        {
            $this->loop->addTimer($sleep, static function () use ($sleep, $callback) {
                $callback(null, $sleep);
            });
        }
    }
    Ответ написан
    Комментировать
  • Где можно взять CSS стили для prompt Mozilla Firefox?

    @Flying
    Все стили для интерфейса Firefox можно найти в их репозитории, но надо понимать что кода там очень много.

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

    Существует такая вещь как system colors, смотрите в их сторону в качестве источника информации о цветах.
    Ответ написан
    Комментировать
  • SyntaxError: Cannot use import statement outside a module?

    @Flying
    Для того чтобы использовать ECMAScript Modules в Node.js вам необходимо выполнить любое из условий, включающее поддержку этих модулей. Условия описаны в соответствующем разделе документации.

    В целом всё выглядит довольно запутанным, но это следствие необходимости сохранения обратной совместимости.
    Ответ написан
    Комментировать
  • Есть ли аналог laravel's GlobalScope у doctrine или symfony?

    @Flying
    Я на Laravel не писал, но судя по документации это какой-то аналог дополнительного фильтра который можно навесить на запрос. Если я прав, то ближайший аналог - фильтры.
    Ответ написан
    Комментировать