Задать вопрос
  • Зачем использовать реляционные субд для этой ситуации?

    @xfg
    Если комментариев к статье неограниченное количество, то хранить данные таким образом - неудачная идея. В mongodb документ по умолчанию не может превышать более 16 mb, но даже при отсутствии подобного ограничения, это привело бы к единовременному считыванию большого объема данных в память. В таком случае данные следует моделировать также, как и в РСУБД.

    Есть CAP-теорема и выбирать тип базы данных нужно исходя из того, какие 2 из 3 свойств для вас важнее. РСУБД дают согласованность и доступность (CA), но жертвуют возможностью разделения такой базы, nosql решения идут другим путем и жертвуют согласованностью в пользу доступности и устойчивости к разделению (AP). Согласованность данных в таких системах достигается при помощи шаблона Saga вместо ACID.

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

    Для проекта с крохотными объемами данных логичнее выбирать РСУБД и тем самым значительно упростить себе жизнь. Но в целом как используют NoSQL, шардируют данные и как достигают согласованности данных при отсутствии ACID знать желательно, хотя бы в общих чертах.

    Самое ужасное, это выбрать базу данных и использовать её неправильно, как пример документа с вложенными комментариями при условии их бесконечности в mongodb. Пишем скрипт генерирующий триллион комментариев к статье, а затем просим нам выдать эту статью и сайт уходит в офф. Хорошо что в mongodb есть защита от дурака.
    Ответ написан
    1 комментарий
  • Есть ли какой-нибудь реальный смысл использовать MongoDB вместо MySQL (расшифровка вопроса в тексте)?

    @frozen_coder
    Java-developer
    Всё зависит от данных и как вы с ними будете работать. Жить без монги можно и даже хорошо. Если у вас реляционные данные, то вам нужна реляционная БД. Если ваши данные можно представить в виде документа и с данными вы работаете как с документом, то вам подойдёт Монга.

    Приемущество Монги в отсутсвии схемы - если схема часто меняется и у вас дохрелион записей в реляционной бд с этим может быть больно, хотя у всех уже давно есть поддержка JSON.
    Также вам не нужны никакие join'ы - просто достаёте сразу весь документ. Шардирование делать попроще. Если вам нужно выбирать из нескольких коллекций, то можно это сделать в приложении через отдельные запросы.

    Большинство использует её, потому что это просто, быстро разрабатывать, особенно в js - закинул объект да и всё. Не надо про схемы думать. Фигак-фигак. Кто-то использует как объектный кэш.

    Я использовал на проекте с документной структурой данных - одна сущность-агрегат, а всё остальное лишь её части и существуют только для неё. И когда часто меняется состав полей. И объемы большие. Одна основная коллекция и несколько коллекций-справочников, которые кэшируются.
    Ответ написан
    1 комментарий
  • В чём смысл ContainerExceptionInterface в PSR-11?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    В том, чтобы фреймворки и библиотеки эти интерфейсы реализовывали в виде своих исключений, но при этом не нужно было на эта конкретные реализации завязываться. Словом, смысл такой же, как и у любого другого интерфейса.
    Ответ написан
    6 комментариев
  • Каковы best practice по использованию React вместе с PHP-шаблонизаторами (Blade, Twig)?

    KulakovAngel
    @KulakovAngel
    Full Stack Developer (Node.JS)
    Доброго дня! Давайте разберемся.
    Достаточно ли просто создать div#catalog и рендерить в него компоненты реакта?

    Ответ: достаточно просто (ссылка на песочницу). Допустим, имеется шаблон (я использовал HTML, но, думаю, с Blade проблем не возникнет):
    <html>
      <head>
        <title>PHP React Test</title>
    
        <script src="https://unpkg.com/react@17/umd/react.production.min.js" crossorigin></script>
        <script src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js" crossorigin></script>
        <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
      </head>
      <body>
        <?php
          $INIT_PARAMS = ['user' => 'Vasilij']; // данные из PHP
          echo '<p>Hello React App</p>';
        ?>
    
        <div id='react-app'></div>
    
        // React-component. Конечно, лучше вынести в отдельный файл, если кода много.
        //  Еще лучше скомпилировать и подключить минифицированный бандл. Здесь - концептуальный пример.
        <script type="text/babel">
          'use strict';
          const {useState} = React;
    
          function App({user}) {
            const [liked, setLiked] = useState(false);
            return (
              liked ? (`You (${user}) liked this.`) : (
                <button onClick={() => setLiked(true)}>
                  Like
                </button>
              )
            )
          }
    
          const domContainer = document.querySelector('#react-app');
          ReactDOM.render(<App user={'<?=$INIT_PARAMS['user']?>'}/>, domContainer);
        </script>
      </body>
    </html>


    И как быть с SEO в таком случае?

    Правильный вопрос. То, что мы сделали выше - называется "клиентский рендеринг". Для оптимизации SEO он не очень подходит. Такой способ прост, но используется там, где SEO не нужно (например, приложение, в которое в принципе нельзя зайти, не пройдя процедуру авторизации). Для оптимизации SEO используется серверный рендеринг (SSR), а точнее изоморфная структура приложения (совмещаем SSR и CSR). Но поскольку PHP и JS - разные языки, нам потребуется "компилятор JS" прямо в PHP (мы же хотим скомпилировать JS на сервере и отправить клиенту готовый HTML). Для этого можно использовать V8Js. Почитать подробнее можно, погуглив, например.

    Но, наверное, многие согласятся, что такое использование не типично и крайне усложняет и без того сложный процесс. Если Вы хотите попробовать из академического интереса - я кое-что объяснил. Если же мы говорим про best practice, то давайте разберемся, что Вы хотите:
    • Использовать PHP?
    • Или использовать React SSR?


    1. Если Вы хотите использовать PHP и добавить компонентам реактивности, нечто подобное уже реализовано в Laravel: присмотритесь к laravel-livewire или inertiajs. Я бы рекомендовал laravel-livewire. Инструкция по установке того и другого: jetstream Получите архитектуру, почти как в React, только на сервере. Все живое, стэйт обновляется (как? автоматически через скрытые ajax-запросы). Вот, нашел наспех что-то из своего проекта (public $adJob играет роль состояния):
      <?php
      
      namespace App\Http\Livewire;
      
      use Livewire\Component;
      use Illuminate\Support\Facades\Auth;
      
      class AdJob extends Component {
          
          public $adJob;
          
          public function mount($adJobId) {
              $this->adJob = \App\Models\AdJob::find( $adJobId );
          }
          
          public function setReleaserForAdJob($releaserId) {
              $this->adJob['releaser_id'] = $releaserId;
              $this->adJob['status'] = 'in_progress';
              $this->adJob->save();
          }
          
          public function setAdJobDone() {
              $this->adJob['status'] = 'done';
              $this->adJob->save();
          }
      	
          public function render() {
              return view('livewire.ad-job-with-reviews');
          }
      }

      И последнее. Если не знакомы с Laravel, но нравится PHP - самое время начать изучать.

    2. Ежели желаете использовать React - то много проще (чем с PHP) использовать React SSR на Node.js. Самые популярные способы:
      1. Nextjs, как заметил Андрей Хохлов. Здесь все просто: изучайте документацию по этой технологии.

      2. React SSR + Express. Здесь, по сути, все то же самое, просто настроить все нужно самому. Хотя, это и более интересно (мне так кажется). Ситуация такова:

        1. Создаем React-приложение на клиенте. Делаем бандл. В пункте 3 будет небольшое дополнение сюда.


        2. На нужных маршрутах на сервере используем
          res.send(ReactDOMServer.renderToString(myElement)) - получаем нечто вроде создания "шаблона" (res.send - API express, остальное - react)


        3. На клиенте вместо ReactDOM.render() вызываем ReactDOM.hydrate(element, container), это позволяет не создавать разметку заново, а "гитратировать" HTML, отрендеренный React-ом на сервере и полученный браузером.


        Есть также пакеты, позволяющие настроить использование React как шаблонизатора, например: @react-ssr/express. Под капотом он использует тот же renderToString, только с правильной архитектурой и дополнительными, уже настроенными возможностями. В 12-ой строке файла default.tsx из пакета можно увидеть:
        const html = ReactDOMServer.renderToString(app);





    Таким образом, если интерес для Вас представляет именно PHP - рекомендую Laravel + livewire-компоненты. Если хотите именно React SSR - я бы предпочел Node-стэк (Next или Express+React, вначале сам попробовал бы, потом можно попробовать использовать готовый пакет). Вообще best practice - Next.
    Ответ написан
    2 комментария
  • Каковы best practice по использованию React вместе с PHP-шаблонизаторами (Blade, Twig)?

    Есть опыт с Vue в похожей ситуации, суть та же самая.

    Где-то в шаблонах формируется контейнер для компонента, в атрибутах которого передаются пропсы для компонента:

    <div 
      data-component="ComponentName"
      data-component-props='{ "id": "123", "foo": "bar" }'
    >
    </div>


    Где-то в Component.js происходит инициализация компонента:

    // псевдо-код
    const el = получили элемент с data-component="ComponentName" или с каким-то id и т.д.
    const props = спарсили пропсы из атрибута 
    const app = отрендерили React-компонент в этом жлементе передав ему пропсы


    С Vue ранее еще пробовали инициализировать приложение прямо на body и использовать кастомные теги для компонентов, но выходило хуже, с пропсами было неудобно.

    Из известных крупных сайтов Lamoda например делает что-то подобное. Поищите по исходному коду страницы товара <div class="vue-widget">

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

    По опыту использования такого подхода на нескольких средних проектах могу сказать, что подход рабочий. Писать динамические компоненты на Vue гораздо удобнее. Мы написали что-то вроде недо-микро-фреймворка для удобного биндинга vue и не-vue компонентов https://github.com/interfacesdev/nospa Внутри у себя используем, но рекомендовать к вашему продакшену не могу - документация не закончена, поддержки нет, на гитхаб пока просто выдернули актуальную версию с прошлого проекта. Может когда-то руки дойдут заняться плотнее.

    А в целом значительно удобнее писать фронт полностью на Vue/React, используя, например, Next/Nuxt для рендеринга и все эти по сути костыли просто от безысходности :( Но это уже тема отдельной дискуссии.
    Ответ написан
    1 комментарий
  • Как создать такую связь в Eloquent?

    @kandrash
    Кратко о себе
    Да, это же обычная связь many-to-many. А option_value это pivot поле https://laravel.com/docs/8.x/eloquent-relationship...
    Ответ написан
    1 комментарий
  • Алгоритм поиска по тегам?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Никак. Нельзя хранить теги текстовым полем с записанными подряд тегами. Для этого делают связь многие-ко-многим, где теги в отдельной таблице, записи отдельно и есть таблица связей тегов к записям.
    Ответ написан
    24 комментария
  • Как получить последнюю директорию в строке?

    Stalker_RED
    @Stalker_RED
    ([^\/]+)\/$
    Ответ написан
    Комментировать
  • Как называется это окно?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    StartupScreen
    Ответ написан
    Комментировать
  • Что выбрать CS-Cart или Shop-script 7?

    Sanes
    @Sanes
    1. CS-Cart;
    Ответ написан
    Комментировать
  • Что выбрать CS-Cart или Shop-script 7?

    2. Shop-Script 7

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

    opium
    @opium
    Просто люблю качественно работать
    Просто получите деньги и забудьте о том что было до этого и оформите только новое, везде новые даты
    Ответ написан
    2 комментария
  • Получить платежи из-за рубежа задним числом?

    @Stalinko Куратор тега Фриланс
    PHP'шник и фрилансер до мозга костей
    Всё, что было в прошлом, пусть там и останется. Об этом не нужно знать налоговой.
    Сейчас поступаете так:

    1. Открываете ИП
    2. Оформляете патент
    3. Переделываете договор, чтобы дата начала была не раньше даты открытия ИП. Договор соответственно будет уже не с вами лично, а с вашим ИП.
    4. Со следующего платежа начинаете работать в белую. Т.е. деньги переводят вам на р/с, показываете договор и инвойс в валютный контроль. На любые вопросы отвечаете, что это первый платёж по данному договору.
    Ответ написан
  • Как определить свой уровень программирования?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Похоже ботов кинулись писать даже те, кто вообще программировать не умеет. Надеюсь эта волна не докатится до медицины.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Очень смешной топик.
    Сразу видно что почти никто из советчиков никогда с реальным интернет-магазином не работал.

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

    Ну и третье, уже специально для автора вопроса, а не только для всех юных писателей крупных интернет-магазинов - сначала, перед тем как приступать к написанию крупных интернет магазинов, следует изучить букварь по веб-разработке. И открыть для себя, что у любого интернет-магазина, даже некрупного, есть back-end. В котором, в общем-то, вся логика работы с товарами, заказами и корзиной и реализуется. И которое к "SPA на реакте" не имеет ни малейшего отношения. И чтобы написать которое, надо учить основы баз данных, SQL и какой-нибудь серверный язык программирования. Ну и ещё примерно 20 дисциплин.
    Ответ написан
    3 комментария
  • Есть ли сайты, на которых собраны множество "рецептов" по html/css?

    Eugevin
    @Eugevin
    22 года, frontend как смысл жизни
    Оу, май, парень. В этом плане лучше всех CSS-Tricks! И это на самом деле лучший ресурс: трюки, фишки, обучение и гайды с подробным описанием всех новейших технологий в области HTML/CSS (Flex, Grid, красивые менюшки и так далее)
    Ответ написан
    Комментировать
  • Только только начал изучать веб-программирование, как у меня успехи?

    approximate_solution
    @approximate_solution
    JS Developer. Angular\React\Vue\Ember
    Я повар уже более 11 лет

    У меня для Вас плохие новости, если вы за 11 лет не выросли из просто повара, до шеф повара с заплатой которая позволяет комфортно жить, и у вас влажные мечты по поводу веба из реклам в интернете, где 17 летний парень отдыхает на мальдивах с большегрудой красоткой и кодит - не ведитесь, вас обманули. Работайте дальше поваром, у вас больше шансов на успех в той сфере, где вы хоть минимально можете дать фору.
    Ответ написан
    24 комментария
  • Можно ли реализовывать админ панель для cms с помощью iframe?

    PavelK
    @PavelK
    Через IFrame делать слегонца устарело (лет так на 15).
    Выводите всё сразу в страницу.
    Если что-то не работает ищите причину. Как минимум для более подробного ответа, нужно знать, где Вы выводите php и что внутри самого settings/index.php
    Ответ написан
    1 комментарий
  • Можно ли реализовывать админ панель для cms с помощью iframe?

    revenger
    @revenger
    49.5
    Изучайте шаблонизаторы.
    Хедер - один шаблон.
    Меню - другой.
    Футер - третий.
    И так далее.
    Еще лучше, если сразу начнете делать на фреймворке.
    Ответ написан
    Комментировать