PHP-BE1
310 subscribers
337 photos
11 videos
19 files
618 links
Канал по PHP, полезный и интересный контент для всех уровней.
По вопросам сотрудничества @cyberJohnny
Download Telegram
⚡️Laravel — это не просто PHP-фреймворк, а инструмент, который меняет подход к веб-разработке. Он помогает писать чистый, поддерживаемый код, ускоряет работу и открывает доступ к мощному инструментарию, который используется в крупных проектах.

Если вы уже работаете с PHP, но хотите выйти на новый уровень, Laravel — ваш лучший выбор. Мы научим вас грамотно использовать этот фреймворк, обеспечивать безопасность приложений, развертывать код и использовать встроенные инструменты для ускорения разработки.
Программа курса строится на реальных задачах и практике. Вы научитесь применять Laravel в продакшен-разработке. А поддержка опытных менторов и разбор сложных кейсов помогут вам быстрее освоить фреймворк и прокачать навыки.

👉Пройдите вступительное тестирование и получите скидку на обучение: https://clck.ru/3JWcV3

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Сегодня я расскажу вам о простой, но эффективной технике, которая может улучшить ваш PHP-код — использование Value Object вместо обычных типов.

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

Предположим, у вас есть метод:

function sendSms(string $phoneNumber, string $message): void

Сколько раз вы замечали, что номер телефона передаётся в неправильном формате? Или вообще пустым? Или из другой страны, а вы это не учли?

Вот здесь на помощь приходят Value Object'ы:

final class PhoneNumber
{
public function __construct(private string $number)
{
if (!preg_match('/^\+7\d{10}$/', $number)) {
throw new InvalidArgumentException('Недействительный номер телефона');
}
}

public function value(): string
{
return $this->number;
}
}

Теперь ваш метод будет выглядеть следующим образом:

function sendSms(PhoneNumber $phoneNumber, Message $message): void

Что мы получаем:
- Гарантия валидности данных на этапе создания объекта.
- Код становится самодокументируемым — нет необходимости читать описание, чтобы понять, что именно передаётся.
- IDE и статическая проверка типов не позволят случайно передать email вместо номера телефона.

Да, это чуть больше кода. Но в данном случае "больше" означает "надежнее".
Сегодня я расскажу, как удобно использовать .env файлы в проектах на PHP, особенно если вы не работаете с Laravel.

В Laravel всё просто — доступна встроенная поддержка через библиотеку vlucas/phpdotenv. Но если у вас свой фреймворк или самописный проект, можно также легко организовать работу с переменными окружения.

Вот что я делаю:

1. Устанавливаю библиотеку:
composer require vlucas/phpdotenv
2. Создаю .env файл в корне проекта:

APP_ENV=local
DB_HOST=localhost
DB_NAME=test
3. Загружаю переменные в PHP:
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

// Теперь можно использовать $_ENV['DB_HOST'] или getenv('DB_HOST').
Важно: createImmutable с PHP 7.1+ — безопасный вариант, не перезаписывает уже установленные переменные окружения.

💡 Совет: не забывайте добавлять .env в .gitignore и создавайте .env.example с шаблоном. Это будет полезно для команды и для вас в будущем.

А как вы храните конфигурации? Может быть, кто-то уже использует symfony/dotenv или даже Docker secrets?

Поделитесь в комментариях 👇

👉 [|@php_be1]
🔥Laravel — мощный PHP-фреймворк, но его скорость может быть ограничена стандартной связкой Nginx + PHP-FPM. Хотите разогнать своё приложение и сократить время отклика?

На открытом вебинаре 3 апреля в 20:00 мск разберём, как интегрировать Laravel с Roadrunner — высокопроизводительным сервером, который меняет подход к обработке запросов. Используем Octane, оптимизируем ресурсы и ускорим выполнение кода.

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

👉Регистрируйтесь и получите скидку на большое обучение «Framework Laravel»: https://clck.ru/3KAfSd

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🔥 Laravel Telemetry 🔥

Команда Laravel объявляет о включении во фреймворк Telemetry — нового модуля для сбора анонимной статистики об использовании фреймворка. Это поможет анализировать популярные фичи, оптимизировать производительность и сделать Laravel ещё лучше! Telemetry будет включена по умолчанию и собирать такие данные, как версия PHP, используемые пакеты, время выполнения запросов и частота ошибок.

Если вдруг вы не хотите участвовать в улучшении Laravel, всегда можно отключить сбор данных через env-переменную TELEMETRY_ENABLED=false.
@php_be1
Сегодня я хочу поделиться с вами простым и удобным приемом, который помогает поддерживать порядок в больших PHP-проектах — это использование кастомных коллекций вместо обычных массивов.

Если вы когда-либо передавали массивы объектов в методы или возвращали их из них, то, вероятно, сталкивались с ситуацией, когда неясно, что именно содержится в массиве. А потом кто-то мог передать туда строку или null — и вот вам, баги.

Я начал использовать свои классы коллекций. Вот простой пример:

class UserCollection
{
/** @ var User[] */
private array $users = [];

public function __construct(array $users = [])
{
foreach ($users as $user) {
$this->add($user);
}
}

public function add(User $user): void
{
$this->users[] = $user;
}

public function all(): array
{
return $this->users;
}

public function filterByActive(): self
{
return new self(array_filter($this->users, fn(User $u) => $u->isActive()));
}

// и так далее
}

Теперь везде, где раньше использовался массив User[], я применяю UserCollection. Это сразу дает:

- типизацию (и защиту от случайных ошибок),
- автодополнение в IDE,
- методы прямо в коллекции (например, filterByActive, sortByName, first() и т.д.),
- более чистые и понятные сигнатуры методов.

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

Попробуйте в одном из ваших проектов заменить массивы объектов на такие коллекции — и вы удивитесь, как стало лучше.

👉 [|@php_be1]
This media is not supported in your browser
VIEW IN TELEGRAM
Анонс Laravel Wayfinder
Генерация TypeScript-функций для ваших Laravel-контроллеров и маршрутов
https://github.com/laravel/wayfinder
@php_be1
Сегодня я расскажу, как я упростил настройку и запуск проектов на Laravel с помощью кастомной команды Make.

Когда ты постоянно работаешь с Laravel, такие команды, как php artisan migrate, npm run dev, php artisan serve, php artisan key:generate становятся рутиной. А если у тебя несколько проектов, путаницы не избежать.

Я решил, что это невыносимо.

Поэтому я создал простую команду в Makefile, которая за считанные секунды поднимает проект в нужной последовательности. Вот пример:

up:
@cp .env.example .env || true
@php artisan key:generate
@composer install
@npm install
@php artisan migrate
@php artisan db:seed
@npm run dev
@php artisan serve

Теперь я просто пишу make up — и Laravel запускается 🚀

Можно добавить и другие команды: make test, make down, make fresh, make lint, и каждый проект будет управляться по единому сценарию. Это экономит много времени.

💡 Совет: обязательно ставь @ перед командами — так терминал не будет засорён выводом строк Makefile.

👉 @php_be1
Новый метод whereAttachedTo() в Laravel 12.7 для получения записей из отношения belongsToMany.
@php_be1
Сегодня я расскажу вам о возможности PHP, которую многие либо не знают, либо забывают использовать — это деструктуризация массива. И зря!

Смотрите, вместо привычного способа:

$user = getUser(); // ['name' => 'Ivan', 'email' => 'ivan@example.com']
$name = $user['name'];
$email = $user['email'];

Можно сделать так:

['name' => $name, 'email' => $email] = getUser();

Код стал более чистым, коротким и понятным. Особенно приятно, когда возвращается ассоциативный массив — не нужно писать вручную много $data['ключ'].

Или с обычными массивами:

[$id, $name, $email] = getUserArray(); // [1, 'Ivan', 'ivan@example.com']

Деструктуризация массива работает с любой нумерацией — главное, чтобы структура совпадала.

💡 Я часто использую это в контроллерах, в тестах и при разборе конфигураций. Это удобно и читаемо.
Привет!

Мы — основатели KTS, IT–компании со штатом в 170+ специалистов, которая создает цифровые продукты для бизнеса с 2015 года.

Недавно мы запустили канал, в котором простым языком рассказываем о том, как бизнес пользуется ИИ-агентами, и объясняем, как они устроены изнутри.

Этот канал будет про:
– кейсы внедрения AI крупными компаниями и стартапами по всему миру;
– то, как мы сами внедряем AI в работу компании и что делаем для российских клиентов;
– устройство AI-агентов с упором на бизнес-эффект.

Подпишись () и черпай полезный опыт!

@php_be1

https://t.me/inside_ai_tech
Релизы PHP 8.4.6 и 8.3.20
https://www.php.net/ChangeLog-8.php

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

@php_be1
⚡️Laravel — удобный PHP-фреймворк, а его возможности выходят далеко за рамки классической веб-разработки. Хотите увидеть, как он помогает автоматизировать реальные процессы?

На бесплатном вебинаре 16 апреля в 20:00 мск покажем, как с помощью Laravel и Telegram Bot API создать Telegram-бота для дистанционного полива цветов. Подключим IoT-устройства, разберём работу с MQTT и визуализируем данные через Grafana.

Вы узнаете, как использовать Laravel в IoT-сценариях, управлять устройствами через Telegram, собирать и отображать метрики, а также получите представление о возможностях Arduino на примере ESP-8266.

👉Регистрируйтесь и получите скидку на большое обучение «Framework Laravel»: https://clck.ru/3LLvTd

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🛠 Как записывать SQL-запросы только в случае ошибок

Часто сталкиваюсь с ситуацией: ошибка 500 в продакшене, и непонятно, что именно пошло не так. Особенно если это связано с ошибкой в SQL-запросе. Логировать все SQL-запросы — это слишком много и создает лишний шум. Но логировать только при исключениях — это отличное решение!

🔍 Решение

Добавьте следующий код в AppServiceProvider:

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

public function boot()
{
DB::listen(function ($query) {
if (app()->bound('exception.logged')) {
Log::channel('sql')->debug($query->sql, $query->bindings);
}
});

app()->singleton('exception.logged', function () {
return true;
});

app()->error(function (\Throwable $e) {
app()->instance('exception.logged', true);
});
}

🔐 Пояснение
- При каждом SQL-запросе мы проверяем, возникло ли исключение.
- Если да — записываем SQL.
- Используем отдельный лог-канал sql, чтобы не загромождать основной laravel.log.

👉 Создайте в config/logging.php канал sql, направьте его в отдельный файл, например storage/logs/sql.log.

Теперь, если в продакшене произойдет ошибка, вы увидите, какой SQL-запрос был выполнен перед ней. Это значительно упрощает диагностику проблем.
Сегодня мы обсудим типы данных в PHP и правильное их использование в вашем проекте.

🧠 Преимущества строгой типизации в PHP

С выходом PHP 7 появилась возможность указывать типы аргументов и возвращаемых значений. В PHP 8 требования стали ещё строже. Однако многие всё ещё игнорируют эту возможность — и это неправильно!

Вот пример. Допустим, у вас есть функция:

function calculateTotal($price, $quantity) {
return $price * $quantity;
}

Теперь тот же код с указанием типов:

function calculateTotal(float $price, int $quantity): float {
return $price * $quantity;
}

Преимущества второго варианта:
- Автоматическая проверка типов во время выполнения
- IDE подсказывает, если передаются неправильные значения
- Код становится самодокументируемым
- Проще проводить тестирование

🔐 Мой совет: включите строгий режим в начале всех ваших файлов:

declare(strict_types=1);

Это заставит PHP работать с более строгой типизацией и поможет выявлять ошибки ещё до выполнения кода.

💬 Используете ли вы строгую типизацию? Или по-прежнему пишете $data = getData(); и надеетесь, что получите ожидаемое значение?

Поделитесь своим опытом в комментариях👇

👉 [|@php_be1]
В Laravel 12.9 добавлен мемоизированный драйвер кэша, который запоминает значения выбранные из основного кэша и сохраняет их в памяти на время выполнения. Проще говоря Кэш для Кэша :)
https://laravel.com/docs/12.x/cache#cache-memoization

@php_be1
Рост нагрузки, стоимость инфраструктуры и ожидания пользователей — всё растёт. А что насчет производительности ваших сервисов?

21–25 апреля пройдет Podlodka PHP Crew (https://podlodka.io/phpcrew?utm_campaign=main_php_crew_6&utm_source=telegram&utm_medium=paid&utm_content=laravel_it)— онлайн-конференция, где дают практические советы по реализации оптимизации.

Podlodka PHP Crew — это практичные конференции для PHP-разработчиков. Формат — утро и вечер, удобно для жизни и работы.

Что в программе:

• Павел Вирский (Ozon) — расскажет, как подойти к горизонтальному масштабированию PHP-приложений: с чего начать, что точно изменится в архитектуре и какие профиты вы получите от балансировки трафика 🧠

• Олег Мифле (Altenar) — покажет, как индексы в БД могут навредить, и что делать, когда “оптимизация” приводит к регрессу производительности 💥

• Ярослав Тарасов (Skyeng) — проведёт разбор оптимизации Symfony-приложения через RoadRunner: от архитектуры до конкретных замеров ⚙️

• Александр Макаров (Yii, Twindo) — расскажет о низкоуровневой оптимизации PHP: от мелких улучшений до AI, который сам оптимизирует ваш код 🧩

🎯 Всё это — для того, чтобы применить знания сразу.

Зарегистрироваться: https://podlodka.io/phpcrew (https://podlodka.io/phpcrew?utm_campaign=main_php_crew_6&utm_source=telegram&utm_medium=paid&utm_content=laravel_it)

@php_be1
Добавлен хелпер uri

@php_be1