• Как file_put_contents заставить не учитывать слэш?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    str_replace
    Ответ написан
    Комментировать
  • Проект со сложной логикой на 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 комментариев
  • Как искать работу напрямую, не через рекрутеров?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Все мы знаем, что рекрутеры забирают себе неплохой кусок пирога.Как избежать этого?

    QrRZHV49RH0.jpg

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

    На оборот, через знакомых HR-ов поиск работы происходит в 2 счета, достаточно написать:
    Привет, я такой-то такой-то, вот ссылочка на мое резюме, есть что-нить на такую-то должность?

    Далее на вас начинает работать сарафанное радио. У HR-ов есть целые "биржи" с торгами за соискателей. И вся эта махина начинает работать на вас, глупо ей не воспользоваться, учитывая, что вы ничего не теряете.
    Ответ написан
    2 комментария
  • Можно ли попросить Вас о code review?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Общих рекомендаций 4:
    1. Use ES 6 Luke!
    2. Проверяйте входящие аргументы.
    3. Не делайте макаронного кода:
    $(document).on('click', '.add-email', function(event){

    Привязка к событию отдельно, функция - отдельно.
    4. Разделяйте код по классам. SOLID, вся херня.
    Ответ написан
    2 комментария
  • Нужно ли строго следовать стандартам PHP при разработки CMS?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    TL;DR
    Вы хотите потратить кучу времени просто так, увы. Если так хочется сделать cms - делайте, но возьмите за основу фреймворк, Silex например (лучше конечно Symfony, но там порог вхождения довольно высокий).

    -----------------------------------------------------------

    Use PSR-4 Luke!

    и в идеале мой namespace должен строится как:
    lib\<имя поставщика>\< namespace>\< имя класса>.... >


    Плохая идея, очень. Namespace стоит делать: < vendor >\< project >\<...>\ClassName
    Подключив зависимости через composer вы столкнетесь с тем, что путь к конечному файлу будет:
    vendor/< vendor >/< project >/.../ClassName.php
    И это вне зависимости от того, используется ли ваша cms, или нет. Путь всюду будет идентичным.

    с точки зрения проекта это было бы лаконично, понятно и удобно в функциональном плане

    Не повторяйте глупостей CodeIgniter. Ваша cms - это зависимость под вашим вендорингом, она не должна быть вперемешку с проектом на этой cms.

    PS: использовать composer не планирую, все библиотеки будут писаться мной, но планируется что для данной CMS системы могут разрабатываться сторонние модули и плагины.

    Зря, не делайте глупость. Автолоад и управление зависимостями - это решенная задача. Ваш вариант не будет лучше, примите за исходную.

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

    Что мешает сделать систему конфигурации у каждого модуля? Жесткое позиционирование файлов/каталогов - это как выровнять людей по высоте с помощью циркулярки))

    небольшие пояснения о том что подразмевается под modules | components | plugins

    Ваша классификация мягко говоря не очевидна. Обычно модуль - это некая крупная часть системы, состоящая из компонет. В вашей класификации плагин и модуль - это одно и тоже, просто разными словами.
    С моей точки зрения в этом разделении смысла нет. Это все равно некие зависимости вашего проекта на базе cms, просто они могут быть не портабельные, а разрабатываться под конкретный проект.

    А вот разделение по MVC было бы вполне не плохо. Не забудьте про консольное выполнение.

    каждый элемент системы как и сама система будут реализованы на основе MVC

    Если я правильно понимаю это получиться что-то типа HMVC. Если так - вам придется вывернуться на изнанку, что бы получилось И гибко И производительно И саппортабельно.
    Ответ написан
    3 комментария
  • Как лучше реализовать проверку на новые URL?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Для начала перепроверьте, что у целевого сайта нет RSS ленты. Если есть - лучше воспользуйтесь ей.

    Как правильно реализовать проверку на новые?

    Вытянув контент новости берите от него хэш. Если с таким хэшем уже что-то есть - новость старая. Если с таким заголовком новость уже есть И разница между контентом маленькая - контент статьи обновился, если же разница высокая - это новая статья, но с уже существующим заголовком.

    Сам парсер я бы вам рекомендовал делать на phantomjs
    Ответ написан
  • Как найти все запущенные node серверы в локальной сети?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Пфф, легко!
    Устанавливаете counsul, обязуете каждый node сервер регистрироваться там
    Ответ написан
    Комментировать
  • Построение многопользовательского сайта - где найти основы основ?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Как устроена простейшая авторизация?

    Проверяется открытый(логин) и закрытый(пароль) ключи. Если они соответствуют - в сессии пользователя сохраняется идентификация этого пользователя.

    Как пользователь находится в сети

    Он отправляет к вам HTTP запрос, так и находится.

    отличается от других пользователей

    Для каждого пользователя генерируется уникальное значение сессии и сохраняется в cookie.

    как инициируются и как разделены действия отдельных пользователей на сайте

    Инициируются пользователем с помощью HTTP запроса. Разделены за счет разных идентификаторов сессий.

    не зарегистрированных и зарегистрированных с различными правами привилегий?

    Проектируется и реализуется система контроля доступа. Есть 4 основных типа реализации:
    1. Проверка в сессии идентификации пользователя, если она есть - авторизирован.
    2. ACL
    3. RBAC
    4. С помощью внешних сервисов, например LDAP, OAuth,...

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

    Любой учебник по php от 700 страниц.
    Ответ написан
    Комментировать
  • Почему Symfony 3 так долго грузится?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Для production окружения 300-400мс многовато. На самом деле даже для development окружения с полной перестройкой кешей этого многовато. Проверьте даты создания файлов в каталоге var/cache, если они меняются с каждым запросом - у вас не production окружение. Если снизу на странице есть debug консоль - вы тоже не в production окружении. Так же проверьте включен ли логгер доктрины, он тоже много кушает. Что касается кэшей доктрины - имеет смысл их хранить в memcached.

    Если ничего не поможет - посмотрите через xhprof, что у вас так долго выполняется.
    Ответ написан
    7 комментариев
  • Надо ли бросать исключение при приеме ошибочных (невалидных) данных?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Нужно ли бросать исключение, в случаях, когда данные не прошли валидацию?

    Если это валидатор - достаточно вернуть ErrorResponse объект с ошибкой.
    Если это вызов метода с не правильным данными - бросайте исключение.

    Или достаточно просто занести код и сообщение ошибки в массив errors и при выводе работать с ним?

    Не стоит, возвращайте сразу ErrorResponse.

    Полезна ли информация с Исключений при валидации во время дебагга?
    Да, так вы получаете stacktrace, помимо сообщения об ошибке.

    Работа с ошибочными данными может вызвать ошибку непосредственно при их обработке.

    Лучше не используйте ошибки, с ними не удобно работать, вместо этого исключения.

    Вот вам пример, Assert::assert - это штука из либы ko-ko-ko/assert
    public function loginAction(Request $request) : Response
    {
        try {
            $userName = $request->request->get('userName');
            $password = $request->request->get('password');
    
            Assert::assert($userName, 'userName')->match('/^[\a-z\d]{3,32}$/i');
            Assert::assert($password, 'password')->lengthBetween(6, 32);
        } catch (\Throwable $exception) {
            return new Response($exception->getMessage(), Response::HTTP_BAD_REQUEST);
        }
    
        try {
            // Your business logic here
            
            return Response();
        } catch (\Throwable $exception) {
            $this->get('logger')->error($exception->getMessage(), ['exception' => $exception]);
            return new Response('Could not login', Response::HTTP_INTERNAL_SERVER_ERROR);
        }
    }
    Ответ написан
    1 комментарий
  • Как узнать список методов?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Так вот о методе latest() IDE ничего не знает! Шо же делать, как же быть? :)

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

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Про существование $_POST, $_GET,... после того как вы собрали Request в принципе стоит забыть.
    Ответ написан
  • Обязательно ли программист должен уметь разбирать и собирать компьютер?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Sysadmin - да, если есть физический доступ к железу + поддержка этого железа в ваших должностных обязанностях.
    DevOps - да, если есть физический доступ к железу + поддержка этого железа в ваших должностных обязанностях.
    Developer - нет
    Ответ написан
  • Какая CMS подойдёт для сайта Вопросы-Ответы?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Самое близкое - это одноуровневый форум. Правда просто функциональностью вопрос-ответ сейчас никого не удивишь и это самая простая из задач, так что cms я бы не рекомендовал, смотрите в сторону фреймворков, типа symfony.
    Что касается сложных задач, которые придется решить:
    - защита от спама
    - гибкая система модерации и целый отдел модераторов, сюда же обратная связь. Тут основное требование: она должна быть быстрой, по хорошему полу автоматической
    - система категоризации и ранжирования вопросов и ответов
    - горизонтальное масштабирование
    - система мониторинга
    ...
    Ответ написан
    2 комментария
  • Как по-изящнее переписать несколько php echo строк?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Можно-ли как-то красивее переписать строки?

    Используйте шаблонизатор типа twig и будет вам счастье))

    Конкретно ваш случай - printf
    Ответ написан
    Комментировать
  • Есть ли простые примеры применения ООП?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Простейший пример: логгер. Все, что он делает - передает дату и сообщение в N мест: консоль, файл, очередь, udp,...

    Его можно реализовать по тупому: написать N похожих логгеров для каждого транспорта. Вам придется вручную следить, что бы интерфейс каждого был идентичным. Для многих языков поменять один логгер на другой будет не просто.

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

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

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

    Гуглите на тему: wowza, red5, ffserver.

    Не понятно, как хранить информацию на сервере.

    Этот вопрос решается сервером видео стримминга.

    И чтобы это всё реализовать нужно использовать гибридную peer-to-peer сеть?

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

    В какую сторону нужно копать, чтобы разобраться?

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

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смотрите в сторону: statsd -> graphite, или statsd -> influxdb
    Ответ написан
    Комментировать
  • Кто как управляет загрузкой и планирование работы персонала?

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

    Project Manager

    То, что вы ищите называется issue tracker / task manager: посмотрите redmine, jira, youtrack
    Ответ написан
    Комментировать