Вступление вступления

Всем привет! Всегда хотелось внести свой вклад в хабр. У меня было две статьи: первая - шуточная, про создание своего colorpicker, которая была слишком кринжовая, из-за чего сразу получила много минусов, и потому моментально была скрыта в черновики. Вторая - про недовольство в строну yii3, где я высказал своё мнение, которое было неверным, однако статья и карма получили плюсы, за что был благодарен.

В чем суть серии статей: мы создадим свою CMS с нуля без фреймворков. Сразу скажу, что упор будет именно на бэкенд, т.к. я ничего не понимаю во фронте. Поэтому мы создадим минималистичный интерфейс на ванильном js и при этом сделаем rest api для фронта, чтобы вы с помощью любого фронтенд-фреймворка смогли сами написать клиентскую часть.

И ещё (ВАЖНО!): я фрилансер-самоучка, поэтому статьи будут ориентированы, в основном, на новичков. Поэтому я буду очень благодарен критике в комментариях и предложениям лучших решений. По сути, будем создавать движок вместе. Буду учитывать все ваши замечания.

Q: Зачем это нужно, ведь в интернете полно статей и так на эту тему?
A: Затем, что, во-первых, почти все из них устарели на десяток лет. А во-вторых, здесь, на хабре есть не просто статья, а ещё и много комментариев от опытных людей, которые помогут, поправят, раскритикуют тот или иной подход. Поэтому, здесь будет на 2022-2023 прямо актуальный "свежак", и статьи будут периодически правиться. Цель - не создать готовый продукт для продакшена, а погрузиться на уровень ниже и посмотреть, как работает ядро движков изнутри и получить понимание работы движков/фреймворков/технологий. Я буду этому обучаться вместе с вами по ходу цикла статей.

Вступление

Для начала определимся с окружением.

Я буду использовать Windows 10/11 (да-да, не линукс, извините) и OpenServer, с помощью которого мы сможем быстро развернуть локально веб сервер

  • PHP 8.1 (включен в OpenServer)

  • PostgreSQL 14.1 - СУБД, где мы будем хранить данные (включен в OpenServer)

  • Composer - для установки сторонних библиотек (включен в OpenServer)

  • Redis - будем хранить кэш и другие данные, к которым нужен быстрый доступ (да, он тоже есть из коробки в OpenServer)

  • Git - для отслеживания изменений в коде, работы с разными ветками, откатами и слияниями веток в процессе разработки

В процессе, вполне возможно, подключим что-то ещё, если понадобится.

Примерный цикл статей:

  1. Проектируем базу данных

  2. Создаём базовую файловую структуру

  3. Делаем ролевую систему пользователей и базовую регистрацию/аутентификацию/авторизацию с подтверждением email/телефона

  4. Делаем категории и фильтры для поиска товаров с оптимизацией скорости и кэшированием, чтобы всё работало моментально (ну почти) на миллионах товаров

  5. Внутреннее (и публичное?) API для фронтенда

  6. Безопасность: CSRF, лимиты запросов (как на стороне nginx, так и на стороне кода), подключение капчи и пр.

  7. Корзина и оплата товара на сайте. Подсчет просмотров товара. И прочие мелочи, связанные с товарами.

  8. И многое другое.

Цикл пока неточный и не совсем упорядоченный, буду в процессе подстраиваться под ситуацию и ваши комментарии. Также я не упомянул многие детали, которые важны для магазина. Они будут создаваться в процессе "между пунктами", отталкиваясь от ваших комментариев.

Планы: сделать не просто магазин одного продавца, а сделать роли продавца и покупателя, чтобы каждый мог стать продавцом. Но это уже совсем другая история.

Отпишитесь, пожалуйста, насколько это вообще нужно и что я упустил во вступлении. Буду очень благодарен.

Статьи будут выходить примерно один раз в 2-4 дня до середины января. Далее - по ситуации.

Комментарии (8)


  1. Expany
    19.12.2022 19:43

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


    1. tempick Автор
      19.12.2022 19:49

      Спасибо! Будет создаваться движок магазина, но вообще суть не конкретно в магазинах, а именно в движках. Скорее как фундамент для тех кто начал работать с вордпрессом, modx или прочими движками и фреймворками, но не понимают, что там вообще происходит-то.
      Да, код как раз-таки хочу сделать не паршивым, а лаконичным и логичным, следуя общепринятым практикам и паттернам, и с использованием современных технологий. В этом и суть, собственно


      1. tempick Автор
        19.12.2022 19:54

        UPD: я буду разрабатывать на PHP, но чтобы это было так же понятно тем, кто хочет сделать подобное, например, на джаве. То есть, именно алгоритмы и решения тех или иных задач без привязки к конкретному языку или фреймворку. Именно поэтому выбрал чистый пхп, без фреймворка. PHP - только потому что я его знаю очень хорошо. Но постараюсь сделать код максимально читаемым для тех, кто в нем не разбирается.


  1. GothicJS
    19.12.2022 20:10

    Это все, конечно, очень интересно, но..... почему винда то?)


    1. tempick Автор
      19.12.2022 20:15
      -1

      Потому что я - полный идиот в плане сис.администрирования. Поэтому не хочу позориться с тем, как я настраиваю веб-сервер на ubuntu. Мой потолок - это aaPanel поставить, и в ней запускать сайты. Когда начинаю сам устанавливать lemp - я начинаю страдать, это не для моего мозга


      1. rsashka
        19.12.2022 20:25
        +1

        Будем делать CMS, но даже классический LAMP на установить не получается?

        Удачи вам в очень оригинальном подходе к разработке ПО!


        1. pfffffffffffff
          19.12.2022 20:41

          А нафига если есть докер?


  1. FanatPHP
    19.12.2022 20:30
    +1

    У статьи сейчас минус, и заслуженно. Будут ещё.
    Такие реплики — "А не спеть ли мне песню?" — на Хабр не пишут. На Хабр пишут статьи. Если хочется сделать цикл статей, то пишется полноценная первая часть, по которой уже можно судить о качестве материала, и в конце неё уже можно сделать опрос, "стоит ли продолжать".


    Пока же можно судить по косвенным признакам. Которые не очень радужные. Логика вида "я говнокодер самоучка, поэтому пишу для новичков чтобы они тоже стали говнокодерами" не выдерживает никакой критики. Я этот аргумент вижу все время, и он не устает меня поражать — почему, почему новички не заслуживают нормальной подачи материала? Почему они должны учиться не на качественном материале, а на таком, который сам себя заранее определяет как "тяп-ляп"?


    Кроме того, здесь хорошо виден синдром "размах на рубль, удар на копейку". Я и сам ему подвержен. Есть хорошая поговорка, Не говори "гоп", пока не перепрыгнешь. CMS у нас нет, цикла нет, даже одной статьи — и той нет, но планов уже громадье. В подавляющем большинстве случаев такие заходы кончаются в лучшем случае одной-двумя частями. А чаще всего — ничем.


    Я вам предлагаю уменьшить размах, и идти от обратного — написать просто одну статью без претензий на циклы. Любая из заявленных тем будет интересна читателям Хабра.


    Но только если она будет освещена более-менее грамотно, без детских ошибок. Учтите, что читать её будут не только "новички", а и профессионалы тоже. И оправдания вида "я же для новичков пишу" не проканают. Потому что для новичков писать сложнее, чем для профи — материал должен быть тот же самый, но подан в более простой форме. Одна из главных проблем писателей для новичков состоит в том, что они путают простой код с говнокодом. Но на самом деле между ними ничего общего. Код для новичков вполне может быть простым, но при этом не быть говнокодом.


    Опять же, в самой по себе идее "CMS без фреймворков" нет ничего зазорного. Каждый новичок обязательно должен пройти этот этап. Но статью про это писать надо только если в ней будут применяться правильные подходы, а не то, что каждый новичок и сам накалякает.


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


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