• Запросы с одного сервера через другой по конкретным доменам – как?

    saboteur_kiev
    @saboteur_kiev Куратор тега Ubuntu
    software engineer
    В телеграме есть возможность указать работу через прокси.
    Есть в инете инструкции как поднять прокси сервер.
    Настраиваете на П прокси для телеграма, на К настраиваете телеграм клиента (бота) на работу через конкретный прокси. Можно прокси сделать с авторизацией, либо вообще по айпишнику сделать доступ, чтобы не раздавать.

    P.S. сокращения делают ваш вопрос наполовину нечитаемым.
    Ответ написан
  • Как настроить smtp proxy балансировщик с подменой логина?

    @q2digger
    никого не трогаю, починяю примус
    Если я правильно понял задачу , надо чтобы клиенты, через smtp-proxy попадали на "свои" бакэнды?
    Опция в postfix называется transport_maps.
    Вот выдержка из документации

    # The optional transport(5) table specifies a mapping from
    # email addresses to message delivery transports and next-
    # hop destinations. Message delivery transports such as
    # local or smtp are defined in the master.cf file, and next-
    # hop destinations are typically hosts or domain names. The
    # table is searched by the trivial-rewrite(8) daemon.
    #

    А вот пример:
    Делаем конфиг /etc/postfix/transport , содержимое такое:

    apupkin@example.com mail01.example.com
    vtaburetkina@example.com mail02.example.com

    и т.д.

    Далее делаем:
    postmap /etc/postfix/transport

    И в конфиге /etc/posftix/main.cf добавляем чтото типа:

    transport_maps = hash:/etc/postfix/transport

    Релоад постфикс, проверяем, смотрим логи.
    Ответ написан
    1 комментарий
  • Динамические данные в JsonApi от Doctrine-Модели – как?

    BoShurik
    @BoShurik Куратор тега Symfony
    Symfony developer
    Я за первый вариант:
    - Инжектим в OrderNormalizer репозиторий с избранным
    - При сериализации сущности вытаскиваем все избранное залогинненого пользователя и кладем в кеш
    - При последующей сериализации за избранным уже идем в кеш, а не в БД
    Ответ написан
    3 комментария
  • Однодневкам-одновопросникам тостера запретить задавать вопросы?

    dom1n1k
    @dom1n1k
    Ну зашибись идейка!
    Необходимость что-то спросить часто (почти всегда) возникает внезапно. И ты такой идешь за помощью, а тебе херакс - сначала сам ответь на 10 вопросов! Прям сейчас ответить?.. У меня задача горит, а вы меня грузите своей дедовщиной? 9 из 10 просто уйдут, 1 нафлудит мусора в 10 вопросах, чтобы пройти фильтр.

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

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Ну, в нашем царстве все гос сайты пишут на друпале, как ни странно. Он прост как цмс, он модульный и пахнет елкой основан (частично) на симфони 2, то есть почти чистый мвц (подробнее тут). Если ничего не нужно допиливать - готовая цмс - только настроить и картинки поменять. Если что-то допиливать - разработчиков симфонии много, ну, в смысле они есть.
    Если все же катать что-то совершенно особенное и свое - ларавел как самый низкий по порогу вхождения, соответственно не очень дорогой в разработке.
    Ответ написан
    7 комментариев
  • Как быстро сформировать сложный Excel-документ?

    Если вам нужна просто табличка (без стилей, макросов и прочих свистелок), то может имеет смысл формировать CSV?
    Если несколько вкладок надо, то уже можно подумать.
    Но в VBA порой туго с обратной совместимостью и можете напороться на то, что скрипт перестанет работать через пару лет в новой версии офиса.
    Ответ написан
    Комментировать
  • Как быстро сформировать сложный Excel-документ?

    PQR
    @PQR
    На тостере есть похожий вопрос по оптимизации генерации Excel из PHP, посмотрите, там дельные ответы: Оптимизация генерации excel из php?

    Расскажу также свою историю, не про запись, а про чтение большого Excel файла (несколько десятков страниц, на каждой странице 1000+ строк * 30 столбцов). PHPExcel работал но медленно. Классическая PEAR библиотека оказалась быстрее в 2 раза, но и она в итоге отрабатывала за 60+ секунд (время чтения xls файла в память PHP). Поскольку входной формат файла был известен заранее, я открыл исходники и начал выпиливать оттуда фишки, которые мне не нужны, удаляя лишний код! Некоторые функции вручную инлайнил. В итоге время чтения сократилось до 5 секунд. Резюме: если формат зафиксирован и гибкость не нужна, узкозаточенное решение (после некоторых усилий по заточке) даст хороший результат!

    Также на этот вопрос есть классический ответ на StackOverflow, который собрал все альтернативы: stackoverflow.com/questions/3930975/alternative-fo...

    Процитирую здесь, чтобы далеко не ходить или на случай если stackoverflow.com будет не доступен (валидность всех ссылок не проверял):

    For Writing Excel

    PEAR's PHP_Excel_Writer (xls only)
    php_writeexcel from Bettina Attack (xls only)
    XLS File Generator commercial and xls only
    Excel Writer for PHP from Sourceforge (spreadsheetML only)
    Ilia Alshanetsky's Excel extension now on github (xls and xlsx, and requires commercial libXL component)
    PHP's COM extension (requires a COM enabled spreadsheet program such as MS Excel or OpenOffice Calc running on the server)
    The Open Office alternative to COM (PUNO) (requires Open Office installed on the server with Java support enabled)
    PHP-Export-Data by Eli Dickinson (Writes SpreadsheetML - the Excel 2003 XML format, and CSV)
    Oliver Schwarz's php-excel (SpreadsheetML)
    Oliver Schwarz's original version of php-excel (SpreadsheetML)
    excel_xml (SpreadsheetML, despite its name)... link reported as broken
    The tiny-but-strong (tbs) project includes the OpenTBS tool for creating OfficeOpenXML documents (OpenDocument and OfficeOpenXML formats)
    SimpleExcel Claims to read and write Microsoft Excel XML / CSV / TSV / HTML / JSON / etc formats
    KoolGrid xls spreadsheets only, but also doc and pdf
    PHP_XLSXWriter OfficeOpenXML
    PHP_XLSXWriter_plus OfficeOpenXML, fork of PHP_XLSXWriter
    php_writeexcel xls only (looks like it's based on PEAR SEW)
    spout OfficeOpenXML (xlsx) and CSV
    Slamdunk/php-excel (xls only) looks like an updated version of the old PEAR Spreadsheet Writer

    For Reading Excel

    php-spreadsheetreader reads a variety of formats (.xls, .ods and .csv)
    PHP-ExcelReader (xls only)
    PHP_Excel_Reader (xls only)
    PHP_Excel_Reader2 (xls only)
    XLS File Reader Commercial and xls only
    SimpleXLSX From the description it reads xlsx files , though the author constantly refers to xls
    PHP Excel Explorer Commercial and xls only
    Ilia Alshanetsky's Excel extension now on github (xls and xlsx, and requires commercial libXL component)
    PHP's COM extension (requires a COM enabled spreadsheet program such as MS Excel or OpenOffice Calc running on the server)
    The Open Office alternative to COM (PUNO) (requires Open Office installed on the server with Java support enabled)
    Nuovo's spreadsheet-reader (csv, xls, xlsx, and ods)
    SimpleExcel Claims to read and write Microsoft Excel XML / CSV / TSV / HTML / JSON / etc formats
    PHPExcleReader Is just a ZIP with an old version of PHPExcel
    Akeneo Labs Spreadsheet Parser OfficeOpenXML (.xlsx) and CSV files
    spout OfficeOpenXML (xlsx) and CSV
    xhook's php-spreadsheetreader Claims to do most formats
    Ответ написан
    Комментировать
  • Как использовать Принцип подстановки Барбары Лисков применительно к PHP?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    В PHP отсутствует Double Dispatching и перегрузка методов


    Double Dispatch в PHP:

    class Foo {
        // ...
        public function makeSomeStuff(Bar $bar)
        {
             $bar->doStuff($this->someData); // double dispatch!
        }
    }


    Перегрузка методов:

    class Foo {
        public function foo() {}
    }
    
    class Bar extends Foo {
        public function foo() {} // перегружен!
    }


    и в ответ на отличающуюся от базового класса/интерфейса сигнатуру он вывалится с ошибкой


    то что вы хотели сделать называется ad-hoc полиморфизм, и он есть из коробки в любом языке программирования с динамической типизацией. Достаточно просто не указывать явно сигнатуру, все довольно просто) Ну и да, минус этого то что это не явно и в рантайме. Для языков со статической типизацией явная "перегрузка" нужна только для того что бы компилятор мог построить таблицы диспетчеризации вызовов.

    Но решить проблему как-то нужно


    Перегрузка методов в наследниках с изменением сигнатуры это как раз таки нарушение принципа подстановки барбары лисков (LSP для сокращения).

    > Сервисы должны имплементировать какие-то общие методы, но помимо этого у них есть и специфичные методы.

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

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

    Однако каждый из хендлеров может не работать с конкретной реализацией сервиса.


    Значит полиморфизм в нашем случае пошел погулять. Есть куча решений данной проблемы, в частности Chain of responsibility.

    > Visitor. Предполагает наличие в каждом из хендлеров методов типа handleService1(Service1 $service) и handleService2(Service2 $service), при этом один из методов остается пустым

    зачем так усложнять то? У вас должен быть снаружи только один публичный метод а внутри уже реализация сама разберется. Ну то есть если хотите - можете внутри сделать два приватных метода но это так же странно.

    > Массив маппинга, который говорит, какой хендлер может обрабатывать какой из сервисов.

    Опять же излишнее усложнение.

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

    Дальнейшие варианты возможны только после того, как вы опишите на высоком уровне что вам нужно сделать. Ну то есть не то к чему вы пришли а почему вы к этому пришли и какая задача стояла изначально.
    Ответ написан
    8 комментариев
  • Как по-человечески должен выглядеть такой js(jquery) код?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Скорее всего, делать классы view(1/2/3) нет смысла, вполне можно обойтись одним. И view(1/2/3)--active тоже лишние. Единственное, что нужно - менять класс у обёртки каталога. Тогда код становится таким:
    $('.view').click(function(){
       var $el = $(this),
           type = $el.data('view-type');
    
       $('.view.view--active').removeClass('view--active');
       $el.addClass('view--active');
    
       $('.maicol-catalog').removeClass('catalog-view1 catalog-view2 catalog-view3');
       $('.maicol-catalog').addClass('catalog-view' + type);
    });

    Ну и 1/2/3 нужно заменить на осмысленные слова: table/cards/feed или что там у вас по смыслу.
    Ответ написан
    Комментировать
  • Проект со сложной логикой на Symfony – как проектировать? Примеры?

    @saritskiy
    Чтобы не размазывать ACL и не увеличивать размеры контроллеров до безумного размера взгляните на аспекты. https://github.com/goaop/goaop-symfony-bundle. По поводу того что постоянно придется дергать какие-то данные и постоянно их пересчитывать и прочее, посоветую взглянуть в сторону тарантула. Высоко нагруженные сервисы типа Badoo и Mail.ru хранят в нем пользовательские сессии и прочую горячую информацию.
    Ответ написан
    1 комментарий
  • Нужно ли абстрагироваться от фреймворка?

    @springimport
    Коротко: не советую.

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

    by25
    @by25
    Веб-разработчик
    Берите 3.1.x и после выхода мажорной версии обновляйтесь. Как правило api стабильный и миграция совсем безболезненная.
    После можно остановиться на lts-релизе 3.4
    Ответ написан
    Комментировать
  • Проект со сложной логикой на Symfony – как проектировать? Примеры?

    Adamos
    @Adamos
    > способ сделать плоским наследование групп типа "manager может делать всё то, что и customer, но ещё вон то и вот это"? Резоннее и более поддерживаемо будет дублировать все права?

    Имхо, все эти заморочки с наследованием групп нужны только для удобства администрирования. И место им - в админке, а не в группах. Сделайте удобное редактирование групп, со сравнением с другой группой. Или шаблоны, позволяющие применить пользователю сразу несколько групп. Даже более сложные вещи типа того, что группа менеджеров не может быть применена в отрыве от кастомеров.
    Но все это - не в группах, а именно в этом разделе админки. Назначаются-то группы далеко не так часто, как используются. А вот для использования им стоит быть максимально простыми.
    Ответ написан
    1 комментарий
  • Проект со сложной логикой на Symfony – как проектировать? Примеры?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Как хранить бизнес-логику чтобы модели не превратились в монстров из десятков тысяч строк?

    Тут не совсем модели. Entity - это просто объект данных, умеет хранить их в себе и бросать исключения, если не правильные данные вставляете, все. Repository - умеет работать со своим Entity И БД.

    БЛ находится в классах сервисах.

    Читал про Command Bus где, если правильно понял, на каждое действие в системе – свой класс?

    Вообще под каждое дествие - не обязательно, тут нужно руководствоваться здравым смыслом.

    Как их организуете (их тогда будут сотни)?

    Иерархически. Путь к классу должен быть "понимаем".

    Есть ли смысл выносить каждую доменную модель в модуль/микросервис, хранить всю связанную логику где-то там внутри, а с остальными общаться по внешнему API?

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

    За ответы в клиентскую часть – отдельный сервис-фронтенд?

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

    Каков оверхед?

    Ничтожный.

    Используют ли такое на практике?

    Да

    Какие подводные камни?

    Следствием серьезной декомпозиции в любом случае будут лишние сущности, чем раньше от них будете избавляться - тем лучше.

    Как не превратить кидание/получение событий типа PostBeforeEdit/PostBeforeEditHandler в "callback hell"?

    Если есть возможность отказаться от событийной модели - часто лучше отказаться.
    Листнеры доктрины конечно штука мощная, но работает не всегда очевидно.

    Функционал "PostBeforeEdit/PostBeforeEditHandler" часто дешевле и проще вынести в сервис, но опять же руководствуйтесь здравым смыслом.

    ACL Где храните указанную логику?

    Если ACL будет не тривиальный - готовьте себя к тому, что он будет размазан по уровню контроллеров.

    Какие структуры для описанного выше – best practice?

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

    В моём понимании это выглядит как куча трёхмерных кубов доступа "crud – group – entity – field", как это сделать более плоским пока только одна идея – делать кучу таблиц many-to-many.

    Гибкая настройка вплоть до каждого поля 90% что не нужна. Если можно свести к понятию скопов прав - сделайте это.
    Структуру можно предлагать только зная ваш проект.

    Версионирование. Как вы версионируете подобные проекты?

    Semver.

    А если нужна "N-1" рабочая версия на продакшене?

    Значит на прод попадает ваша версия с тегом "N-1"))

    Есть ли смысл разделять версии в рамках единой кодовой базы проекта и как (неймспейсы, конфиг, модуль, что-то ещё)?

    Храните яйца в отдельных корзинках. Если модуль развивается полностью отдельно и может быть вынесен как зависимость проекта в vendor - делайте.

    И, самое главное – как всё это совместить?

    • РУКОВОДСТВУЙТЕСЬ ЗДРАВЫМ СМЫСЛОМ
    • Принимаете жесткие соглашения по правилам написания кода, например такие
    • Постарайтесь убедить бизнес в том, что без покрытия кода автотестами будет дороже, нестабильней и дольше. + Пишите тесты. Если объем тестов в 4 раза больше кода, который они тестируют - это норм. У меня бывали случаи, когда для критичного функционала тестов было в ~16 раз больше, чем кода.
    • Жесткие, обязательные кодревью.
    • Если задача крупная - декомпозируйте ее.
    • Технический долг - возвращайте обязательно И как можно скорее.
    • Перед тем как писать код для работы с внешним сервисом - имеет смысл написать его эмулятор.
    • Спешите только в случае серьезных проблем на проде)). Фичи "на вчера" отличаются от фич "на потом" только приоритетом выполнения, более ничем.
    Ответ написан
    6 комментариев
  • Проект со сложной логикой на Symfony – как проектировать? Примеры?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Как их организуете (их тогда будут сотни)?


    Раскидываю по неймспейсам. Скажем все действия относящиеся к юзерам находятся в папке Users.

    Только вы учитывайте что CQRS это прикольно но особо не нужно. К примеру это сразу подразумевает что вы используете UUID вместо автоинкрементов и прочей чуши. Можете сделать хотя бы как Дядя Боб предлагает в своей Clean Architecture. Просто сервис на каждое действие.

    Есть ли смысл выносить каждую доменную модель в модуль/микросервис


    Если вы не умеете писать монолиты так что бы потом все было относительно нормально, думать о микросервисах не стоит. Так же как делить проект на модули когда вы еще слабо представляете как прописывать границы этих модулей.

    Раньше для дополнительных действий мне достаточно было использовать что-то вроде beforeUpdate/afterCreate модели.


    ну а сейчас вы будете эти вещи в сервисы пихать. Причем возможно не в один сервис. Вообще старайтесь не делать "хуков" и не будет с ними проблем. Есть к примеру DomainEvents такая штука, ну и можно все эти "дополнительные действия" в хэндлерах команд делать.

    Как не превратить кидание/получение событий типа PostBeforeEdit/PostBeforeEditHandler в "callback hell"?


    Просто забудьте об этих ивентах.

    ACL. Где храните указанную логику?


    Есть в симфони security vouters, а дальше все зависит от того что вы делаете.

    Как вы версионируете подобные проекты? А если нужна "N-1" рабочая версия на продакшене?


    git + docker теги в мастере. Ветки нужно плодить только тогда, когда у вас система деплоится кастомерам и нужно поддерживать сразу кучу версий. Называется это gitflow.

    На какие проекты (точнее, на код) можете посоветовать посмотреть для лучшего понимания? Ссылки на репозитории?

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

    p.s. почитайте книжки:

    - Эрик Эванс - Предметно ориентированное проектирование
    - Крэйг Ларман - Применение UML 2.0

    p.p.s. Все ваши загоны не имеют никакого смысла если вы не будете пользоваться практиками вроде Test-Driven-Development, ну или хотя бы покрывать систему интеграционными тестами. Без этого вы не сможете делать частный мелкий рефакторинг, а без этого ваша система быстро превратится в легаси.
    Ответ написан
  • Какую выбрать версию Symfony для нового большого проекта?

    slimus
    @slimus
    Symfony, Golang
    Stepan513 А вы уверены что те бандлы вам понадобятся? У себя новые проекты стараемся начинать на 3.х версии, даже если нет официальных бандлов с поддержкой 3.x, портируем их и отдаем в сообщество.
    Ответ написан
    Комментировать
  • "Сильные" книги по Symfony и архитектуре приложений?

    by25
    @by25
    Веб-разработчик
    1. Мэтт Зандстра "PHP: объекты, шаблоны и методики программирования" - Врубиться в ООП
    2. Эрик Фримэн и ко "Паттерны проектирования" (Head First) - Влюбиться в ООП
    3. Эрик Эванс "Предметно-ориентированное проектирование" - научиться проектировать сложные системы
    4. Крэг Ларман "Применение UML 2.0 и шаблонов проектирования" - про проектирование, глубокое понимание ООП
    Ответ написан
    Комментировать
  • Есть ли перспективы у фреймворка PHP Phalcon?

    Yeah
    @Yeah
    >> Есть ли перспективы у фреймворка PHP Phalcon

    Да

    >> Существуют ли сегодня в продакшене проекты написанные на Phalcon?

    Да
    Ответ написан
    Комментировать