Несколько TailwindCSS в одном проекте
Задача
1. У нас есть сайт с панелью администратора на TailwindCSS.
2. В CSS-файле админки НЕ должно быть классов от основного сайта (и наоборот).
Проблема
1. В TailwindCSS есть крутая функция, которая оставляет только CSS-классы из нашей вёрстки.
2. Вопрос - как разделить конфигурацию TailwindCSS для админки и основного сайта, чтобы они НЕ пересекались?
Решение
1. Мы можем указать TailwindCSS какой файл конфигурации использовать в каждом случае.
2. При использвании LaravelMix мы просто передаём название файла конфигурации отдельно для основного сайта и админки.
На скринах 2 отдельные конфигурации TailwindCSS для основного сайта (tailwind-app.config.js) и админки (tailwind-admin.config.js), а так же пример их сборки через LaravelMix с указанием конкретного конфига.
Полезно? Сделай репост! 👍
#tailwind #tools #mix
Задача
1. У нас есть сайт с панелью администратора на TailwindCSS.
2. В CSS-файле админки НЕ должно быть классов от основного сайта (и наоборот).
Проблема
1. В TailwindCSS есть крутая функция, которая оставляет только CSS-классы из нашей вёрстки.
2. Вопрос - как разделить конфигурацию TailwindCSS для админки и основного сайта, чтобы они НЕ пересекались?
Решение
1. Мы можем указать TailwindCSS какой файл конфигурации использовать в каждом случае.
2. При использвании LaravelMix мы просто передаём название файла конфигурации отдельно для основного сайта и админки.
На скринах 2 отдельные конфигурации TailwindCSS для основного сайта (tailwind-app.config.js) и админки (tailwind-admin.config.js), а так же пример их сборки через LaravelMix с указанием конкретного конфига.
Полезно? Сделай репост! 👍
#tailwind #tools #mix
🔥15👍10
Ничего себе вчера народу подписалось 😃 Всем привет! 👋 В закрепе есть наш чат, где можно потрещать, если что 🤝 Велком!
👍2
Коллеги, в комментариях к предыдущему посту вы спрашиваете - в чем особенность того конструктора?
Отвечаю - PHP 8.1 позволяет указывать аргументы конструктора таким образом, что они сразу становятся свойствами этого класса.
Раньше нам нужно было:
1. Объявить свойство класса.
2. Указать аргумент в конструкторе.
3. Сохранить значение в это свойство.
А теперь это одна строчка кода.
Классический пример на скрине. Можно сравнить 👍
Отвечаю - PHP 8.1 позволяет указывать аргументы конструктора таким образом, что они сразу становятся свойствами этого класса.
Раньше нам нужно было:
1. Объявить свойство класса.
2. Указать аргумент в конструкторе.
3. Сохранить значение в это свойство.
А теперь это одна строчка кода.
Классический пример на скрине. Можно сравнить 👍
❤4🔥1
Спасибо за лайки! Вот так бы всегда 😃
Как обещал прикладываю простой пример использования нашей функции
Смысл примера:
- У нас есть посты в блоге (как обычно =))
- Приходит запрос за списком постов (GET api/posts)
- В запросе могут быть параметры (категория, поиск, страница пагинации)
- Мы хотим кешировать результаты предыдущих запросов, чтобы не тревожить базу по пустякам
- Но нам нужен ключ для кеша, который зависит от параметров в запросе (категория, страница и поиск)
- Поэтому мы берём массив параметров из запроса (по сути - фильтров) и формируем из них подпись при помощи нашей функции
- Как вы помните,
Поэтому наш «отпечаток пальца» помогает нам сформировать ключ для кэша ($key) именно под этот запрос.
Надеюсь пример понятен. Если что обсуждаем вопросы в комментариях. Лайк! 🤝
#tip
Как обещал прикладываю простой пример использования нашей функции
fingerprint
, которая возвращает подпись массива.Смысл примера:
- У нас есть посты в блоге (как обычно =))
- Приходит запрос за списком постов (GET api/posts)
- В запросе могут быть параметры (категория, поиск, страница пагинации)
- Мы хотим кешировать результаты предыдущих запросов, чтобы не тревожить базу по пустякам
- Но нам нужен ключ для кеша, который зависит от параметров в запросе (категория, страница и поиск)
- Поэтому мы берём массив параметров из запроса (по сути - фильтров) и формируем из них подпись при помощи нашей функции
- Как вы помните,
fingerprint
сначала сортирует массив по ключам, поэтому результат всегда будет одинаковый НЕ зависимо от порядка элементов в массиве.Поэтому наш «отпечаток пальца» помогает нам сформировать ключ для кэша ($key) именно под этот запрос.
Надеюсь пример понятен. Если что обсуждаем вопросы в комментариях. Лайк! 🤝
#tip
👍13
Как понять за 30 секунд, подходит ли тебе страна
Коменты там угарные 😂
https://vc.ru/migrate/404455-kak-ponyat-za-30-sekund-podhodit-li-tebe-strana
#fun
Коменты там угарные 😂
https://vc.ru/migrate/404455-kak-ponyat-za-30-sekund-podhodit-li-tebe-strana
#fun
👍2😱2
Хай, гайз! Делюсь с вами еще одной фишкой из старого проекта.
Что имеем
1. Обычное html-поле
2. Проект на Laravel + Livewire-компонент с формой для пользователя.
3. Шаблон на старом добром
Задача
1. Определять страну пользователя по IP-адресу.
2. Автоматически выбирать эту страну в
3. Если страна у пользователя уже выбрана ранее, то ничего делать не нужно.
Решение
1. При загрузке страницы делаем GET-запрос на сервис
2. Если удалось получить страну, то устанавливаем её код (например RU) в качестве значения для соответсвующего свойства нашего Livewire-компонента (благо в базе ID стран - это их ISO-коды)
3. Магия Livewire автоматически выбирает эту страну в селекте благодаря реативности через
Профит! И лайк 🤗
#laravel #livewire #tip
Что имеем
1. Обычное html-поле
select[type="country_id"]со списком стран.
2. Проект на Laravel + Livewire-компонент с формой для пользователя.
3. Шаблон на старом добром
Bootstrap 4 + jQuery(купленый шаблон).
Задача
1. Определять страну пользователя по IP-адресу.
2. Автоматически выбирать эту страну в
selectв нашем компоненте.
3. Если страна у пользователя уже выбрана ранее, то ничего делать не нужно.
Решение
1. При загрузке страницы делаем GET-запрос на сервис
ipinfo.ioдля определения страны пользователя по его IP (бесплатный тариф до 50к запросов в месяц).
2. Если удалось получить страну, то устанавливаем её код (например RU) в качестве значения для соответсвующего свойства нашего Livewire-компонента (благо в базе ID стран - это их ISO-коды)
3. Магия Livewire автоматически выбирает эту страну в селекте благодаря реативности через
wire:model="country_id".
Профит! И лайк 🤗
#laravel #livewire #tip
👍10
ПС: можно обсудить детали в нашем телеграм чате:
https://t.me/onecode_chat (свободно 2 места)
https://t.me/onecode_chat (свободно 2 места)
OneCode
Хай, гайз! Делюсь с вами еще одной фишкой из старого проекта. Что имеем 1. Обычное html-поле select[type="country_id"] со списком стран. 2. Проект на Laravel + Livewire-компонент с формой для пользователя. 3. Шаблон на старом добром Bootstrap 4 + jQuery…
Конкурс! Приз 500 рублей на карту 💸
Победителем станет тот, кто напишет в комментариях что можно оптимизировать в примере из этого поста. Написать нужно то, о чем я думаю 😃 и приложить полноценный пример кода.
Выиграет первый правильный ответ, НО сообщение нельзя изменять!
Удачи 👍
Победителем станет тот, кто напишет в комментариях что можно оптимизировать в примере из этого поста. Написать нужно то, о чем я думаю 😃 и приложить полноценный пример кода.
Выиграет первый правильный ответ, НО сообщение нельзя изменять!
Удачи 👍
Выделение частного класса данных
Обычно классы всегда изначально выглядят чёткими и понятными. Они выполняют свою работу и не лезут в обязанности других классов. Однако при разработке программы добавляется новая логика. В результате некоторые классы ошибочно получают массу дополнительных обязанностей. На помощь приходит частный метод рефакторинга, известный под названием Выделение класса (Extract Class). Он позволяет соблюсти «Принцип единственной ответственности», тем самым делая классы более надёжными и устойчивыми к изменениям.
Чтобы применить этот шаблон проектирования к нужному классу, необходимо:
1. Создать новый класс, который будет иметь одну ответственность, используя методы рефакторинга: выделения поля и выделения метода.
2. Создайте связь между старым и новым классом.
Следует вносить изменения понемногу и тестировать результат после каждого перемещения, это избавит вас от необходимости исправлять большое число ошибок в самом конце. По окончанию, пересмотрев ещё раз новые классы, вернитесь к старому классу, возможно, у него изменилась ответственность, и теперь его имеет смысл назвать по-другому.
https://ru.wikipedia.org/wiki/Выделение_частного_класса_данных
Обычно классы всегда изначально выглядят чёткими и понятными. Они выполняют свою работу и не лезут в обязанности других классов. Однако при разработке программы добавляется новая логика. В результате некоторые классы ошибочно получают массу дополнительных обязанностей. На помощь приходит частный метод рефакторинга, известный под названием Выделение класса (Extract Class). Он позволяет соблюсти «Принцип единственной ответственности», тем самым делая классы более надёжными и устойчивыми к изменениям.
Чтобы применить этот шаблон проектирования к нужному классу, необходимо:
1. Создать новый класс, который будет иметь одну ответственность, используя методы рефакторинга: выделения поля и выделения метода.
2. Создайте связь между старым и новым классом.
Следует вносить изменения понемногу и тестировать результат после каждого перемещения, это избавит вас от необходимости исправлять большое число ошибок в самом конце. По окончанию, пересмотрев ещё раз новые классы, вернитесь к старому классу, возможно, у него изменилась ответственность, и теперь его имеет смысл назвать по-другому.
https://ru.wikipedia.org/wiki/Выделение_частного_класса_данных
👍3
OneCode
Конкурс! Приз 500 рублей на карту 💸 Победителем станет тот, кто напишет в комментариях что можно оптимизировать в примере из этого поста. Написать нужно то, о чем я думаю 😃 и приложить полноценный пример кода. Выиграет первый правильный ответ, НО сообщение…
Итоги конкурса
Победителем стал Тарас, который предложил перенести API-токен на бекенд, чтобы пользователь не мог отправить 100500 запросов от нашего имени и потратить весь лимит.
На самом деле я думал о том, чтобы убрать лишний запрос к бекенду, потому что (кто знает специфику работы Livewire) когда мы вызываем
Однако Тарас предложил другую, но хорошую идею перенести API-токен на бекенд.
Таким образом мы можем совместить обе задачи:
1. Не отправлять лишних запросов к нам на сервер.
2. Скрыть от пользователя API-токен.
Это можно сделать путём получения страны пользователя и указания нужного значения в селекте сразу при первой отрисовке страницы на бекенде, чтобы в браузер уже прилетала выбранная страна.
Другой вариант (на скрине) - добавить
#contest
Победителем стал Тарас, который предложил перенести API-токен на бекенд, чтобы пользователь не мог отправить 100500 запросов от нашего имени и потратить весь лимит.
На самом деле я думал о том, чтобы убрать лишний запрос к бекенду, потому что (кто знает специфику работы Livewire) когда мы вызываем
@this.set('foo', 'bar'), то отправляется запрос на бекенд.
Однако Тарас предложил другую, но хорошую идею перенести API-токен на бекенд.
Таким образом мы можем совместить обе задачи:
1. Не отправлять лишних запросов к нам на сервер.
2. Скрыть от пользователя API-токен.
Это можно сделать путём получения страны пользователя и указания нужного значения в селекте сразу при первой отрисовке страницы на бекенде, чтобы в браузер уже прилетала выбранная страна.
Другой вариант (на скрине) - добавить
Middleware, в котором мы получаем страну пользователя по его IP и сразу сохраняем её в базе данных.
#contest
👍1
Интересно как много разработчиков у нас используют Cloudflare в своих или рабочих проектах?
Anonymous Poll
21%
Использую
38%
Не использую
41%
Не знаю что это
Сравнение объектов в PHP
Оператор сравнения
- Объекты являются экземплярами одного и того же класса.
- Все свойства объектов имею одинаковые значения.
Оператор идентичности
- Объекты являются экземплярами одного и того же класса.
- Объекты являются одним и тем же экземпляром.
- Все свойства объектов имею одинаковые значения.
https://www.php.net/manual/ru/language.oop5.object-comparison.php
#php
Оператор сравнения
==проверяет, что:
- Объекты являются экземплярами одного и того же класса.
- Все свойства объектов имею одинаковые значения.
Оператор идентичности
===проверяет, что:
- Объекты являются экземплярами одного и того же класса.
- Объекты являются одним и тем же экземпляром.
- Все свойства объектов имею одинаковые значения.
https://www.php.net/manual/ru/language.oop5.object-comparison.php
#php
👍7
Шаблон проектирования Proxy (заместитель)
Сегодня успешно использовал этот шаблон (кеширующий прокси), чтобы завернуть некоторые ответы HTTP-клиента в кэш. Потом решил заглянуть в Википедию, чтобы почитать про заместителя.
Обнаружил там занятное описание, которое не все могут понять. Вернее понять могут не только лишь все, не каждый может это сделать 😃
«Заместитель» хранит ссылку, которая позволяет заместителю обратиться к реальному субъекту (объект класса «Заместитель» может обращаться к объекту класса «Субъект», если интерфейсы «Реального Субъекта» и «Субъекта» одинаковы). Поскольку интерфейс «Реального Субъекта» идентичен интерфейсу «Субъекта», так, что «Заместителя» можно подставить вместо «Реального Субъекта», контролирует доступ к «Реальному Субъекту», может отвечать за создание или удаление «Реального Субъекта». «Субъект» определяет общий для «Реального Субъекта» и «Заместителя» интерфейс так, что «Заместитель» может быть использован везде, где ожидается «Реальный Субъект». При необходимости запросы могут быть переадресованы «Заместителем» «Реальному Субъекту».
Но почитать всё равно полезно! 👇
https://ru.wikipedia.org/wiki/Заместитель_(шаблон_проектирования)
Сегодня успешно использовал этот шаблон (кеширующий прокси), чтобы завернуть некоторые ответы HTTP-клиента в кэш. Потом решил заглянуть в Википедию, чтобы почитать про заместителя.
Обнаружил там занятное описание, которое не все могут понять. Вернее понять могут не только лишь все, не каждый может это сделать 😃
«Заместитель» хранит ссылку, которая позволяет заместителю обратиться к реальному субъекту (объект класса «Заместитель» может обращаться к объекту класса «Субъект», если интерфейсы «Реального Субъекта» и «Субъекта» одинаковы). Поскольку интерфейс «Реального Субъекта» идентичен интерфейсу «Субъекта», так, что «Заместителя» можно подставить вместо «Реального Субъекта», контролирует доступ к «Реальному Субъекту», может отвечать за создание или удаление «Реального Субъекта». «Субъект» определяет общий для «Реального Субъекта» и «Заместителя» интерфейс так, что «Заместитель» может быть использован везде, где ожидается «Реальный Субъект». При необходимости запросы могут быть переадресованы «Заместителем» «Реальному Субъекту».
Но почитать всё равно полезно! 👇
https://ru.wikipedia.org/wiki/Заместитель_(шаблон_проектирования)