• Как спроектировать сервис для повторного использования?

    @PiloTeZ Автор вопроса
    ...
    По итогу решил следующее. Если нужно быстро, то сделать через параметры и условия. Если логика была бы сложнее и конфликты в ней серьезнее, то нужно было бы:
    - разбить метод create на protected методы
    - вынести новые методы в базовый класс
    - унаследоваться от базового класса и создать Companies и AdminCompanies
    - в Companies и AdminCompanies сделать create метод с нуля на основе базовых методов
    Ответ написан
    Комментировать
  • Как устранить ошибку "Class name must be a valid object or a string"?

    @PiloTeZ
    ...
    public function getListSpecialty(){
    $scpeciality = $this->specialty;
            return ArrayHelper::map($specialty::find()->all(), 'id', 'title');
        }


    А вообще лучше через связи это реализовать, а затем через ArrayHelper
    Ответ написан
    Комментировать
  • Как привести sql выражение к читаемому виду в билдере Yii2?

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

    @PiloTeZ
    ...
    1. Отвязываемся от пользователя, оставляем там только поле type и варианты значений Admin, User
    2. Под каждый тип пользователей создаем таблицу: partners, clients, operators
    3. Определять является ли пользователь партнером, клиентом или оператором нужно по наличию записи в этих таблицах
    4. Определять тип партнера можно добавив поле specialization_id в partners
    5. Определять набор предоставляемых услуг партнером, можно добавив таблицу services и связав ее со specializations

    Структура БД:
    users - пользователи
    - id
    - type [admin, support, user]
    clients - клиенты
    - id
    - user_id
    - title
    operators - операторы
    - id
    - user_id
    - title
    partners - партнеры
    - id
    - user_id
    - specialization_id - специализация партнера
    specializations - специализации (врач, медсестра, массажист)
    - id
    - title
    services - предоставляемые услуги (массаж, обследование...)
    - id
    - title
    specialization_services - связь между специализациями и услугами
    - id
    - specialization_id
    - service_id

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

    @PiloTeZ
    ...
    • Эрик Эванс - предметно-ориентированное проектирование"
    • Мартин Фаулер - рефакторинг
    • Роберт Мартин - чистая архитектура
    Ответ написан
    Комментировать
  • Как правильно построить запрос на получение данных в Yii2?

    @PiloTeZ
    ...
    Должно помочь следующее, но с условием денормализации БД. То есть сумма просмотров постов хранятся как в категории, так и в посте.
    https://www.yiiframework.com/doc/guide/2.0/ru/db-a...

    $categories = Category::find()
    ->with([
        'posts' => function ($query) {
            $query->limit(4)->orderBy(['views' => SORT_DESC]);
        },
    ])
    ->orderBy(['views' => SORT_DESC])
    ->all();


    UPD:
    Черновой вариант без денормализации.
    Решение:
    - категории сортируются используя JOIN к постам, SUM и группировку по categories.id
    - посты получаются отдельным запросом через связи Yii

    $categories = Category::find()
        ->joinWith('posts')
        ->select('*', 'SUM(posts.views) as category_posts_views')
        ->with([
                   'posts' => function ($query) {
                       $query->limit(4)->orderBy(['views' => SORT_DESC]);
                   },
               ])
        ->groupBy('categories.id')
        ->orderBy(['category_posts_views' => SORT_DESC])
        ->all();
    Ответ написан
    Комментировать
  • Как правильно пользоваться очередью на Redis?

    @PiloTeZ
    ...
    Можно складывать в одну очередь, если нет понимания зачем разделять на несколько.
    В будущем, когда понадобится разделить, это в целом не составит труда.
    А разделять стоит, что бы: можно было отслеживать работу очередей, отключать отдельные очереди, управлять количеством воркеров на очередь. На мелких проектах может быть избыточно.

    UPD:
    В очередь нужно добавлять тяжелые задачи, как например обработка картинок. Для обновления информации по API не похоже, что нужна очередь. Скорее нужна оптимизация, если это занимает много времени. Зависит от ситуации
    Ответ написан
    Комментировать
  • Как Вы думаете стоит ли дробить модели (PHP / Laravel)?

    @PiloTeZ
    ...
    Создай одну модель. Создай к ней отдельный класс-сервис, который будет управлять моделью.
    В сервисе опиши набор методов: create, update, delete, deactivate и прочее.
    Если метод простой, оставляешь реализацию в этом классе.
    Если метод сложный, например export, можно вынести в отдельный класс, и вызывать его в методе сервиса.
    Пример.
    $users->update($model);
    $users->deactivate($model);
    $users->export(); // Внутри вызываешь new UsersExport()->export();, что б не засорять сервис

    Если какой-то набор методов легко выделить в одну группу, лучше создать новый сервис.
    Например не пихать аутентификацию в Users сервис, а создать сервис UsersAuthenticate.
    $usersAuthenticate->register();
    $usersAuthenticate->authorize();
    Ответ написан
  • Как собрать приложение на Ionic 3?

    @PiloTeZ
    ...
    Мой скрипт для создания релизной сборки. Запускать на винде в папке проекта release.sh.
    Перед использованием, подставь свои данные.
    Не храни этот файл в гите, так как хранятся секретные данные. Можно вырезать их и вводить каждый раз вручную.
    Если после сборки появляются странные проблемы, попробуй выполнить ionic repair.

    #!/usr/bin/env bash
    
    # Если не работает, проверь слэши и прочее. Зависит от консоли, в которой запускаешь. Например гитовая требует слэши /, а не \
    # Билд приложения
    ionic cordova build android --prod --release &&
    # Переход к собранному приложению
    cd platforms/android/app/build/outputs/apk/release &&
    # Подпись приложения с помощью личного секретного ключа
    jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -storepass ТВОЙ_ПАРОЛЬ_ОТ_КЛЮЧА -keypass ТВОЙ_ВТОРОЙ_ПАРОЛЬ_ОТ_КЛЮЧА -keystore C:/ТВОЙ_ПУТЬ_К_КЛЮЧУ/НАЗВАНИЕ_КЛЮЧА.jks app-release-unsigned.apk key &&
    # Удаление прошлой сборки для релиза
    rm -f НАЗВАНИЕ_ПРИЛОЖЕНИЯ.apk &&
    # Оптимизация APK, обязательно перед загрузкой в play market
    zipalign -v 4 app-release-unsigned.apk НАЗВАНИЕ_ПРИЛОЖЕНИЯ.apk
    Ответ написан
    Комментировать
  • Как сделать в laravel?

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

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

    @PiloTeZ Автор вопроса
    ...
    Итого никто не знает подобных книг, поэтому погуглил статьи и вот первая попавшаяся, которая хотя бы подкрепляет мои существующие знания.
    И решением будет более подробное рассмотрение вопросов и вариантов решений. Больше думать, меньше делать.
    https://sowetu.ru/read/463.html
    Ответ написан
    Комментировать
  • Как сделать такой эффект прокрутки?

    @PiloTeZ
    ...
    По сути это два вертикальных слайдера. Только у одного показывается 30% ширины, у другого остальные 70% и у второго слайды идут в обратном порядке.
    Ответ написан
  • Какой CMS движок учить начинающему?

    @PiloTeZ
    ...
    Bitrix учите, там есть деньги
    Ответ написан
    Комментировать
  • Почему не работает React?

    @PiloTeZ
    ...
    Делайте все как говорят в уроках и все будет работать )
    Ответ написан
  • Как быстро и эффективно прокачать скилы в верстке?

    @PiloTeZ
    ...
    CSS это бал бубнов )) Так что практика + гугл. В крайнем случае курсы или книги. Выбор не большой, выбирайте сами
    Ответ написан
    1 комментарий
  • В чем ошибка при сборке ionicframework?

    @PiloTeZ
    ...
    Не знаю в чем причина, можно попробовать
    ionic cordova platform remove android
    ionic cordova platform add android


    Может версия gradle не соответствует ионику, но это вряд ли.
    Если проблема не решается, можно с нуля поднять проект, вероятно проблема решится.
    Ответ написан
  • Проблемы в работе сайта на bitrix?

    @PiloTeZ
    ...
    Может кому-то поможет. Я переименовал папку с сайтом и у меня появилась такая проблема.
    В качестве решения очистил папку /tmp/php_sessions/ext_www/oldsite.net и переименовал в /tmp/php_sessions/ext_www/newsite.net и заработало. Видимо прав на создание папки не хватало
    Ответ написан
    Комментировать
  • Почему не запускается 2 одинаковых сайта на разных доменах?

    @PiloTeZ
    ...
    Варианты
    • Привязка к домену (в файлах)
    • Привязка к домену (в записях БД)
    • Не правильно настроенный сервер (например неверная корневая папка)
    • Недостаточно прав
    • Кэш
    Ответ написан
  • Как сделать многоуровневое меню на Bootstrap?

    @PiloTeZ
    ...
    Ответ написан
    Комментировать