Заметки разработчика
473 subscribers
667 photos
4 videos
1.16K links
Заметки о Frontend, Backend и немного DevOps. В основном о #PHP, #Laravel, #JavaScript, #HTML, #CSS, тестировании и настройке серверов.

https://www.dev-notes.ru

@snakenf
Download Telegram
👩‍💻 Intl.DurationFormat: Форматирование временных интервалов с поддержкой локали

Хватит писать код форматирования временных интервалов вручную. Используйте новый мощный API Intl.DateTimeFormat для отображения локализированного времени.

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

Объект Intl.DurationFormat элегантно решает данную проблему. Он является частью основной спецификации языка ECMAScript — в частности, ECMAScript Internationalization API (ECMA-402). Это делает его нативной функцией JavaScript, а не API веб-браузера, хотя браузерная реализация определяет его доступность.

🖥 Читать статью

📱 @dev_notes_ru

#JavaScript
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
👩‍💻 Laravel: Запуск запланированных команд в режиме обслуживания!

При использовании php artisan down --secret="your-secret", Laravel блокирует все запросы, включая запланированные команды (schedule).

Проблема:
Если есть запланированная задача в app/Console/Kernel.php, например, создание резервной копии:

$schedule->command('backup:run')
->dailyAt('03:00');


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

Решение:
Добавьте evenInMaintenanceMode(), чтобы команда выполнялась, даже когда активен режим обслуживания:

$schedule->command('backup:run')
->dailyAt('03:00')
->evenInMaintenanceMode();


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

📱 @dev_notes_ru

#Laravel #Schedule #Maintenance #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
👩‍💻 Вы можете использовать метод Number::fileSize в приложениях Laravel для преобразования размеров файлов (в байтах) в более человекочитаемые представления!

Это удобно для отображения размеров файлов в пользовательском интерфейсе.

📱 @dev_notes_ru

#Laravel #Number #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
👩‍💻 Паттерны улучшения производительности Eloquent

Способы улучшения производительности баз данных для приложений Laravel с использованием ORM Eloquent.

🖥 Читать статью

📱 @dev_notes_ru

#Eloquent #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥21
👩‍💻 А вы знали, что в приложениях Laravel можно получить список маршрутов, зарегистрированных пакетами?

Его можно получить, выполнив команду:

php artisan route:list --only-vendor


Это удобно для аудита маршрутов и выявления тех, о которых вы могли не знать, чтобы гарантировать, что они заблокированы и безопасны!

📱 @dev_notes_ru

#Laravel #Route #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31
👩‍💻 Что можно сделать с помощью middleware в Laravel

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

Вот тут-то и приходит на помощь middleware. Думайте о нём как о «вышибале» в приложении — он проверяет, изменяет или отклоняет запросы до того, как они попадут к контроллерам. Или даже после того, как запрос обработан (многие об этом не знают). Вместо того чтобы загромождать контроллеры повторяющейся логикой или разделять эту логику в трейте, middleware помогает добавлять функциональность по нескольким маршрутам более чистым и удобным способом.

🖥 Читать статью

📱 @dev_notes_ru

#Laravel #Middleware
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
💡 Совет по Laravel: Привязка примитивов к значениям конфигурации

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

📱 @dev_notes_ru

#Laravel #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
🚀 Оптимизация SQL запросов

В SQL-запросе операторы выполняются в следующем порядке:

1. FROM / JOIN
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. DISTINCT
7. ORDER BY
8. LIMIT / OFFET

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

С учётом этого рассмотрим некоторые советы по оптимизации:

Максимизируйте выражение `WHERE`.

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

Фильтруйте строки перед `JOIN`

Хотя запрос FROM/JOIN выполняется первым, всё равно можно ограничить количество строк. Чтобы ограничить количество присоединяемых строк, используйте подзапрос в операторе FROM вместо таблицы.

Используйте `WHERE` вместо `HAVING`

Выражение HAVING выполняется после WHERE и GROUP BY. Это означает, что при возможности стоит перенести все необходимые условия в выражение WHERE.

Не путайте `LIMIT`, `OFFSET` и `DISTINCT` с методами оптимизации

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

🖥 Порядок выполнения CQL запроса

📱 @dev_notes_ru

#SQL #DataBase #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Из параллельной вселенной

📱 @dev_notes_ru

#joke
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4😁2🤣2
👩‍💻 Laravel: Не забудьте о начальной настройке!

Перед развертыванием проекта Laravel убедитесь, что параметры безопасности и стабильности правильно настроены. Вот несколько важных настроек, которые необходимо добавить в сервис провайдер (например, AppServiceProvider).

💡 Принудительное использование HTTPS в продакшне

Принудительное использование HTTPS для всех URL-адресов (кроме локального окружения):

private function enforceSecureUrls(): void
{
if (!$this->app->environment('local')) {
URL::forceScheme('https');
}
}


Защищает пользовательские данные
Предотвращает проблемы со смешанным контентом

💡 Предотвращение выполнения деструктивных команд базы данных

Отключение опасных SQL команд (DROP, TRUNCATE) в продакшне:

DB::prohibitDestructiveCommands($this->app->isProduction());


Предотвращает случайную потерю данных в живой базе данных

💡 Включение кэширования конфигураций и маршрутов

Ускоряет работу приложения в продакшне:

php artisan config:cache
php artisan route:cache


Снижает нагрузку на сервер и улучшает время отклика

💡 Где их разместить

Добавьте enforceSecureUrls() и DB::prohibitDestructiveCommands() в метод boot() своего AppServiceProvider:

public function boot(): void
{
$this->enforceSecureUrls();
DB::prohibitDestructiveCommands($this->app->isProduction());
}


📱 @dev_notes_ru

#Laravel #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍1
👩‍💻 PHP 8.4: Новый DOM Selector API — работа с DOM с помощью CSS селекторов!

В PHP 8.4 появилось мощное обновление — теперь можно выбирать элементы DOM с помощью CSS селекторов, как в JavaScript! Встречайте новые методы: querySelector() и querySelectorAll().

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

Выбор по классу и идентификатору:

$dom = new DOMDocument();
$dom->loadHTML('
<div id="title">Title by ID</div>
<div class="header">Title by class</div>
');

// По ID
$title = $dom->querySelector('#title');
echo $title->textContent; // Title по ID

// По классу
$header = $dom->querySelector('.header');
echo $header->textContent; // Title по классу


Выбор нескольких элементов:

$dom = new DOMDocument();
$dom->loadHTML('
<ul>
<li class="item">Item 1</li>
<li class="item">Item 2</li>
</ul>
');

$items = $dom->querySelectorAll('.item');
foreach ($items as $item) {
echo $item->textContent . "\n";
}


Почему это замечательно:

Знакомый синтаксис CSS — чистый и интуитивно понятный
Меньше шаблонов — больше никаких вложенных циклов или getElementsBy...()
Точный выбор элемента — по идентификатору, классу, тегу или любой комбинации

📌 Теперь работа с HTML в PHP похожа на JavaScript — и это намного удобнее!

📱 @dev_notes_ru

#PHP #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥52👍2🤨1
👩‍💻 Laravel Context: Умное хранение и протоколирование данных в запросе

Начиная с Laravel 11+, фреймворк представил мощную функцию — Context, позволяющую хранить временные данные в рамках одного запроса, задания или консольной команды. А в Laravel 12 она стала ещё лучше — теперь контекст автоматически внедряется в логи, HTTP-запросы, события и исключения.

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

🛡 В middleware, сервисах или в любом другом месте вашего кода

use Illuminate\Support\Facades\Context;
use Illuminate\Support\Str;

Context::add('trace_id', (string) Str::uuid());
Context::add('app_section', 'checkout');
Context::add('server', gethostname());
Context::add('currency', 'USD');


📄 В контроллерах, логах или событиях:

Log::info('Payment started in section [{app_section}].', [
'user_id' => $user->id,
'amount' => $amount,
]);


🌐 При отправке внешних HTTP-запросов:

Http::withHeaders([
'X-Trace-Id' => Context::get('trace_id'),
])->post('https://api.payment.com/charge', [...]);


Что можно хранить в `Context`?

ID текущего пользователя или ID трассировки
Имя сервиса/модуля
Метаданные среды (сервер, регион, локаль)
Флаги бизнес-логики (валюта, роль, точка входа)

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

Глобальный доступ в рамках текущего запроса
Безопасно и изолированно (не влияет на другие запросы)
Автоматическая инъекция в логи, исключения, HTTP-вызовы, события и задания
Идеально подходит для отладки, мониторинга и отслеживания запросов в больших или распределенных системах

📌 Думайте о Context как о «временном хранилище данных», которое может использоваться во всех приложениях и не нужно повсеместно передавать переменные. Это чистый, современный способ отслеживания и управления данными, относящимися к конкретным запросам.

📱 @dev_notes_ru

#Laravel #Context #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
Здесь сказано, что вы должны быть в аду, но поскольку вы писали на Ассамблере, мы засчитаем это как отработанное наказание.

📱 @dev_notes_ru

#joke
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣1
99 мелких багов в коде
99 мелких багов в коде
Разобрались с одним, пропатчили его
117 мелких багов в коде

📱 @dev_notes_ru

#joke
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1👏1🤣1
💡 Совет по PHP: `Callable` объекты первого класса

В PHP 8.1 появились callable объекты первого класса. Они могут добавлять синтаксический сахар, особенно при работе с коллекциями Laravel, где часто используются замыкания 🚀.

📱 @dev_notes_ru

#PHP #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
👩‍💻👩‍💻 Тёмная и светлая темы для SVG

Использование CSS функции `light-dark()` для реализации светлого и тёмного режима для SVG иконок,включая SVG, используемые с HTML элементом `img` или в качестве CSS свойства `background-image`.

🖥 Читать статью

📱 @dev_notes_ru

#Frontend #HTML #CSS
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
💡 Совет по Laravel: Подсказка о пропущенных аргументах

Вам приходилось контролировать, что пользователь вводит необходимые аргументы в консоли? Laravel поставляется с контрактом PromptsForMissingInput для автоматической подсказки пользователю о пропущенных аргументах 🚀.

📱 @dev_notes_ru

#Laravel #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Начиная с Laravel v12.4.0, можно объявить новый метод в классе миграции - shouldRun().

Как следует из названия, метод возвращает логическое значение, определяющее, должен ли Laravel запустить миграцию.

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

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

📱 @dev_notes_ru

#Laravel #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👩‍💻 Упрощение CSS с псевдоклассом `:is()`

Недавно появился повод воспользоваться новым псевдоклассом CSS `:is()`, и он превосходен! Хочу рассказать, как с его помощью можно значительно уменьшить сложность селекторов.

🖥 Читать статью

📱 @dev_notes_ru

#Frontend #CSS
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
CSS Working Group приняла решение разрешить синтаксис диапазона в запросах style. Можно сравнивать с переменной контейнера:

@container style(--var < 5em)


Но можно сравнивать и обычные значения:

style(1em < 20px)
style(sibling-count() > 3)


Функция style также может быть использована для условий встроенных if()

Функция style() разработана для работы с именами свойств, поэтому можно использовать переменные без var(). Возможно, когда-нибудь браузеры также позволят обращаться к нестандартным свойствам напрямую.

Но, так же можно использовать var(). Если вам нравится var() или возможность использования резервных значений, он тоже работает!

📱 @dev_notes_ru

#CSS #feature
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1