• Легаси-монстр. Как побеждаете?

    @MasterMike
    Из вопроса не очень понятно, что именно составляет ваш интерес отрефакторить этот проект.

    Если вы чисто по доброте душевной хотите помочь бизнесу, то не надо этого делать, иначе вы на своем личном опыте осознаете фразу "инициатива наказуема" )

    Касательно сути вопроса поддержу уже сказавших свое мнение: постепенное помодульное переписывание старого кода на современный лад. Старый код работает вместе с новым и так далее, пока от legacy ничего не останется.
    Ответ написан
    3 комментария
  • Как загрузить прайс лист по частям?

    webinar
    @webinar Куратор тега PHP
    Учим yii: https://youtu.be/-WRMlGHLgRg
    Самый простой вариант, это реализовать на клиенте отправку частями. Обычно это удобно, так как кроме этого удобно и просто реализуется прогресбар.
    Так же есть вариант с занесением json в файл или даже в БД лучше и обработку делать уже после, частями, если узкое место именно в обработке. В любом случае лучше вначале определить где узкое место.
    Ответ написан
    Комментировать
  • Как деплоить простые php проекты?

    Jenkins - может всё что вам нужно.

    деплой из git

    Где у вас репозитории? Github, gitlab, bitbucket и т.д. имеют встроенный CI, т.е. можно обойтись и без Jenkins.
    Ответ написан
    2 комментария
  • Как деплоить простые php проекты?

    slo_nik
    @slo_nik Куратор тега PHP
    Доброе утро.
    Самый простой вариант https://www.deployhq.com/
    Регистрируетесь, указываете настройки для ssh соединения и всё.
    Ответ написан
    2 комментария
  • Права и роли пользователей как делать?

    amorphis
    @amorphis
    Технолог в Студии Артемия Лебедева
    Почитайте про RBAC (Role-based Access Control)
    Ответ написан
    7 комментариев
  • Можно ли с помощью php отправить на номер телефона код с потверждением?

    @jemanov
    Здравствуйте.
    К сожалению php может отправлять только на электронную почту.

    Для отправки СМС используются сторонние СМС-агрегаторы, к которым нужно отправлять запрос (в том числе на php, js или других языках-протоколах). Как правило это платные сервиса.
    Ответ написан
    Комментировать
  • Как вычислить кто делает определенные запросы к базе?

    Exploding
    @Exploding
    wtf?
    Повесьте триггеры на after insert и before delete события для нужной таблицы и пишите в отдельную таблицу все, что нужно, для раскрытия этого громкого преступления века: логин пользователя, метка времени, нужные ID и т.д.
    Ответ написан
    Комментировать
  • Стоит ли в контроллере обрабатывать исключения?

    dmitry_pavlov
    @dmitry_pavlov
    World-class .NET freelance contractor (remotely)
    Глобальные настройки обработки исключений отвечают за то, как обрабатывать их, в каком виде представлять, возвращать клиенту и тп.

    Обработчики уровня actions в контроллерах - за содержание ошибки. К примеру, если у вас есть action MoveFile, который где-то там лезет во внешний сервис и пытается скачать файл и он падает по какой-то сугубо технической проблеме - таймаут у stream-а или еще что, то в конроллере имеет смысл этот Exception перехватить и завернуть во что-то более внятное:

    public async Task<IActionResult> MoveFile()
    {
        try {
            ...
        } catch (Exception exception) {
            throw new Exception("Moving file failed.", exception);
        }
    }

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

    ApeCoder
    @ApeCoder
    Надо выработать общие принципы, команда должна быть достаточно образована чтобы знать язык на котором описываются проектировочные решения (все знают, что такое tell don't ask, например?).

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

    Помимо этого, надо договориться, как решать конфликты - например выбрать того, кто будет решать.

    Надо учиться понимать людей и стараться вставать на их сторону - искать рациональное зерно в и доводах. Не переходить на личности и выражаться уважительно (не "Это чушь", а "Я понимаю, что здесь есть вот такие позитивные стороны, но думаю, что будет интереснее сделать то то и то то").

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

    @Doc44
    Никаких компромиссов. Никакого демократического бардака.

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

    @noma
    Имеет смысл завести репу на специализированном сервере GIT типа GitHub, GitLab, Bitbucket.

    Перед начало работы каждый из ваших коллег делает git pull - получает локальную копию репы.
    По окончании работы каждый из ваши коллег делает git push - отправляет данные из локальной на сервер GitHub/Gitlab/Bitbucket.
    Плюс нужно будет как-то разруливать ситуации, когда вы портите результаты работы друг друга - через git merge или через ветки git...

    Операция отправки на боевой сервер (на FTP в вашем изложении) из GIT (с сервера Bitbucket/Github/Gitlab, а не с локальной репы) - это отдельная операция.

    Синхронизация Git с хостингом как?
    Ответ написан
    Комментировать
  • Как гарантировать списание денег с баланса?

    qonand
    @qonand
    Software Engineer
    без разницы как Вы будете запускать процесс списания средств по крону или еще как-то, защита от повторного/параллельного списания должна быть реализована в самом алгоритме списания и не зависеть от вызывающих ее процессов. Т.е. на момент списания алгоритм сам должен проверять нужно ли снимать абонплату с клиента или нет. Как именно сделать эту защиту зависит от деталей реализации Вашей системы - но в общем случае вариант с историей вполне уместен, а проблемы параллельного списания вполне можно решить транзакциями/блокировками
    Ответ написан
    1 комментарий
  • Может ли модель работать с массивом _POST и записывать данные в сессию?

    Maksclub
    @Maksclub Куратор тега PHP
    maksfedorov.ru
    • в модель должны попадать чистые данные (то есть таки да - -в контроллере)
    • вообще с голым _POST не нужно в 2018 году работать, посмотрите это видео: https://vk.cc/8dAijK
    • валидацией может заниматься модель, но в данном случае МОДЕЛЬ ВАЛИДАЦИИ, а не модель сущности,
      модель -- это целый слой, а не конкретный класс или вид классов, это и сущности и сервисы и валидация и т.д....

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

    Валидация в сеттере
    По поводу сеттеров и валидации -- тоже плохо
    Купюра должны быть проверена в момент ее передачи, а не когда вы уже дали товар, посчитали сдачу, напечатали чек).. аналогия может быть немного не точной, но понятен принцип -- не в сеттере :)

    Ну или как пример -- договор между юрлицами, когда вы договорились и заполняете договор, для подписей (по сути сеттер ваш абстрактный) вы УЖЕ ДОЛЖНЫ были проверить контрагента и условия этого самого договора

    Польза абстракций
    Мне кажется так получается гораздо сложнее чем просто в каждом сеттере прописать валидацию. В общем, объясните, пожалуйста, как это реализовать и в чём плюс такого подхода

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

    Смотрите как валидация делается в Ларавел:
    public function rules()
        {
            return [
                'name' => 'required|string|max:255',
                'email' => 'required|string|email|max:255|unique:users',
                'password' => 'required|string|min:6|confirmed',
            ];
        }
    Ответ написан
  • Как получить практический опыт в управлении проектами?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Чтобы начать чем-то управлять, придётся сначала побыть управляемым. Устраиваешься в проект программистом/админом/консультантом, проходишь через жизненный цикл проекта наблюдая как что работает и какие проблемы возникают. На следующем проекте (или этом же, если он "вечный") начинаешь себя проявлять: показываешь умение и готовность решать вопросы, находить решения, разговаривать с людьми - коллегами, руководством, заказчиками, умение убеждать и вдохновлять, умение предугадывать желания заказчика и будущие проблемы и т.д. и т.п. Естественным образом рано или поздно начнёшь "тащить" проекты, а после этого менеджером назначат даже если сопротивляться будешь.

    Ответ на похожий вопрос.
    Ответ написан
    Комментировать
  • Рационально ли внедрять зависимости в класс через DI-контейнер, обходя при этом стороной конструктор и сеттеры?

    @Fantyk
    web developer
    Нет, не так. Суть DI в управлении зависимостями, когда я смотрю конструктор - я должен видеть от чего зависит код. Ваш вариант практически не отличается от использования глобальных переменных/сервис локатора.
    Все современные контейнеры позволяют забиндить интерфейс с реализацией, плюс автовайринг. Для вас, как программиста, даже проще сразу инжектить нужные вам классы, чем просить их у контейнера.


    Принцип инверсии зависимостей (англ. dependency inversion principle, DIP):
    Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

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

    Stalker_RED
    @Stalker_RED
    Ответ написан
    Комментировать
  • Какой смысл в разделе наша команда на сайтах веб студий?

    Maksclub
    @Maksclub Куратор тега Веб-разработка
    maksfedorov.ru
    Это маленький, но элемент подтверждения и снятия сомнений, когда на сайте такого нет -- перед тобой образ текста, когда видишь фото -- представляешь в голове, как несколько человек сидят и можешь вообразить, как программист программирует, менеджер руководит, дизайнер проектирует... без этого -- фантазия может не заработать

    Также и в тексте желательно не писать "Создание веб-сайтов" -- нет представлений и фантазий (даже если добавить прилагательных СУПЕР ПУПЕР, СОВРЕМЕННЫХ и т.д...),
    а вот "Мы дизайнеры рисуем дизайн интернет-магазина, в это время наши программисты пишут весь код с нужнйо вам логикой, тестировщики тестят ваш сайт на разных устройствах, мы пишем вместе с вами контент и рекламируем в соцсетях" сразу в голове рисует понятную картинку, тк текст из глаголов... а фото еще сильнее

    как-то так -- четкая понятная картинка в голове у клиента, фото легче представить, чем слова
    Ответ написан
    Комментировать
  • Как сделать простейший php прелоадер кеша для сайта?

    akubintsev
    @akubintsev
    Опытный backend разработчик
    Переписывать - утопия.
    Оставлять как есть - нельзя.
    Не городите костыли. Возьмите лучше профайлер и узнайте из-за чего такие дикие тормоза. Потом оптимизируйте или закешируйте тяжелые запросы (скорее всего дело в них)
    Ответ написан
    Комментировать
  • Как вести контроль версий двух проектов с общим основанием?

    Всё просто. Делается 3 отдельных репозитория:
    1) Ядро
    2) Бумажные книги
    3) Аудио книги

    Бумажные книги и Аудио книги просто используют ядро, которое вы обновляете и там самым изменения происходят на двух сайтах
    Ответ написан
    Комментировать