• Почему на node.js до сих пор нету фреймворка уровня symfony или zend?

    smetdenis
    @smetdenis
    Потому что в ноде до сих пор нет хоть каких-то общепринятых стандартов как PSR в PHP (или даже PEAR). И этого не будет при текущем бурном развитии самого языка. В PHP хоть и меняется синтаксис между версиями, но не так значительно, чтобы прибегать к таким монстрам как babel.

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

    Когда появятся стандарты то им будут следовать все фундаментальные инструменты, например как composer+PSR4 (autoload).

    Как можно выработать общие железобетонные принципы и написать что-то большое, когда буквально раз в год все становится с ног на голову и выходит очередной ES-стандарт, а популярные библиотеки могут легко сломать обратную совместимость? =) Уж не говоря про чехарду технологий.

    Думаю обязательно появятся, как только там наверху авторы "угомонятся" и разработчики смогут спокойно кодить, а не подгонять полдня версии пакетов.
    Ответ написан
    Комментировать
  • Какой правильный подход для найма первых работников в веб-студию?

    opium
    @opium
    Просто люблю качественно работать
    нанимайте просто по одному
    Ответ написан
    Комментировать
  • Как в Symfony 5 проверить роль любого пользователя?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    Security работает именно с залогиненым пользователем. Если вам надо проверить другого пользователя, то надо делать что-то вроде:
    /** @var UserInterface $user */
    /** @var RoleHierarchyInterface $hierarchy */
    
    $roles = $hierarchy->getReachableRoleNames($user->getRoles());
    $result = array_search('ROLE_GROUP_MANAGER', $roles) !== false;
    Ответ написан
    1 комментарий
  • Как взаимодействовать с Yandex Object Storage через JS?

    @Borigaldi
    Примерно такой код для Node.js. Доки здесь

    const AWS = require('aws-sdk');
    require('dotenv').config(); // для получения переменных из окружения Node.js
    
    class YandexCloud {
    
      constructor () {
        this.aws = new AWS.S3({
          endpoint: 'https://storage.yandexcloud.net', 
          accessKeyId: process.env.YA_STORAGE_ACCESS_KEY, // берем ключ из переменной окружения
          secretAccessKey: process.env.YA_STORAGE_SECRET_KEY, // берем секрет из переменной окружения
          region: 'ru-central1',
          httpOptions: {
            timeout: 10000,
            connectTimeout: 10000
          },
        });
      }
    
      upload = async ({file,path,fileName}) =>  {
        try {
          const params = {
            Bucket: 'название', // название созданного bucket
            Key: `${path}/${fileName}`, // путь и название файла в облаке (path без слэша впереди)
            Body: file, // сам файл
            ContentType: 'text/plain', // тип файла
          }
          const result = await new Promise(function(resolve, reject) {
            this.aws.upload(params, function(err, data) {
              if (err) return reject(err);
              return resolve(data);
            });
          });
          return result;
        } catch (e) {
          console.error(e);
        }
      }
    }
    
    const YaCloud = new YandexCloud();
    YaCloud.upload({
      file: '', // файл
      path: 'путь/в/облаке',
      fileName: 'файл.txt',
    })
    Ответ написан
    Комментировать
  • Как сделать эффект подпрыгивания не при наведении?

    Для этого даже JavaScript не нужен
    www.w3schools.com/cssref/css3_pr_animation.asp
    Обрати внимание на параметр animation-iteration-count
    Ответ написан
    Комментировать
  • Почему Nuxt в Docker не следит за изменением файлов?

    @daniel_wesson
    Тоже столкнулся с такой проблемой. Откопал решение, которое, в принципе, рабочее: добавить в nuxt.config.js следующее:
    watchers: {
      webpack: {
        aggregateTimeout: 300,
        poll: 1000
      }
    }

    Webpack каждую секунду будет проверять изменился ли файл. Подробнее об этом в доке.
    Может кому это решение пригодится
    Ответ написан
    Комментировать
  • Что и зачем "Symfony Workflow Component"?

    Добавлю к ответу Юрий:

    Одна из основных вкусняшек Workflow в подобных компонентах/фреймворках/системах - это инверсия контроля над сущностями и прочими моделями. Клиент не изменяет статус сущности через условный сеттер setStatus('approved') с дополнительными сайд-эффектами, а осуществляет переход (действие, процесс) apply('approve'), одним из сайд-эффектов которого является изменение статуса. Вроде бы разница незначительная с технической точки зрения, но бизнес-заказчики обычно оперируют процессами, в которых задействованы сущности, а не операциями самих сущностей, они говорят "в результате подписания договора ему присваивается статус "действующий"", а не "присвоение договору статуса "действующий" означает что договор подписан". Когда их требование меняется на "в результате подписания договора ему присваивается статус "подписан" (которого раньше не было), а "действующий" присваивается когда менеджер его утвердит", то нам, разработчикам, значительно меньше приходится менять и чаще всего не код даже, а конфиги, код только дописывается, но не меняется, ну или меняется значительно в меньшей степени.
    Ответ написан
    Комментировать
  • Builder: нужна ли фабрика, или можно в билдере оставить метод?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    1) создать класс-обертку для этого логгера, сконфигурировать его внутри (в методе init, метод init засунуть в конструктор)
    2) изучить реализацию service container в текущем фреймворке/приложении и передавать уже сконфигурированный логгер через dependency injection в нужные классы
    Ответ написан
    Комментировать
  • Как выполнить функцию один раз?

    @chirskiy_mixail
    Очень давно занимаюсь версткой, имею огромный опыт
    Например задать переменную, и изменить ее при 1 достижении

    var isResizeble = false;
    
    if(!isResizeble) {
     // Ваша ф-ция которая что то делает, отработает 1 раз и все
    
    isRezeble = true;
    }


    Надеюсь смысл ясен, иными словами установить флаг и проверять
    Ответ написан
    1 комментарий
  • Как определить что оператор разговаривает?

    @Drill
    Игорь,
    В случае с AMI, если я это буду делать в PHP мой скрипт захлебнётся от потока информации

    В случае с AMI при аутентификации надо указать Events: off, и никто тогда не захлебнется, астериск вообще будет нем, как рыба...
    Action: Login
    ActionID: 1
    Username: ВАШ_ЛОГИН
    Secret: ВАШ_ПАРОЛЬ
    Events: off


    а затем достаточно послать одну команду :
    Action: Command
    Command: core show hints


    В ответ получите пару десятков строк (или сколько там у вас пиров) такого вида :
    240@ext-local           : SIP/240,CustomPresen  State:Idle            Watchers  0
    241@ext-local           : SIP/241,CustomPresen  State:InUse           Watchers  0
    242@ext-local           : SIP/242,CustomPresen  State:Unavailable     Watchers  0


    Осталось распарсить два поля:
    1. в первом номер пира (оператора) - например 241
    2. в третьем поле его состояние - InUse (занят)
    Ответ написан
    2 комментария
  • Настройка WSS на какой системе удобнее?

    Sanasol
    @Sanasol
    нельзя просто так взять и загуглить ошибку
    Ubuntu или NGINX?

    Windows или фотошоп

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

    gbg
    @gbg Куратор тега Linux
    Любые ответы на любые вопросы
    Если хотите скандалы, интриги, расслеования - снимите образ, потом отформатируйте и накатите бекап.

    Не хотите - просто разверните бекап.

    Нет бекапа - ССЗБ.
    Ответ написан
    Комментировать
  • Можно ли проксировать WebRTC + Asterisk?

    Berkutman
    @Berkutman
    upstream asterisk {
      server 127.0.0.1:8088;
    }
    server {
      ...
      location /ws {
        proxy_buffers 8 32k;
        proxy_buffer_size 64k;
        proxy_pass http://asterisk/ws;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 999999999;
      }
    }


    https://www.bidon.ca/fr/notes/asterisk-webrtc
    https://wiki.asterisk.org/wiki/display/AST/Configu...
    https://wiki.asterisk.org/wiki/display/AST/WebRTC+...
    Ответ написан
    Комментировать
  • Как мне в symfony связать значение роли пользователя из json с таблицей roles?

    @sl0
    Если роль хранится в json, то туда можно добавить любую нужную информацию.
    Ответ написан
    Комментировать
  • Как отделить бизнес-логику?

    Ни Yii, ни Laravel не следуют DDD. Не заморачивайтесь. Делайте или в рамках фреймвока, или если знаете DDD, то в рамках него. Только вас погонят "лопатой по спине".

    Сейчас в издательстве Питер вышла жёлтая книжка с пчёлкой. Она хорошая. Это не реклама. Достаточно придерживаться её.
    Ответ написан
    3 комментария
  • Как отделить абстракцию от реализации?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    interface ExecutorInterface
    {
        public function exec(): string;
    }
    
    class ConcreteImplementationA implements ExecutorInterface
    {
        public function exec(): string
        {
            return 'A';
        }
    }
    
    class ConcreteImplementationB implements ExecutorInterface
    {
        public function exec(): string
        {
            return 'B';
        }
    }
    
    class VariantExecutor
    {
        public function __construct(private ServiceLocator $locator)
        {
        }
    
        public function exec(string $variant): string
        {
            return $this->locator->get($variant)->exec();
        }
    }
    
    class Controller
    {
        public function call(VariantExecutor $executor, string $variant): Response
        {
            return new Response($executor->exec($variant));
        }
    }

    #services.yaml
    app.executor.locator:
        class: Symfony\Component\DependencyInjection\ServiceLocator
        arguments:
            -
                a: App\ConcreteImplementationA
                b: App\ConcreteImplementationB
        tags:
            - { name: container.service_locator }
    Ответ написан
  • Как сравнить два объекта?

    @zordec
    function deepEqual(obj1, obj2) {
      if (typeof obj1 !== "object" || typeof obj2 !== "object") {
        return false;
      }
      if (obj1 === undefined || obj2 === undefined) {
        return false;
      }
      if (obj1 === null || obj2 === null) {
        return false;
      }
      let obj1Keys = Object.keys(obj1);
      let obj2Keys = Object.keys(obj2);
      if (obj1Keys.length !== obj2Keys.length) {
        return false;
      }
      for (let i = 0; i < obj1Keys.length; i++) {
        if (obj2Keys.includes(obj1Keys[i]) === false) {
          return false;
        }
      }
      for (let i = 0; i < obj1Keys.length; i++) {
        if (typeof obj1[obj1Keys[i]] === "object") {
          return deepEqual(obj1[obj1Keys[i]], obj2[obj1Keys[i]]);
        }
        if (obj1[obj1Keys[i]] !== obj2[obj2Keys[i]]) {
          return false;
        }
      }
      return true;
    }
    Ответ написан
    Комментировать
  • Как объявить подсказку для событий во Vue?

    Aetae
    @Aetae
    Тлен
    В Vue 3 можно декларировать. А пока можно использовать web-types.
    Ответ написан
    Комментировать
  • Как исправить ошибку в mysql бекап?

    BorLaze
    @BorLaze
    Java developer
    GRANT PROCESS ON *.* TO 'admin_root'@'localhost'
    Ответ написан
    6 комментариев
  • Как выбрать последнюю запись с внешним ключом, по которому фильтруем?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Для MySQL 8
    WITH `cte` AS (
      SELECT *,
             ROW_NUMBER() OVER (
               PARTITION BY `contact_id` ORDER BY `created_at` DESC
             ) AS `row`
        FROM `contacts_history`
        WHERE `created_at` BETWEEN '2021-02-05 15:56:57' AND '2021-02-20 13:44:09'
    ) SELECT *
      FROM `cte`
      WHERE `status_id` = 37
        AND `row` = 1

    Только учитывайте, что это будут последние записи в заданном интервале. Если статус контакта менялся позже, то это не будет отражено в запросе.
    Ответ написан
    2 комментария