• Смысл модулей в Yii2?

    maksim92
    @maksim92 Куратор тега Yii
    Нашел решение — пометь вопрос ответом!
    Как написано в документации:
    Модули - это законченные программные блоки, состоящие из моделей, представлений, контроллеров и других вспомогательных компонентов. При установке модулей в приложение, конечный пользователь получает доступ к их контроллерам. По этой причине модули часто рассматриваются как миниатюрные приложения. В отличии от приложений, модули нельзя развертывать отдельно. Модули должны находиться внутри приложений.


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

    При поломке одного модуля — не ломается все приложение. На эту тему можно прочитать статью Как проектировать табуретку?. Когда-то отвечал на подобную тему на Toster.

    Архитектуру Модулей в приложении вы можете придумать сами. Главное, чтобы доменный слой был независимым. Под модули можете сделать отдельную корневую папку с названием модуля:
    - Backend
    - Frontend
    - Shop
    - Blog

    Или же сгруппировать:
    - Backend
    - Frontend
    - Modules
    - Modules/Shop
    - Modules/Blog

    Контроллеры и вид при этом будут просто разделены по папкам модулей:
    - Backend/Controller/Shop
    - Backend/Controller/Blog
    - Frontend/Controller/Shop
    - Frontend/Controller/Blog
    
    Например,
    так или так. Разделение в Models делите все по папкам модулей:
    Model/Shop
    Model/Blog

    Подведя итог:
    1. Модуль служит для изоляции отдельных частей приложения на разные детали. При поломке двигателя не сломается шасси. Шасси можно поменять на шасси от другого авто, при этом двигателю всё равно на каком шасси автомобиль.
    2. Модуль можно переиспользовать в других проектах или выложить в отдельный репозиторий и подключать в composer.
    3. Хорошо структурированный, читаемый и понятный код. Сопровождаемость.
    4. Тестируемость
    5. Горизонтальное масштабирование.
    и др.

    Разделение модулей происходит по папкам следуя стандартам PSR7.

    Полезные статьи на схожую тему:
    1. https://toster.ru/q/659155
    2. Мой вопрос на форуме
    3. Организация независимых модулей на Yii2
    Ответ написан
  • Как автоматически заменить группу полей в строке?

    maksim92
    @maksim92
    Нашел решение — пометь вопрос ответом!
    Можете попробовать vsprintf, sprintf или str-replace. vsprintf('%d %s %s', [1,'Имя', 'Фото’]);
    Ответ написан
  • Как разрабатывать с docker на mac os?

    Мне кажется, вы не совсем корректно поняли совет. Нужно было использовать Linux(без иксов) только для запуска докеров, а не перебираться работать в виртуалку.
    Ни разу схему выстраивать такую не приходилось, но раз в нативном докере работает, то и так тоже должно завестись.
    Можно сетевые карты мака и линухи объединить в бридж, а контейнеры в линухе запускать сеть в режиме Host.
    Возможно это излишне и из контейнеров можно ходить на мак по его ip, а не через loclahost. По крайней мере так делает нативный докер
    Ответ написан
  • Как разрабатывать с docker на mac os?

    браузеры и другие инструменты в ubuntu. Так как safari и chrome теперь не открываются по localhost.


    естественно, потому что они внутри виртаулки, внутри докера.
    и надо соединяться на IP виртуалки.

    я думаю, примерно, как-то так:
    • в виртуалке parallels desktop ставится Linux (можно без иксов, они не нужны) + Docker + LAMP
    • вся среда: бразуеры, PHPStorm и пр. ставится в маке
    • в виртуалке настраивается проброс необходимых портов в Linux (см. поиск parallels desktop port forward into guest system ), далее в docker
    • настраиваете удаленную отладку через XDebug (PHPStorm Xdebug remote debugging)
    • браузером ходите на IP виртуалки на настроенный выше порт
    • разделы из виртуалки/докера можно подключить в mac по sshfs например, вроде есть такое, гугли mac sshfs
    Ответ написан
  • В каком месте использовать Vuex?

    bootd
    @bootd
    Гугли и ты откроешь врата знаний!
    vuex - хранилище данных!!!!! Уже тут всё понятно должно быть)))
    Суть проста, в vuex есть actions - это методы, которые запрашивают данные, есть mutations - методы, которые записывают полученные данные, есть state - свойства, которые хранят записанные через mutations данные.

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

    // store/news.js
    export const state = () => ({
      news: null,
    });
    
    export const actions = {
      // Запросить новости с бекенда
      async getNews ({ commit }, { page, author, date }) {
        try {
          const data = await axios.get('/api/news', {
            params: {
              page, // Номер страницы
              author, // Автор
              date // Дата
            }
          })
    
          // Полученный json с данными положить в хранилище используя мутацию
          commit('setNews', data)
        } catch (error) {
          console.error('Твою мать!!!', error)
        }
      }
    };
    
    export const mutations = {
      // Положить данные в state
      setNews: (state, news) => { state.news = news }
    };


    <!-- pages/news.vue -->
    <template>
    <div>
      <ul v-if="news">
        <li v-for="newsItem in news">{{ newsItem.title }}</li>
      </ul>
      
      <!-- Пагинация -->
      <button @click="onGetNews({ page: 1 })">1</button>
      <button @click="onGetNews({ page: 2 })">2</button>
      <button @click="onGetNews({ page: 3 })">3</button>
      <button @click="onGetNews({ page: 4 })">4</button>
      
      <!-- По автору-->
      <button @click="onGetNews({ author: 'Бил Гейтс' })">Бил Гейтс</button>
    
      <!-- По дате-->
      <button @click="onGetNews({ date: '06.08.2019' })">06.08.2019</button>
    </div>
    </template>
    
    <script>
    import { mapState, mapActions } from 'vuex'
    
    export default {
      // При создании компонента запросить данные
      async created () {
        await this.getNews({
         page: this.$route.query.page,
         date: this.$route.query.date,
         author: this.$route.query.author
        })
      },
      computed: {
        // "импортировать" из хранилища новостей данные в компонент
        ...mapState('news', [ // Имя модуля хранилища
          'news' // Свойство news из state в хранилище
        ])
      },
      methods: {
        // "импортировать" метод запроса новостей из хранилища
        ...mapActions('news', [ // Имя модуля хранилища
          'getNews' // Метод getNews в разделе actions
        ]),
    
        async onGetNews ({ page, author, date }) {
          await this.getNews({ page, author, date  })
          
          // Добавим в адрес гет параметр фильтра
          this.$router.push({ 
            path: 'news', 
            query: { 
              page, 
              author, 
              date
            }
          })
        }
      }
    }
    </script>


    Думаю суть ясна. Я и так всё написал. Вам лишь нужно поглядеть на youtube ролики про хранилище и сделать то, что я написал + сделать нормальную пагинацию
    Ответ написан
  • Как хранить настройки регистрации?

    @grinat
    Одна таблица сам евент с датой/валютой и прочей херней которая у всех идентична. Другая таблица id поля, название, тип. Третья с id eventa, id поля настроек, значение поля. https://designpatternsphp.readthedocs.io/ru/latest...
    Ответ написан
  • Как хранить настройки регистрации?

    IgorPI
    @IgorPI
    Для начала, какой стек технологий планируете использовать?

    Как хранить, вопрос риторический отчасти.

    Если ближе к делу, то ...
    -----------------------------------------------------
    Вам нужно продвинуться в сторону ORM.
    Работать с сущностями, сложного нечего нет.

    Прочтите немного, что-нибудь про ORM.

    Плюсы.
    - Работа с данными в виде объектов.
    - Ускорение разработки

    например, вам нужно сохранить какие-нибудь настройки, вы делаете так:

    $setting = new Setting();
    $setting->setCount(12);
    
    $sub_settings = new SubSettings();
    $setting->setSubSettings($sub_settings); // и даже так
    
    $em->persist($setting);
    $em->persist($sub_settings);
    
    $em->flush();


    И всё, ваши данные в базе, со всеми отношениями.

    Нужно получить данные, снова достаёте их, и работаете как с объектами.

    Может показаться сложным, но только первые пару дней.
    После, вопросы, "как хранить настройки регистрации на мероприятия" сами собой отпадут.

    Моё субъективное мнение.
    Ответ написан