• Как сконфигурировать бэк и фронт через api?

    yesbro
    @yesbro
    Думаю, помогаю думать
    У тебя есть урл фронта (node + vue) и урл апи (nginx + php fpm + postgress).

    По урл фронта ты из браузера обращаешься к своему фронту. Node + Vue смотрят свои маршруты, генерирую html страницы и отдают их тебе в браузер.

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

    Это если в общих чертах.
    Ответ написан
    Комментировать
  • Как сконфигурировать бэк и фронт через api?

    liaFcipE
    @liaFcipE
    Причем тут VDS, зачем вам вообще нода? Чистый Vue это больше о SPA. Вы о SPA или SSR/G?

    Если вы хотите классический SPA, то вам (не) нужна нода, она нужна для сборки и локальной разработки, но на выходе у вас статика (html, js, css и еще какой-то набор ассетов аля картинки, шрифты и так далее).

    Что там делает API и как он живет - фронту не важно и его не касается, ему не важно какой там стек, фронту важно одно - адрес, где бекенд живет и чтобы бекенд отдавал ответы на запросы в нужном фронту формате.

    Поэтому что вам конфигурировать? Что вы хотите?
    Ну в общих чертах вам нужен:

    nginx, который:
    - Отдает статику на 80/443 с вашим index.html и набором ассетов.
    - Дает доступ к API проксипасом на условный путь /api юзая php-fpm линком с другого контейнера.

    Как вы это упакуете на уровне докера - хз, делайте как удобно. Только понимайте, что фронт для локальной разработки нужно запускать в dev режиме, через nodejs, (HMR там и все такое) а для пре\прода - собирать в статику.

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

    Да и как вы хотите хранить проекты? Монореп или все таки разные репы? Если разные - можете вообще сделать для каждого проекта сборку в docker имаджы и сторить их где-то в Gitlab Registry или аналогах с независимым деплоем фронта и бека. кароче вариантов масса. Выбирайте по возможностям и средствам. Возможно вам проще нанять прошаренного девопса.
    Ответ написан
    Комментировать
  • Почему не устанавливается npm?

    vitali1995
    @vitali1995
    А что показывает команда
    npm -v
    Ответ написан
    Комментировать
  • Почему в php нельзя уточнить класс аргумента при имплементации интерфейса?

    LSP нарушается - интерфейс требует чтобы реализация в качестве аргумента могла принимать любую реализацию ArgInterface, а вы пытаетесь ограничится только одной.
    Ответ написан
    Комментировать
  • Почему в php нельзя уточнить класс аргумента при имплементации интерфейса?

    Потому что это бы нарушало принцип подстановки Барбары Лисков.

    Интерфейс предполагает, что ты можешь принимать любой объект, который реализует интерфейс ArgInterface.
    => Если ты сузишь тип, то ты уже по факту не сможешь поддерживать контракт.

    По тому при реализации интерфейса можно только расширять тип принимаемых аргументов, но не сужать.
    Ответ написан
    Комментировать
  • Какова должна быть правильная архитектура парсера на PHP?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    Для начала бы хоть объяснил что именно ты парсишь.
    А если понадобится писать не в базу, а в файл, писать Parser2?

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

    Если не боитесь нагружать модель бизнес-логикой - можно сделать метод:
    readBy(User $user)
    И уже внутри проверять начальник это или подчинённый, и проставлять соответствующий флаг.
    Ответ написан
    3 комментария
  • Насколько хорошая практика передавать в метод имя класса, который его вызывает?

    vitaly_74
    @vitaly_74
    Проблемы которые вы можете получить используя второй вариант описал Михаил
    Предложил бы реализовать второй вариант таким способом:
    messages:
    to | from | date | is_read
    а в модельку добавить метод:
    makeARead(): void;
    в конструктор модельки можно передать id сообщения.
    тогда если использовать ваш код то можно сделать так:
    $message = new Message ($messageID)
    $message->makeARead();

    а создавать сообщение так:
    $messages->addMessage(From, To);
    если нужно сделать список сообщений прочитанными сделайте декоратор для $messages, например:
    $messages = new MakedARead(
       new Messages(
          $conditionOfMessages
       )
    )
    return $messages->list(); //Здесь в цикле делаем все сообщения прочитанными.

    Плюсы такого подхода: можно добавлять функционал на лету, не изменяя старый код, а также можно соответствовать принципам SOLID
    Можно, конечно как предложено в первом ответе, вполне себе будет работать, и тут нет ничего плохого.
    Ответ написан
    Комментировать
  • Насколько хорошая практика передавать в метод имя класса, который его вызывает?

    @Akela_wolf
    Extreme Programmer
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
    С. Макконнелл


    Первый вариант понятен. Вы поиском сможете найти откуда каждый метод вызывается. Имя метода четко указывает что он делает.

    Второй вариант - непонятен. Во-первых, имя метода ни о чем не говорит. Чтобы понять что он делает - придется читать сам метод. Во-вторых при поиске мест вызова нужно будет постоянно проверять контекст - что за параметр передан в этот метод? А если он будет вызываться из класса-наследника одного из контроллеров? А если будут использовать трейты? А если код будет вынесен в делегат? Очень много сложностей для решения настолько простой задачи.
    Ответ написан
    1 комментарий
  • Как спроектировать страницу авторизации с точки зрения паттерна MVC на PHP?

    customtema
    @customtema
    arint.ru
    MVC? Легко.

    ==== Метод входа ====
    Сущность - сессии авторизации.
    Попытка входа - создание записи с правилами валидации. Правила валидации проверяют, что введено то, что надо, пользователь не заблокирован, пароль совпадает и т.д.
    В случае удачного входа колбеком ставить куку. В куке токен, ключ от которой хранится в записи сессии в БД.

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

    ==== Выход ====
    Если нет куки - ничего не делать, просто редирект на главную.
    Если есть кука - найти сессию и деактивировать её. Можно удалить куку. Можно не удалять, если вы собираете цифровой след - к примеру, хотите отслеживать мультиачье и т.п.
    Ответ написан
    7 комментариев
  • Как спроектировать страницу авторизации с точки зрения паттерна MVC на PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Или же я вообще пишу глупость

    В целом да. Но

    вся эта логика прекрасно будет в index.php лежать?

    - это гораздо большая глупость.
    Ну то есть лежать-то будет, но к MVC уже никакого отношения не будет иметь.

    По пунктам

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

    Что такое AuthPage вообще непонятно. Модель, контроллер? По базе проверяет модель, куки пишет контроллер. А здесь какой-то кадавр.

    Перед тем как писать авторизацию "в стиле MVC", надо сначала разобраться, что такое модель, что такое контроллер, и что такое вью.

    Модель - это вся логика приложения.
    Контроллер - это интерфейс для общения модели с браузером. Делает всё, связанное с обработкой НТТР запросов.
    Вью - отображение.

    Как правильно.

    Соответственно в модели должен быть класс User с методом auth(), который принимает логин и пароль и возвращает инстанс класса Юзер.
    В конторе делается экшен: отдельный метод, который
    - проверяет, если был запрос методом ПОСТ, то берет из него логин и пароль,
    - валидирует их, если валидация не прошла, то создает ошибку, которую надо показать юзеру
    - если прошла, то вызывает метод auth() модели User, передавая в него логин и пароль
    - если совпали, то пишет в сессию ид юзера, и делает редирект куда-нибудь
    - если не совпали, то создает ошибку, которую надо показать юзеру
    - вызывает вью с формой для логина и пароля

    Для регистрации делается еще один экшен, который
    - проверяет, если был запрос методом ПОСТ, то берет из него данные для регистрации,
    - валидирует их, если валидация не прошла, то создает ошибку, которую надо показать юзеру
    - если прошла, то то заполняет класс User данными и выполняет метод save() и делает редирект куда-нибудь
    - вызывает вью с формой для регистрации

    Для личного кабинета делается третий экшен, который берет из сессии ид юзера, обращается к методу read() модели User и через View показывает личный кабинет

    Варианты реализации

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

    То есть папка user в которой есть, скажем, файл index.php который является экшеном личного кабинета.
    Он проверяет юзера в сессии, и если нету, то перекидывает на auth.php
    в auth.php есть форма и ссылочка на register.php
    Все три файла инклюдят в себя файл user.php из папки model, в котором есть функции auth(), register() и profile()

    Но в более классическом варианта к трем буквам MVC добавляется ещё одна - R, роутер. Специальный сервис, который разбирает адресную строку, и видя, например, что к сайту обратились по адресу /user/register, создаёт экземпляр класса UserController и вызывает его метод register()
    Ответ написан
    4 комментария
  • Как спроектировать страницу авторизации с точки зрения паттерна MVC на PHP?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Контроллер LoginController
    Модель User
    Представление с формой логина
    Ответ написан
    1 комментарий
  • Как сохранить данные в полях формы при перезагрузке страницы?

    black1277
    @black1277
    Вольный стрелок
    <script>
                document.addEventListener("DOMContentLoaded", function() {
                    document.querySelectorAll('#id1, #id2, #id3').forEach(function(e) {
                        if(e.value === '') e.value = window.sessionStorage.getItem(e.name, e.value);
                        e.addEventListener('input', function() {
                            window.sessionStorage.setItem(e.name, e.value);
                        })
                    })
    
                });
            </script>
    Ответ написан
    1 комментарий
  • Как сохранить данные в полях формы при перезагрузке страницы?

    @alekssamos
    Программист любитель
    Селектор по ID - это знак решётки # и сам ID. document.querySelectorAll('#yourid')
    Ну хорошо, или так: document.getElementById('yourid')
    Ответ написан
    1 комментарий
  • Как сделать нумерацию с повторами?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    =arrayformula(ОКРУГЛВВЕРХ((SEQUENCE(5*500))/5))
    Ответ написан
    1 комментарий
  • Как в LEFT JOIN сделать условие объединения таблиц по нескольким полям?

    @rPman
    Зарос выглядит правильным, значит что то с данными не так.

    Посмотри что выводит запрос если оставить только одно условие к примеру по street? и выводи в select *
    Ответ написан
    1 комментарий
  • Как в LEFT JOIN сделать условие объединения таблиц по нескольким полям?

    @d-stream
    Готовые решения - не подаю, но...
    Собственно синтаксически все верно. Вопрос в реальном совпадении строк в таблицах (пробелы, кодировки и т.п.)

    Что дадут join только с первым и только со вторым условием?
    Ответ написан
    6 комментариев
  • Как задать фавиконку сайту на ВП, чтобы она отображалась на страницах медиафайлов?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    Добавьте яваскрипт который по строке запроса меняет фавикон, я недавно приводил пример, для динамической смены иконки при смене количества в корзине заказа
    Ответ написан
    1 комментарий
  • Как посчитать количество чисел в строках формулой массива?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Sheets
    Учитель, автоэлектрик, программист, музыкант
    Вот так, например:
    =ArrayFormula(
      ЕСЛИОШИБКА(A:A/A:A;0)+
      ЕСЛИОШИБКА(B:B/B:B;0)+
      ЕСЛИОШИБКА(C:C/C:C;0)
    )

    Демонстрационная таблица
    Ответ написан
    Комментировать
  • Как вывести все даты месяца?

    ProgrammerForever
    @ProgrammerForever Куратор тега Excel
    Учитель, автоэлектрик, программист, музыкант
    =SEQUENCE(ДАТА(ГОД(A1);МЕСЯЦ(A1)+1;ДЕНЬ(A1)-1)-A1;1;A1+1)

    И всему столбику задать формат даты
    Ответ написан
    1 комментарий