• Что и зачем "Symfony Workflow Component"?

    riky
    @riky
    Laravel
    о компоненте узнал из вашего вопроса, довольно интересный.

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

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

    полистав пример тестового приложения понял что статусы хранятся в поле marking у сущности https://github.com/lyrixx/SFLive-Paris2016-Workflo...
    поле имеет тип json_array. надо бы запустить этот тестовый проект, погонять. например для меня пока не очевидно как сделать фильтрацию сущностей по этому статусу, неужели отдельное поле/я добавлять и в подписчиках его менять.

    также можно полистать исходники самого бандла, вот например метод для смены статуса https://github.com/symfony/workflow/blob/master/Wo...
    Ответ написан
    2 комментария
  • Как работает WebSocket(Comet)?

    abyrkov
    @abyrkov
    JavaScripter
    Вы точно смотрели туда? Модель Comet однонаправленая: от сервера к клиенту, а это, очевидно, не то, что вам нужно. Но...
    Модель Comet реализуется в клиентской части стандартом Server-Sent Events. Суть ее довольно проста: сервер отправляет строки во всремя создания события. А браузер уже заботится, что бв соединение не прерывалось. Реализация на стороне клиента:
    var ticker = EventSource('our.php');
    ticker.onmessage = function(e) {
      console.log(e.type);
      console.log(e.data);
    }

    Со строны сервера должны приходить строки такого вида:
    event: hello
    data: Hello, World!

    Обратите внимание на последнюю строку. Она, собственно говоря, создает событие.
    Матчасть: Comet, EventSource

    Пример:
    var ticker = EventSource('changes.php');
    ticker.onmessage = function(e) {
      // Реагируем только на события изменений
      // Нам приходит id + ' ' + html, для примера. Мы очищаем данные split'ом, но настоятельно
      // рекомендую придумать свой формат
      if(e.type == "messagechange") data(e.data.split(' ')[0], e.data.split(' ').slice(1).join(''), e.data);
    }
    var elements = document.getElementsByClassName('message');
    function data(id, data) {
      // Нам приходит id элемента, по которому мы определяем, к какому элементу изменения
      // и дата. В данном примере, id определяет номер элемента, но вы можете изменить эту
      // логику на свою
      elements[+elNum].innerHTML = data;
    }

    Пример данных от бэкенда
    event: messagechange
    data: 0 It works!


    WebSocket - это как раз двунаправленая связь. Работают они по особому протоколу. Не буду вникать в технические детали, однако соединение постоянное(чего не скажешь про SSE). Реализацию на клиенте берет коструктор WebSocket. Пример:
    var socket = new WebSocket('ws://ws.example.com/res');
    socket.onopen = fucntion(e) {
      // Socket opened
    }
    socket.onclose = function(e) {
      // Socket closed
    }
    socket.onerror = function(e) {
      // Error!
    }
    socket.onmessage = function(e) {
      console.log(e.data);
    }
    socket.send('Hello, server!');
    socket.close();

    Матчасть: MDN
    Ответ написан
    9 комментариев