ar
Feedback
Библиотека PHP программиста 👨🏼‍💻👩‍💻

Библиотека PHP программиста 👨🏼‍💻👩‍💻

الذهاب إلى القناة على Telegram

Полезные материалы по PHP, Laravel, Symfony, CodeIgniter, CakePHP, Phalcon По всем вопросам @evgenycarter

إظهار المزيد
2 094
المشتركون
-224 ساعات
-47 أيام
-1130 أيام
أرشيف المشاركات
Открытый вебинар «Почему стоит выбрать Symfony для нового проекта» в OTUS 📅 29 апреля, 20:00 МСК · онлайн · бесплатно 👤 Спи
Открытый вебинар «Почему стоит выбрать Symfony для нового проекта» в OTUS 📅 29 апреля, 20:00 МСК · онлайн · бесплатно 👤 Спикер — Михаил Каморин Кто ведёт • Tech Lead в Avito • 20 + лет в разработке (10 лет B2B, 4 года B2C) • 10 + лет на PHP, 5 лет — на Symfony • Автор двух RAD‑движков (Laravel + Symfony), запущенных в 10 + прод‑проектах • Выпускник ВМК МГУ, член ПК Podlodka PHP Crew Symfony — ядро экосистемы PHP. Разберём, как фреймворк помогает запускать и поддерживать продукты с горизонтом 5 + лет. Ключевые вопросы • Модульность — 25 + компонентов подключаются по мере надобности • Гибкость — DI‑контейнер переопределяет сервисы без боли • Стабильность — LTS 3 года, минорные версии совместимы назад • Speed‑toolkit — Symfony CLI, Flex, автоконфигурация, Profiler Кому полезно — Middle/Senior PHP‑разработчикам, архитекторам и тимлидам, которым нужны строгие аргументы «за» Symfony. Формат — 60 минут концентрированной практики + Q&A без маркетинговой воды. Участие бесплатное. Места ограничены. Регистрируйтесь. → https://vk.cc/cL1f9x Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru

Сегодня я покажу вам, как удобно логировать в Laravel, не засоряя код и не превращая проект в болото из Log::info() на каждом шагу. 💡 Используем каналы логирования правильно Laravel предоставляет мощную систему логирования на базе Monolog. Но часто мы ограничиваемся дефолтным логом. А зря. Например, создаём отдельный канал для логов оплаты:

// config/logging.php
'channels' => [
    'payment' => [
        'driver' => 'single',
        'path' => storage_path('logs/payment.log'),
        'level' => 'info',
    ],
],
Теперь в нужном месте можно писать:

Log::channel('payment')->info('Платёж прошёл', ['user_id' => $user->id, 'amount' => $amount]);
И всё — никакой путаницы. В laravel.log остаётся только то, что важно для всего проекта, а логи оплаты — отдельно. Можно и в телеграм скидывать, если настроить webhook. 👀 Бонус: helper-функция Чтобы писать меньше:

if (!function_exists('payment_log')) {
    function payment_log($message, array $context = []) {
        \Log::channel('payment')->info($message, $context);
    }
}
Теперь вызываем везде просто payment_log('Платёж принят'). Пишите в комментах, какие каналы логирования вы используете и куда пишете — в файл, телегу или Sentry? 👉 @php_lib

💰Вопрос безопасности в разработке становится всё более актуальным. Но как обосновать инвестиции в безопасность для бизнеса?
💰Вопрос безопасности в разработке становится всё более актуальным. Но как обосновать инвестиции в безопасность для бизнеса? Как оценить её финансовую сторону? 🗓Открытый вебинар 23 апреля в 20:00 мск даст ответы на самые важные вопросы. Мы расскажем, как сэкономить на долгосрочных потерях, внедряя эффективные меры безопасности с самого начала разработки. 🧑‍💻Спикер Максим Чащин — директор по информационной безопасности в ГК «Девелоника». Вы узнаете, сколько стоит устранение уязвимостей, как принцип «shift left» влияет на итоговую производительность и как измерять эффективность мер безопасности. Это поможет вам убедить руководство инвестировать в безопасность на всех уровнях разработки. 👉Присоединяйтесь к открытому уроку и получите скидку на большое обучение «Внедрение и работа в DevSecOps»: https://vk.cc/cKVaef Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Сегодня я покажу вам простой, но мощный способ, как ускорить отладку в Laravel при работе с большим количеством логики в контроллерах и сервисах. 🔍 Ловим баги быстрее с помощью ray() от Spatie Обычно мы используем dd() или dump() в Laravel, чтобы посмотреть, что творится с переменными. Но как только проект становится крупнее — эти методы начинают мешать, особенно когда нужно отслеживать несколько значений в разных местах. Спасает Ray — инструмент от Spatie, который интегрируется с Laravel и выводит отладочную информацию в отдельное десктопное приложение. Пример:

ray($user);
ray($order)->blue();
ray()->showQueries();
Ты можешь: - выводить переменные без прерывания скрипта; - смотреть SQL-запросы в реальном времени; - использовать цветовые метки, чтобы различать вывод из разных участков кода. ⚙️ Установка

composer require spatie/laravel-ray --dev
И по желанию установить десктоп-приложение с сайта Spatie. В config/ray.php можно кастомизировать поведение: включать Ray только на dev-среде, логировать только определённые запросы и т.д. 🧠 Совет от себя Ray особенно хорошо заходит, когда работаешь в команде — ты можешь добавить временный ray()-лог, не ломая исполнение и не мешая другим. Пробовали Ray? Или у вас есть свои инструменты для отладки — может, кастомные макросы или трейты? Делитесь в комментах 👇 👉 @php_lib

Сегодня я хочу поговорить о том, как избавиться от дублирования кода в Laravel, особенно в тех местах, где это совсем не бросается в глаза — в валидации запросов. ✋ Проблема У тебя есть формы на создание и обновление сущности. И в обоих случаях в контроллере или Form Request’ах ты пишешь одинаковые правила валидации, только с небольшими отличиями. Пример:

// StorePostRequest.php
return [
    'title' => 'required|string|max:255',
    'content' => 'required',
];

// UpdatePostRequest.php
return [
    'title' => 'sometimes|required|string|max:255',
    'content' => 'sometimes|required',
];
✅ Решение — базовый класс с общими правилами Создай абстрактный класс с общими правилами:

abstract class BasePostRequest extends FormRequest
{
    protected function commonRules(): array
    {
        return [
            'title' => 'string|max:255',
            'content' => 'string',
        ];
    }
}
А потом в наследниках добавляй нужные модификаторы:

// StorePostRequest.php
class StorePostRequest extends BasePostRequest
{
    public function rules(): array
    {
        return array_merge([
            'title' => 'required',
            'content' => 'required',
        ], $this->commonRules());
    }
}

// UpdatePostRequest.php
class UpdatePostRequest extends BasePostRequest
{
    public function rules(): array
    {
        return array_merge([
            'title' => 'sometimes|required',
            'content' => 'sometimes|required',
        ], $this->commonRules());
    }
}
🤔 Альтернатива — кастомная Rule-комбинация Можно пойти дальше и использовать кастомные Rule-классы, если валидация становится сложной и завязанной на бизнес-логику. Я часто вижу дублирование в валидации, особенно в старых проектах. Убрав это, код становится чище, а изменения в правилах — в разы проще. А ты как организуешь валидацию? Используешь Form Request или валидируешь прямо в контроллере? 👉 @php_lib

🚀 Подпишись и прокачай свои скилы: лучшие каналы для IT-специалистов 👨‍💻📲 Папка с каналами для DevOps, Linux - Windows СисАдминов 👍 Папка с каналами для 1С программистов 🧑‍💻 Папка с каналами для C++ программистов 👩‍💻 Папка с каналами для Python программистов 👩‍💻 Папка с каналами для Java программистов 🖥 Папка с книгами для программистов 📚 Папка для программистов (frontend, backend, iOS, Android) 💻 GitHub Сообщество 🧑‍💻 https://t.me/Githublib Интересное из GitHub Базы данных (Data Base) 🖥 https://t.me/database_info Все про базы данных Разработка игр 📱 https://t.me/game_devv Все о разработке игр БигДата, машинное обучение 🖥 https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning QA, тестирование 🖥 https://t.me/testlab_qa Библиотека тестировщика Шутки программистов 📌 https://t.me/itumor Шутки программистов Защита, взлом, безопасность 💻 https://t.me/thehaking Канал о кибербезопасности https://t.me/xakep_2 Хакер Free Книги, статьи для дизайнеров 🎨 https://t.me/ux_web Статьи, книги для дизайнеров Математика 🧮 https://t.me/Pomatematike Канал по математике https://t.me/phis_mat Обучающие видео, книги по Физике и Математике Excel лайфхак🙃 https://t.me/Excel_lifehack Технологии 🖥 https://t.me/tikon_1 Новости высоких технологий, науки и техники💡 https://t.me/mir_teh Мир технологий (Technology World) Вакансии 💰 https://t.me/sysadmin_rabota Системный Администратор https://t.me/progjob Вакансии в IT https://t.me/rabota1C_rus Вакансии для программистов 1С

Сегодня речь пойдёт о типах в 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_lib

⚡️Laravel — удобный PHP-фреймворк, а его возможности выходят далеко за рамки классической веб-разработки. Хотите увидеть, как
⚡️Laravel — удобный PHP-фреймворк, а его возможности выходят далеко за рамки классической веб-разработки. Хотите увидеть, как он помогает автоматизировать реальные процессы? На бесплатном вебинаре 16 апреля в 20:00 мск покажем, как с помощью Laravel и Telegram Bot API создать Telegram-бота для дистанционного полива цветов. Подключим IoT-устройства, разберём работу с MQTT и визуализируем данные через Grafana. Вы узнаете, как использовать Laravel в IoT-сценариях, управлять устройствами через Telegram, собирать и отображать метрики, а также получите представление о возможностях Arduino на примере ESP-8266. 👉Регистрируйтесь и получите скидку на большое обучение «Framework Laravel»: https://vk.cc/cKIOcm Реклама. ООО «Отус онлайн-образование», ОГРН 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-запросе мы проверяем, был ли в этом запросе выброшен exception. - Если да — логируем SQL. - Используем отдельный лог-канал sql, чтобы не засорять основной laravel.log. 👉 Создайте в config/logging.php канал sql, направьте его в отдельный файл, например storage/logs/sql.log. Теперь, если в продакшене будет падение — вы увидите какой SQL-запрос был выполнен перед ошибкой. Это невероятно ускоряет диагностику багов. 👉 @php_lib

🔍 Как логировать все входящие параметры в методы классов Представим, что у нас есть большой проект с кучей классов, и в одном месте какая-то логика работает не так, как ожидалось. Часто хочется понять: а с какими аргументами вообще вызывается метод? Вот удобный способ — использовать debug_backtrace() и func_get_args():

class SomeService {
    public function process($userId, $data) {
        $this->logArgs(__METHOD__);
        // Дальше идёт логика
    }

    protected function logArgs($methodName) {
        $args = func_get_args();
        array_shift($args); // Убираем $methodName
        $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1];

        error_log(sprintf(
            "[%s] Called from %s:%s with args: %s",
            $methodName,
            $trace['file'] ?? 'n/a',
            $trace['line'] ?? 'n/a',
            json_encode($args, JSON_UNESCAPED_UNICODE)
        ));
    }
}
🧠 Профит: когда метод вызывается, вы сразу в логе видите: - с какими аргументами он был вызван - откуда он был вызван (файл и строка) Это суперполезно в проде, когда нет возможности ставить дебаггер, а нужно поймать, что пошло не так. 📌 Совет: делайте logArgs() общим методом в базовом классе и логируйте важные вызовы на проде, оборачивая условием по уровню логирования или флагу. 👉 @php_lib

Как настроить мониторинг с помощью Grafana для PHP-приложений? Каждый PHP-разработчик рано или поздно сталкивается с необходи
Как настроить мониторинг с помощью Grafana для PHP-приложений? Каждый PHP-разработчик рано или поздно сталкивается с необходимостью мониторинга своих приложений. Сложные системы требуют эффективных инструментов для отслеживания их работы. Одним из таких инструментов является Grafana — мощное средство для визуализации данных и настройки алертов, которое делает мониторинг простым и наглядным. На открытом вебинаре 15 апреля в 20:00 мск вы научитесь: - Подключать различные источники данных, такие как Graphite и PostgreSQL. - Визуализировать данные с помощью гибких и информативных графиков. - Настраивать алерты, чтобы получать уведомления о критических событиях. Присоединяйтесь к вебинару и получите скидку на большое обучение «PHP Developer. Professional. Регистрируйтесь прямо сейчас: https://vk.cc/cKFYw2 Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Сегодня я покажу вам одну фичу PHP, которую многие или не знают, или забывают использовать — array destructuring. А зря! Смотрите, вместо привычного:

$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']
Разворот массива работает с любой нумерацией — главное, чтобы структура соответствовала. 💡 Применяю это часто в контроллерах, в тестах и когда разбираю конфиги. Удобно и читаемо. 👉 @php_lib

Сегодня я покажу вам, как я упростил настройку и запуск 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_lib

💬 Хочешь прокачать навыки архитектуры на PHP за один вечер? ❗️Даже опытные PHP-разработчики сталкиваются с выбором: богатая
💬 Хочешь прокачать навыки архитектуры на PHP за один вечер? ❗️Даже опытные PHP-разработчики сталкиваются с выбором: богатая или анемичная модель? CQRS или Event Sourcing? REST API или что-то сложнее? 📌 Разложим всё по полочкам на бесплатном авторском вебинаре Дмитрия Кириллова: - узнаете, как упростить разработку с помощью грамотно выстроенной архитектуры - научитесь осознанно выбирать инструмент под задачу - посмотрите на полезные практические приёмы Превратите архитектуру в своё конкурентное преимущество. Освойте подходы, которые реально работают в "бою" — и стань увереннее в любом проекте, от MVP до highload. ➡️ Регистрируйтесь прямо сейчас: https://vk.cc/cKpX2Q Приходите на открытый урок 8 апреля в 20:00 мск. Участники получат скидку на курс «PHP Developer. Professional». Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Сегодня покажу вам простой, но очень удобный приём, который помогает наводить порядок в больших 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_lib

🔥Laravel — мощный PHP-фреймворк, но его скорость может быть ограничена стандартной связкой Nginx + PHP-FPM. Хотите разогнать
🔥Laravel — мощный PHP-фреймворк, но его скорость может быть ограничена стандартной связкой Nginx + PHP-FPM. Хотите разогнать своё приложение и сократить время отклика? На открытом вебинаре 3 апреля в 20:00 мск разберём, как интегрировать Laravel с Roadrunner — высокопроизводительным сервером, который меняет подход к обработке запросов. Используем Octane, оптимизируем ресурсы и ускорим выполнение кода. Вы научитесь подключать Roadrunner к своим проектам, поймёте, как он меняет жизненный цикл PHP-приложения, и сможете внедрить передовые технологии для масштабирования ваших сервисов. 👉Регистрируйтесь и получите скидку на большое обучение «Framework Laravel»: https://vk.cc/cKmAST Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Сегодня я покажу вам, как удобно работать с .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_lib

Подборка Telegram каналов для программистов https://t.me/bash_srv Bash Советы https://t.me/win_sysadmin Системный Администратор Windows https://t.me/lifeproger Жизнь программиста. Авторский канал. https://t.me/devopslib Библиотека девопса | DevOps, SRE, Sysadmin https://t.me/rabota1C_rus Вакансии для программистов 1С Системное администрирование 📌 https://t.me/sysadmin_girl Девочка Сисадмин https://t.me/srv_admin_linux Админские угодья https://t.me/linux_srv Типичный Сисадмин https://t.me/linux_odmin Linux: Системный администратор https://t.me/devops_star DevOps Star (Звезда Девопса) https://t.me/i_linux Системный администратор https://t.me/linuxchmod Linux https://t.me/sys_adminos Системный Администратор https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало) https://t.me/sysadminof Книги для админов, полезные материалы https://t.me/i_odmin Все для системного администратора https://t.me/i_odmin_book Библиотека Системного Администратора https://t.me/i_odmin_chat Чат системных администраторов https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др. https://t.me/sysadminoff Новости Линукс Linux 1C разработка 📌 https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С https://t.me/DevLab1C 1С:Предприятие 8 Программирование C++📌 https://t.me/cpp_lib Библиотека C/C++ разработчика https://t.me/cpp_knigi Книги для программистов C/C++ https://t.me/cpp_geek Учим C/C++ на примерах Программирование Python 📌 https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍 https://t.me/BookPython Библиотека Python разработчика https://t.me/python_real Python подборки на русском и английском https://t.me/python_360 Книги по Python Rus Java разработка 📌 https://t.me/BookJava Библиотека Java разработчика https://t.me/java_360 Книги по Java Rus https://t.me/java_geek Учим Java на примерах GitHub Сообщество 📌 https://t.me/Githublib Интересное из GitHub Базы данных (Data Base) 📌 https://t.me/database_info Все про базы данных Мобильная разработка: iOS, Android 📌 https://t.me/developer_mobila Мобильная разработка https://t.me/kotlin_lib Подборки полезного материала по Kotlin Фронтенд разработка 📌 https://t.me/frontend_1 Подборки для frontend разработчиков https://t.me/frontend_sovet Frontend советы, примеры и практика! https://t.me/React_lib Подборки по React js и все что с ним связано Разработка игр 📌 https://t.me/game_devv Все о разработке игр Библиотеки 📌 https://t.me/book_for_dev Книги для программистов Rus https://t.me/programmist_of Книги по программированию https://t.me/proglb Библиотека программиста https://t.me/bfbook Книги для программистов https://t.me/books_reserv Книги для программистов БигДата, машинное обучение 📌 https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning Программирование 📌 https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций https://t.me/coddy_academy Полезные советы по программированию https://t.me/rust_lib Полезный контент по программированию на Rust https://t.me/golang_lib Библиотека Go (Golang) разработчика https://t.me/itmozg Программисты, дизайнеры, новости из мира IT https://t.me/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 https://t.me/nodejs_lib Подборки по Node js и все что с ним связано https://t.me/ruby_lib Библиотека Ruby программиста QA, тестирование 📌 https://t.me/testlab_qa Библиотека тестировщика Шутки программистов 📌 https://t.me/itumor Шутки программистов Защита, взлом, безопасность 📌 https://t.me/thehaking Канал о кибербезопасности https://t.me/xakep_2 Хакер Free Книги, статьи для дизайнеров 📌 https://t.me/ux_web Статьи, книги для дизайнеров Математика 📌 https://t.me/Pomatematike Канал по математике https://t.me/phis_mat Обучающие видео, книги по Физике и Математике Excel лайфхак📌 https://t.me/Excel_lifehack https://t.me/tikon_1 Новости высоких технологий, науки и техники💡 https://t.me/mir_teh Мир технологий (Technology World) Вакансии 📌 https://t.me/sysadmin_rabota Системный Администратор https://t.me/progjob Вакансии в IT

⚡️Laravel — это не просто PHP-фреймворк, а инструмент, который меняет подход к веб-разработке. Он помогает писать чистый, под
⚡️Laravel — это не просто PHP-фреймворк, а инструмент, который меняет подход к веб-разработке. Он помогает писать чистый, поддерживаемый код, ускоряет работу и открывает доступ к мощному инструментарию, который используется в крупных проектах. Если вы уже работаете с PHP, но хотите выйти на новый уровень, Laravel — ваш лучший выбор. Мы научим вас грамотно использовать этот фреймворк, обеспечивать безопасность приложений, развертывать код и использовать встроенные инструменты для ускорения разработки. Программа курса строится на реальных задачах и практике. Вы научитесь применять Laravel в продакшен-разработке. А поддержка опытных менторов и разбор сложных кейсов помогут вам быстрее освоить фреймворк и прокачать навыки. 👉Пройдите вступительное тестирование и получите скидку на обучение: https://vk.cc/cKaGUc Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

Сегодня покажу вам простую, но мощную технику, которая может прокачать ваш PHP-код — Value Object вместо простых типов. Мы часто передаём параметры как string, int, array. Всё просто и понятно. Но как только бизнес-логика усложняется — типы начинают нас подводить. Допустим, у вас есть метод:

function sendSms(string $phoneNumber, string $message): void
А теперь скажите честно — сколько раз вы ловили себя на том, что phoneNumber передаётся в неправильном формате? Или вовсе пустым? Или из другой страны, а вы это не предусмотрели? Вот тут и приходят на помощь Value Object'ы:

final class PhoneNumber
{
    public function __construct(private string $number)
    {
        if (!preg_match('/^\+7\d{10}$/', $number)) {
            throw new InvalidArgumentException('Invalid phone number');
        }
    }

    public function value(): string
    {
        return $this->number;
    }
}
Теперь ваш метод будет выглядеть так:

function sendSms(PhoneNumber $phoneNumber, Message $message): void
Что мы получаем: - Валидность данных гарантируется на этапе создания объекта. - Код становится самодокументируемым — не нужно читать описание, чтобы понять, что именно сюда передаётся. - IDE и статическая проверка типа не дадут случайно передать email вместо phone. Да, это чуть больше кода. Но это тот случай, когда "больше" — значит надёжнее. 👉 @php_lib