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

https://www.dev-notes.ru

@snakenf
Download Telegram
👩‍💻 Паттерны улучшения производительности 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
💡 Совет по 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
👩‍💻 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
💡 Совет по PHP: `Callable` объекты первого класса

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

📱 @dev_notes_ru

#PHP #tips
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