• Как сделать простой php-роутер?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    /app
    /app/controllers
    /app/controllers/hello
    /app/controllers/hello/world.php
    /app/controllers/index.php
    /app/routes.php
    /public
    /public/index.php
    /.htaccess
    /app.php

    .htaccess
    # .htaccess
    
    Options +FollowSymlinks -Indexes
    DirectoryIndex public/index.html public/index.php
    
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-l
    RewriteRule ^(.*)$ /public/index.php?_url=/$1 [L,QSA]


    app.php
    <?php
    // app.php
    
    define('__ROOT__', __DIR__);
    define('__APP__', realpath(__ROOT__ . '/app'));
    
    $routes = require_once __APP__ . '/routes.php';
    
    foreach ($routes as $pattern => $action) {
      if (! preg_match($pattern, $_SERVER['REQUEST_URI'], $matches)) continue;
    
      $action = array_filter(explode('/', $action));
      $file = basename(array_pop($action), '.php');
    
      array_push($action, $file);
    
      require __APP__ . '/controllers/' . implode('/', $action) . '.php';
      break;
    }


    public/index.php
    <?php
    // public/index.php
    
    // strict
    register_shutdown_function(function () {
      $error = error_get_last();
      if (! $error) return;
      if (! ($error['line'] ?? null)) return;
    
      $errno    = $error['type'];
      $errmsg   = $error['message'];
      $errfile  = $error['file'];
      $errline  = $error['line'];
    
      handle(new \ErrorException($errmsg, $errcode = -1, $errno, $errfile, $errline));
    });
    
    // error
    set_error_handler(function ($errno, $errmsg, $errfile, $errline) {
      if (! $errline) return;
    
      throw new \ErrorException($errmsg, $errcode = -1, $errno, $errfile, $errline);
    }, E_ALL);
    
    // handle
    function handle(\Throwable $e)
    {
      echo '<pre>';
      die(var_dump($e));
    }
    
    // index.php
    try {
      // run application
      require_once __DIR__ . '/../app.php';
    
    } catch (\Throwable $e) { handle($e); }


    app/routes.php
    <?php
    // app/routes.php
    
    $routes = [];
    
    foreach ([
      '/' => 'index',
      '/foo/bar' => 'index',
      '/hello/world' => 'hello/world',
    ] as $pattern => $action) {
      $routes[ '/^' . preg_quote($pattern, '/') . '$/' ] = $action;
    }
    
    return $routes;


    app/controllers/index.php
    <?php
    // app/controllers/index.php
    
    echo 'Index';


    app/controllers/hello/world.php
    <?php
    // app/controllers/hello/world.php
    
    echo 'Hello/World';
    Ответ написан
    5 комментариев
  • Можно ли в одном экземпляре класса получить ответ а в другом работать с ранее полученным ответом?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Первый скрипт запускается на сервере и второй там же. Что общего на сервере? Жесткий диск. Клади ответ в файл, потом файл читай.

    Если нужно оттолкнуться от прошлого ответа - можно сделать мультикурл (тогда это будет в одной странице, но больше ждать) - говоришь сначала сделай запросы туда туда и вон туда одновременно, а когда все они закончатся, делай дальше тото
    Ответ написан
    Комментировать
  • Можно ли это переписать на ООП? И как примерно всё это можно распределить по классам?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Мне очень понравилось, как мне объяснил это Алексей Пастушенко

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

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

    В действительности - косячит какая-то функция. Но когда есть некий обьект где она лежит, нам проще найти "виноватого" (модуль в коде) и пофиксить его.

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

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

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

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Интересное наблюдение. Может об этом говорят умники когда stateless. Типа первый контакт с сервером и токеном обязателен, сохранив куку и для второго домена тоже. Типа первый преобразует логин и пароль в токен а второй получая токен не из куки но из заголовка создает куку для другого домена.

    Другое может какойто локалсторейдж но никогда не видел статей которые прям хвалят локал сторейдж.

    Еще можно пробовать сделать сервер сессий на какомто редисе. И туда пихать а не в куку. Но походу все равно кудато надо деть идентификатор сессии потом поэтому не, бред.

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

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Переводы хранятся в хранилище переводов. Оно должно быть просто молниеносным, к нему будут много и часто обращаться даже один пользователь при отрисовке одной страницы.

    Простейшим способом делают - массив ключ-значение, а чтобы все сразу в оперативку не грузить (со временем переводов будет несколько тысяч) - разбивают на группы и подключают по мере необходимости еще одну группу и еще одну группу

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

    В базе хранят ключи из этого хранилища. После доставания информации копируют поля с припиской _lang доставая из переводов нужные ключи и производя подстановку переменных во фразу

    Мне очень понравился синтаксис одного из вордпрессовских модулей который я увидел много лет назад. Говорят он тянется еще из ruby, но я на руби не писал никогда.
    "[:en]hello world[:ru]привет, мир[:by]прывет, мiр"

    и функция _translate() понадобится
    потом _translate_to_language() - когда нужно будет на русской версии показать английским что-нибудь
    потом _translate_international() - когда нужно на любой версии показать базовым языком, который понимают большинство народов например
    потом _get_translate_array() который отдает просто массив для фронта, чтобы туда отправить переводы пачкой и там делать _translate()

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

    со временем возникает необходимость сделать переводы с поддержкой окончаний "22 рубля, 25 рублей, 21 рубль", наш синтаксис становится таким:
    "[:en]рубль[:ru1]рубля[:ru2]рублей[:en]rouble[:en1]roubles[:en2]roubles"
    и функция _getPluralIndexFromString() понадобится

    потом нам понадобятся подстановки, мне понравился такой синтаксис
    "[:en]hello, {=name}[:ru]привет, {=name}"
    и функция _interpolate() понадобится. Почему равно? Чтобы искать можно было с помощью while (strpos()) а не регуляркой
    и конечно же захочется чтобы в нее постоянно не скармливать массив параметров ключ-значение, а просто передавать их через запятую чтобы перевод выглядел как-то так
    __('@path.type.key', $param1, $param2) и оно само понимало что первый параметр нужно в первый поставить

    еще в определенный момент покажется что хранить текст на пару абзацев в переводах так себе идея, и возникнет необходимость сделать чтобы целые страницы можно было сразу делать на русском языке, то есть в папке шаблонов появится подпапка языка и шаблонизатор должен будет сначала поискать страницу на нужном языке

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

    казалось бы можно делать сразу массивом, зачем эти регулярки, ведь единственная проблема - неудобно отдавать переводчикам тексты - они не видят смысла сообщения, читая его на одном каком-то языке, если у тебя файлы en.php, ru.php, а говорить им "откройте два вместе" - никто как правило не делает, только жалуются ходят что плохо. поэтому в таком синтаксисе они видят сразу

    опять же в таком синтаксисе ключи переводов можно безболезненно сортировать по алфавиту в любом редакторе, т.к. переносов строк как таковых нет - мы используем \n. и можно нажимать F9 и все становится аккуратненько

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

    ключи удобнее всего именовать в следующей конвенции
    path_to_module.type.key

    сначала кажется что ключом может быть сама фраза на английском, но потом нужно получить по русскому тексту английский и облом. поэтому сразу ключи, без вариантов
    site_categories_form.title.product => "[:ru]Продукт"
    site_categories_form.option.product_empty => "[:ru]-- ВЫБЕРИТЕ ПРОДУКТ --"

    К сожалению это не задачка типа "ща переводики сделаем" - это нормальный пласт. Каждый раз натыкаешься на то, что то переводчикам неудобно, то хрен обновишь, то мисматч происходит между просто текстом и ключом фразы, то языки пересеклись, то на нужном языке нельзя вывести, то редирект не работает. Чтобы все это собрать, придется замучаться

    Это то как я сейчас делаю, кто знает умнее - пожалуйста укажите где можно лучше быстрее, с удовольствием улучшу
    Ответ написан
    Комментировать
  • Как изменить url после того как $_GET принял запрос?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Ты не можешь "изменить URL" ты можешь "перенаправить человека на другую страницу"
    и когда он туда перейдет - выполнится то же самое будто он сразу туда зашел

    header('Location:') это примерно такого же порядка функция как и "echo" - когда ты выводишь ответ.
    То есть пользователь не останется на странице где ты хочешь сменить URL. Пользователь получит ответ о том, что нужно без его ведома перейти на новую страницу

    Может в понимании этого была проблема?
    Ответ написан
  • Как сделать ЧПУ?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    ЧПУ в общем случае это айдишник в конце записи. Это гарантирует что страница уникальная.

    /articles/hello-world-1/

    По этой единичке мы и находим статью, а текст (slug: hello-world) ссылки может быть совершенно любой.
    Знаю что возникнет у тебя вопрос про дублирование контента, типа ссылка /hello-world-1/ ведет туда же, что и /hello-foo-1/, однако твой построитель ссылок всегда будет генерировать её по hello-world, и на сайте, видимым для роботов, никогда не будет hello-foo

    ps. "Плохие времена" к возможностям относятся так себе. Они будут, но не у тех, кто делает работу, а у тех, кто договаривается и считает деньги. И то что ты здесь, говорит что оно так и есть
    Ответ написан
  • Есть ли расширение для автоматического редиректа на русскую документацию php.net?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Я себе сделал когда-то в Sublime скрипт который по кнопке F1 брал выделенный текст и подставлял его в ссылку php.net через GET параметр.

    Работало, помогало

    Сейчас просто ctrl+t, g(oogle), "array_filter", Enter
    Ответ написан
  • Как правильно записывается массив в контроллер Laravel?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Весь массив надо воткнуть в ключ arr. Там под капотом функция export
    Ответ написан
    Комментировать
  • Почему медленно загружается страница на PHP, которая берёт данные из MySQL?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    ORDER BY put_date ASC
    больно ссуко( хотя может и не очень

    индекс на парент убедись что есть. можно даже внешний ключ, похер что в одной таблице.

    у тебя дерево вложенности. очень большое (больше 3-4 уровней вполне возможно) - да ещё и с огромным числом записей. делать его через
    id,parent_id
    это очень тяжело

    тебе нужно делать отдельную таблицу
    CommentsTree
    id, comment_id, parent_id, depth, level

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

    id, comment_id, parent_id, depth, level (левел можно в таблице комментов хранить а не в дереве, они одинаковые для конкретного коммента)
    // это вот было
    1, 1, 1, 0, 1 // читать как "коммент 1 родитель он же сам (1), дельта глубины 0, общий уровень 1"
    2, 2, 2, 0, 2 // читать как "коммент 2 родитель он же сам (2), дельта глубины 0, общий уровень 2"
    3, 2, 1, 1, 2 // читать как "коммент 1 родитель 1, дельта глубины 1, общий уровень 2"

    // добавляем потомка к 2
    4, 3, 3, 0, 3 // читать как "коммент 3 родитель он же сам (3), дельта глубины 0, общий уровень 3"
    5, 3, 2, 0, 3 // читать как "коммент 3 родитель 2, дельта глубины 1, общий уровень 3"
    6, 3, 1, 2, 3 // читать как "коммент 3 родитель 1, дельта глубины 2, общий уровень 3"

    Потом из этой таблицы можно дернуть WHERE parent_id = :parent и получить все дерево

    Если похожим образом будешь делать товары, которые кстати говоря бывают в двух категориях одновременно - то еще добавится поле category_path, где через точку (1.2.3) или в JSON ([1,2,3]) лежит путь до самого верха в качестве точки отсчета вместо category_id
    Ответ написан
    2 комментария
  • Можно ли работать с websocet на виртуальном хостинге?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Ты можешь и с обычной страницы сайта подключиться к сокету, получить что туда накидали и обработать. Но это не очень.

    В случае с виртуальным хостингом где нет консоли можно выпендриться поискав планировщик Cron и запустить задачу типа "1 раз в год выполни этот файл" - а он в свою очередь внутри while true и никогда не кончится.

    Но если ты запустишь и натупишь, то как ты убивать процесс будешь? Да собственно хрен его знает.
    Надо в твоем скрипте-сервере делать поддержку текста "exit;" который приходит в сокет и убивает его)

    Но это форменный изврат, отвечаю
    Посмотреть сокеты в ноде будет легче. Тем более что вся разница в том, что в пыхе ты подымаешь nginx или apache чтобы запускать скрипты, а здесь ты запускаешь node express какой-нибудь который точно то же самое делает
    Ответ написан
    Комментировать
  • Как правильно передать из ajax в php?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Так у тебя не аякс ругается, а видимо сама страница когда ты её без аякса запрашиваешь, потому что туда ничего не передали.

    Проблема комплексная.

    Не выводи в ответ ничего кроме редиректа, когда данные отправляются постом. Нефиг. Есть Гет для этого. Нет, это не значит что данные нужно отправлять гетом. Это значит что когда ГЕТ - отдавай верстку. А когда пост - сохраняй данные. Если нужно с Гета на Пост перейти и не потерять - есть сессия (привязана к тому кто запрашивал) или база (для всех, придется ввести признак, как ты поймешь что это его). Этот совет актуален когда ты запрашиваешь страничку через браузер.

    В случае с Аяксом (параллельной отправкой) действуют правила API - компьютеры общаются между собой, им плевать что ты хотел нарисовать, они понимают только текст. Причем не понимают - они его передают и обрабатывают. А если еще точнее то они передают пакеты и им даже на текст плевать, но с текстом тебе привычнее работать. То есть в ответ на Пост пусть вылетает JSON с массивом а не верстка. Верстку строим потом на клиенте.

    В третьих можно писать так $id = $_POST['id'] ?? null; если пыха (не бэха) семерка. На крайняк
    $id = (! empty($POST['id']) ? $_POST['id'] : null;
    Ответ написан
    Комментировать
  • Как исправить Array to string conversion?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Во первых ты пытаешься file_get_contents() от объекта $file. Эта функция на вход хочет строку.
    Возможно у твоего обьекта file есть какой-нибудь arrayAccess или __toString() почему-то возвращающий массив

    $arrayFiles[] = (StorageFactory::make('minio'))->store($file->getClientOriginalName(), file_get_contents($file));


    Может как-то так
    file_get_contents($file->getClientFilePath())

    функцию getClientFilePath() я с потолка взял. Она не имеет смысла кстати. Путь на клиенте тебе не доступен для чтения. Если это файл отправляемый пользователем там будет что-то $file->getTmpPath(), куда он временно закачался для твоего скрипта и откуда исчезнет если ничего не сделать. И там будет не file_get_contents() а какой-нибудь copy($file->getTmpPath(), $new_location);

    Второй код ничего не говорит и даже не вызывает твой $arrayFiles никак не привязан

    Что до $response, то если в нем $arrayFiles; то сделать "echo Array()" нельзя без такой ошибки. Сначала Array() нужно конвертировать в строку с помощью json_encode() или там serialize() или другим способом
    Ответ написан
    2 комментария
  • С помощью какого модификатора повторить регулярное выражение многократно?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Плюсиком не иначе
    если нужно заменить 'vas' в строке 'vasiliy vasilievich' регулярка ~(^|[ ])vas~
    словами "взять vas перед которыми начало или пробел"

    дальше либо preg_match_all() чтобы найти все, либо preg_replace() которая и так пройдется по всем.

    другой вопрос - что метасимволов подряд сколько-то и ты хочешь их все в разные группы, тогда такое ~([0-9]+;)+~
    но это будет как бы выборка нескольких групп идущих подряд, а не всех повторений в строке

    мне кажется в твоем случае у тебя регулярка не совсем правильная.

    можешь потренироваться на regex101 сайте, там сразу видно результат
    Ответ написан
    Комментировать
  • По какому принципу работает autoload в composer?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    .ну в пыхе есть событие которое стреляет если ты пытаешься получить класс который еще не подгружен в память. Чтобы добавить на него действия, есть функция spl autoload register

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

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

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Есть библиотеки которые требуют не одного файла, а пачки. В этом случае их целой паркой кладут куда нибудь в а почему бы и не в libs. Но лучше установить yarn, он пенек быстрый как самолет и сам все разложит. Вернее не разложит а скачает в свои папки.

    Следующая проблема будет при сборке библиотек в один файл для скорости. Вот тут вспомни про папки. Будешь указывать не только addCss но и copyDirectory, иначе либа заработает но вместо картинок будут крестики. И да для либ распространяемых целиком не удастся сделать общий файл со всеми библиотеками, ибо придется менять код файлов которые часто внутри имеют относительные пути. Ктото решает вебпаком, ктото подключает целые либы без связывания в один файл, ну такое
    Ответ написан
    Комментировать
  • Как подключить phpunit 8+ без автозагрузчика composer?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Да он хороший, не отказывайся. Загрузчик то только классы ищет по файлам и все. Нету в загрузчике придется require class.php... но яйца в профиль те же получатся

    Там под капотом spl autoload register и полный список всех файлов ы закешированном виде, а так никакой магии
    Ответ написан
    2 комментария
  • Когда стоит писать модули а когда контроллеры?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Контроллер в переводе на человеческий равен частному случаю. А модуль = в данном разговоре это повторяющийся кусок. Вот так рассуждай. Проверка входных данных это обычно частный случай. А вот сам проверяльщик это модуль.

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

    Кстати выглядеть будет топорно но иначе никак. Булет чтото вроде new CategoriesCreateRequest() хотя казалось бы у нас и так есть CategoriesController createAction. Просто у нас будет несколько контроллеров категорий под разные страницы сайта
    Ответ написан
    Комментировать
  • Как реализовать присоединение пакета к laravel через интерфейс?

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Если тебе поможет, то я понимаю интерфейсы таким образом:

    Это име4на неких кусков программы, о которых ты можешь пояснить даже директору.

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

    Поскольку у тебя библиотеки две и делают одно и то же, тебе нужен класс обертка, который подобно переключателю может включить первую или вторую, а потом при вызове метода передать исполнителю, на котором сейчас переключатель

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

    gzhegow
    @gzhegow
    aka "ОбнимиБизнесмена"
    Когда в проекте появляется слишком много таблиц, мы не можем быть уверены, что одним махом исправим их все, сложно написать код который работает сразу со всеми таблицами.
    И когда тебе в случае ошибки в логике работы со всей базой в целом нужно править не только API но и фронтенд твой - верстки, выводы элементов и так далее - становится очень печально и желание работать пропадает.

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

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

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

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

    Это не "лучше", это "иначе".
    Ответ написан
    Комментировать