OneCode
1.39K subscribers
629 photos
59 videos
3 files
525 links
Full Stack на PHP, Laravel и всё, что с этим связано.
YouTube: https://www.youtube.com/@onecode_blog
Download Telegram
Хай, гайз! Делюсь с вами еще одной фишкой из старого проекта.


Что имеем
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
Laravel Vite

Раньше мы использовали прекрасный Laravel Mix для сборки фронтенда.

Ничего не мешает использовать его и дальше, но иногда нужно идти вперёд.

Теперь в Laravel рекомендуется использовать Vite - относительно новый современный инструмент для сборки фронтенда.

Vite хорош во всех отношениях, но самое крутое - это скорость сборки - теперь не придется ждать минутами, если ты понимаешь о чем я =)

Кстати, именно Evan You (разработчик VueJS) является автором Vite.

Документация Laravel уже обновлена:
https://laravel.com/docs/9.x/vite

#laravel #vite
👍14🔥7
Отправка писем через свою Яндекс.Почту

Laravel может слать письма по протоколу SMTP, а значит мы можем отправлять сообщения со своего почтового ящика: gmail, mail, yandex и тд.

Посмотрим на примере яндекса:

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

Инструкция от яндекса:
https://yandex.ru/support/mail/mail-clients/others.html#smtpsetting

2. После получения пароля заполняем переменные окружения в файле
.env
в корне нашего проекта (пример на скрине).

3. Тестируем отправку. Для простоты можно создать отдельный роут и разместить там простой код (на скрине). Переходим по этому маршруту в браузере и письмо отправляется.

У меня получилось, значит у и тебя получится 😃

#laravel #mail #yandex #smtp
👍12
Перезагрузка страницы с Vite

Новый плагин Laravel Vite для сборки фронтенда автоматически перезагружает страницу при изменении CSS и JS файлов.

В статье описано как настроить Vite для автоматического обновления страницы после сохранения наших blade-шаблонов.

https://laravel-news.com/laravel-blade-hot-refresh-with-vite

#laravel #blade #vite
🔥8
Laravel Octane для нового проекта

Давно хочу попробовать Octane, но всё руки не доходили. Наконец подвернулся подходящий проект, где можно провести эксперимент 😃

Смысл пакета в том, что мы запускаем процесс, который держит всё наше приложение в оперативной памяти.

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

Аналогичная история работает, например в NodeJS, когда мы на сервере тоже запускаем процесс (например express), который висит постоянно и готов обрабатывать входящие запросы.

Насколько я знаю на питоне (Django) такая же история (поправьте, если не прав). Благодаря этому приложение должно работать быстрее, потому что оно уже загружено в памяти.

Вот и Laravel через официальный пакет Octane даёт нам такую возможности - ускорить наше приложение, если нужна повышеная эффективность и скорость.

Я всё еще НЕ уверен нужно ли мне это?

Сайты на PHP и Laravel и без того работают достаточно быстро. А здесь (помимо плюсов) мы получаем некоторые неудобства:
- Дополнительная сложность при настройке сервера.
- Необходимость перезапускать этот процесс после изменения файлов.
- Неуверенность, тк нет опыта с этим расширением.

В общем пробуем. Буду держать вкурсе 👍

https://laravel.com/docs/9.x/octane

#laravel #octane
👍8🔥2
Интервалы - первый бонус от использования Octane

Используя
Laravel Octane
мы можем любую запускать функцию с определённым интервалом.

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

На скрине пример функции, которая выполняется кажде 10 секунд - просто пишет в лог. Получается такой аналог
setInterval
из
JavaScript
.

Просто размещаем этот код в
AppServiceProvider
и радуемся результату.

Продолжаем эксперимент 👍

#laravel #octane
👍14🔥1
OneCode
Интервалы - первый бонус от использования Octane Используя Laravel Octane мы можем любую запускать функцию с определённым интервалом. Например мне нужно обновлять курсы валют каждые 10 секунд. По крону этого НЕ сделать, потому что там минимальный интервал…
Дополнение - интервалы у октан штука хорошая, но надо понимать ньюансы:

Например, если у тебя несколько серверов приложения (масштабирование), на которых работает Octane, тогда эта функция с интервалом будет выполняться на каждом сервере. То есть на 3 серверах функция будет запускаться 3 раза каждые 10 секунд - скорее всего это НЕ то, чего мы хотим.

У меня планируется всего один сервер, поэтому мне подходит такой вариант. В будущем, если понадобится, можно будет перенести выполнение функции в другое место - главное НЕ размещать логику (код функции) прямо здесь в провайдере. Лучше инкапсулировать (разместить) её, например в консольную команду (artisan) и вызывать эту команду здесь. Или в любом другом месте.

На будущее есть еще пакет
spatie/laravel-short-schedule
, который тоже решает задачу вызова функции с коротким интервалом. Пакет предоставляет нам интерфейс, аналогичный task scheduling из ларавел - будет привычно.

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

В общем тема интересная. Не часто, но иногда надо вызывать ккакую-то функцию автоматически с интервалом в несколько секунд. Если в будущем понадобится - помни, что варианты всегда есть 😃

https://github.com/spatie/laravel-short-schedule

#laravel #spatie #interval #tick #schedule
👍5
Хелперы для вывода даты и времени

Часто на проекте нужно выводить дату или время в определённом формате.

Так же в мультиязычных проектах формат даты и времени может отличаться в зависимости от языка сайта.

Если в будущем придёт задача изменить формат, то придётся:
- Искать все места в проекте.
- Менять вручную и тестировать.
- Надеяться, что ничего не пропустил.

Поэтому я сразу помещаю логику форматирования даты/времени в функции-хелперы (на скрине).

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

Пример использования:

{{ __datetime($order->created_at) }}
{{ __date($order->created_at) }}
{{ __time($order->created_at) }}


Планирую создать отдельный telegram-канал с такими полезными советами, примерами моего кода, короткими практическими видео и лайфхаками из моего личного опыта.

Лайк?

#laravel #tip #date #time #helpers
👍34
Лайфхак для TinkerWell

Ни раз уже писал про тинкервел, который, позволяет писать код на PHP внутри нашего приложения на Laravel, сразу выполнять этот код, тут же видеть результат и всё это можно по SSH на сервере - реально бомба!

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

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

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

https://tinkerwell.app

#tools #tinker #laravel
👍3
От подмастерья к ремесленнику

Книга Тейлора Отвела - разработчика Laravel.

Написана почти 10 лет назад - 2013 год, но уверен каждый найдёт для себя что-то полезное.

Я прочитал уже половину, до конца недели закончу. Можно читать просто по 1 главе в день.

Читать можно через Яндекс.Переводчик - там можно переводить PDF-файлы.


Книга в следующем посте 👇

#book #laravel #taylor
👍3
Шпаргалка по консольным командам Laravel.

Рекомендую хотя бы просто пробежаться по списку команд и изучить те, которые не знаешь!

https://artisan.page

#laravel #artisan
👍6
Просмотр логов в Laravel

Тестирую бесплатный пакет для просмотра логов.

Первое впечатление - нравится! 🙂

https://arunas.dev/log-viewer-for-laravel

Приятно работать, когда есть качественные готовые решения 😍

#laravel #log #logs #logging
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Пакет для автоматического создания и удаления дополнительных серверов

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

Или у нас есть очереди, которые обрабатывают разное кол-во задач. То густо, то пусто 😃

Пакет будет каждую минуту запускать функцию, в которой мы говорим сколько серверов нужно в текущий момент.

Это позволяет сильно экономить на серверах.

Получается такой мини-кубернетис с автоматическим горизонтальным масштабированием.

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

https://spatie.be/docs/laravel-dynamic-servers/v1/introduction

#laravel #server #servers
👍5
Laravel + Inertia + Vue (React)

Пошаговая инструкция по разработке простого проекта на современном стеке.

https://bootcamp.laravel.com

#laravel #inertial #bootcamp
🔥9👍3
Изменение состояния сущности

Изображения (скрины) отправлю в следующем сообщении.

Наши модели и база данных содержат поля, отвечающие за состояние сущности.

Например, пользователь может быть заблокирован или РАЗблокирован.

Способ 1

В этом случае можно добавить в таблицу
users
поле
blocked
с типом
boolean
.

Тогда админ сможет блокировать пользователя, переключая чекбокс в админке.

Этот пример я накидал на первом изображении 👇

Проблема

Рано или поздно админ спросит - а когда был заблокирован этот юзер?

Начинающий разработчик скорее всего пожмёт плечами и скажет, что таких данных нет.

А опытный разработчик заглянет в логи и ответит на поставленый вопрос.

Если, конечно, значения поля НЕ менялось напрямую в базе данных 😁

Решение

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

(Способ 2)

Для решения этой задачи, можно вместо
boolean
для поля
blocked
использовать дату и время, например
timestamp
с возможностью НЕ указывать значение (nullable).

В таком случае мы получаем всё тоже самое (переключатель ```null/datetime```) + имеем дату блокировки пользователя.

Этот пример показан на втором изображении 👇

Признавайся, делал так?

Проблема

Однако этот способ тоже НЕ идеальный, потому что здесь есть дата блокировки пользователя, НО нет даты его РАЗблокировки 😁

Получается, что задача решена наполовину, а для нас (хацкеров) это НЕприемлемо.

Решение

Логичное решение - добавить отдельное поле для хранения времени изменения переключателя.

Способ 3

Этот вариант сочатает в себе оба предыдущих способа и, наверно, является наиболее универсальным.

Теперь главное НЕ забыть обновлять дату и время ```blocked_at``` в момент изменения поля
blocked
.

Внимание на третье изображение 👇

Проблема

Но помимо поля
blocked
у юзера есть много других полей.

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

То есть по-хорошему, мы хотим знать какие поля менялись? когда менялись? и значения ДО и ПОСЛЕ?

Решение

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

Хотя бы для некоторых свойств пользователя (самых важных).

Но мы же не такие? Мы будем думать над универсальным "оружием".

А кто-то пойдёт гуглить готовое решение. Лентяй 🫵

Способ 4

Все выходные мы думали над решением и есть же!

1. Можно создать отдельную модель, например
Change
(изменение).

2. Привязываем эту модель к любой другой модели нашего приложения (через трейт HasChanges).

3. Указываем какие поля мы хотим отслеживать (через абстрактный метод в трейте).

4. На основе событий модели (created, updated) наш трейт автоматически записывает историю в базу данных (таблица changes).

5. Мы в любой момент видим лог всех изменения наших записей: дату, время, значения ДО и ПОСЛЕ.

Изображение НЕ прилагаю. Предлагаю тебе самому подумать на решением 😝

Итог

Подобное решение иногда раально упрощает жизнь.

Особенно, если пользователь заявляет, что его аккаунт взломали 😃

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

Ставь лайк, если полезно! Может запишем видео на эту тему.

ПС: если руками лазить в базу, то тут ничего не поможет 😁

ППС: если ооочень хочется, то можно 😉

#php #laravel #db #bool #boolean
🔥4
Laravel Venture

Laravel из коробки даёт крутую систему очередей, но иногда возникают более сложные задачи.

Например, создание цепочек последовательных действий в очереди:

- Загрузить видео на сервер
- Оптимизировать видео
- Транскрибировать видео
- Перевести на другие языки
- Уведомить подписчиков
- И тд

Пакет Laravel Venture позволяет создавать мощную систему асинхронных задач в очереди.

Судя по документации всё довольно просто, поэтому имеем в виду этот полезный инструмент в арсенале современного веб-ремесленника 🙂

https://laravel-venture.com

#laravel #queue #venture
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍3
Laravel за 100 секунд

За пару минут конечно невозможно рассказать о всей мощи ларки, но лайк поставить можно!

https://youtu.be/rIfdg_Ot-LI

#laravel #100sec
👍6
Laravel Eloquent Strict Mode

Добавлен строгий режим для моделей, который будет выкидывать исключения:
- При попытке обратится к отношению без его явной предварительной загрузки.
- При попытке установить НЕ заполняемый атрибут.
- При попытке получить НЕ существующий атрибут.

https://laravel.com/docs/9.x/eloquent#configuring-eloquent-strictness

#laravel #strict
👍2
Laravel Mailbook

Полезный пакет для просмотра email-писем.

- Графческий интерфейс с выбором писем
- Автоматический откат базы, если для просмотра письма нужны временные данные
- Просмотр адаптивной версии письма
- Разные варианты одного письма
- Поддержка мультиязычности

https://github.com/Xammie/mailbook

Подпишись: @onecode_blog

#laravel #mail
👍11