Пых – Telegram
Пых
8.26K subscribers
263 photos
16 videos
6 files
579 links
Блог Валентина Удальцова о разработке на PHP.

Хобот @phpyhobot
https://youtube.com/@phpyh
https://vkvideo.ru/@phpyh
https://news.1rj.ru/str/isPHPdying

Статистика: https://news.1rj.ru/str/INOTAROBOT?start=st1219340804

Для связи используйте личные сообщения канала.
Download Telegram
Стартовал ежегодный опрос!

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

В этот раз эстафету от CutCode приняла питерская команда Live PHP, пожелаем ребятам удачи с вёрсткой итогов!

➡️ Пройти опрос

Опрос анонимный, но если оставить свою почту, можно поучаствовать в розыгрыше слоника 💙Пых.

Итоги, как обычно, будут опубликованы на phpcommunity.ru.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥15🥱311
Media is too big
VIEW IN TELEGRAM
Плюшевые слоники уже есть — что делаем в этом году? Как вариант — 3D-конструтор 5cult.ru. Пишите другие идеи в комментариях.
🔥21👎103👍3🤮2💩1💅1
Переменные среды в Docker Compose

Основной момент, который важно понять, — в docker compose есть два уровня работы с переменными среды.

1. Переменные хоста

Первый уровень — это переменные хоста. Их можно интерполировать в compose.yaml (бывший docker-compose.yml), например:


services:
php:
image: php:${PHP_VERSION}-cli-bookworm


Если запустить docker compose up без PHP_VERSION в среде, получим предупреждение, что такой переменной нет и была использована пустая строка. Дальше, конечно, ошибка: php:-cli-bookworm не является корректной ссылкой на образ.

На уровне синтаксиса тут есть два основных варианта:


# задать значение по умолчанию
image: php:${PHP_VERSION:-8.5}-cli-bookworm

# или превратить предупреждение в ошибку с кастомным текстом
image: php:${PHP_VERSION:?Env variable `PHP_VERSION` is required}-cli-bookworm


Также на этом уровне можно использовать .env файлы. По умолчанию docker compose ищет .env в текущей директории (pwd), затем в директории проекта (где compose.yaml).

Можно явно указать несколько своих .env файлов. Пример с классической схемой .env.local > .env, для отладки используем docker compose config --environment:


echo 'PHP_VERSION=8.4' > .env
echo 'PHP_VERSION=8.5' > .env.local

docker compose --env-file .env \
--env-file .env.local \
config --environment | grep PHP_VERSION

# выведет PHP_VERSION=8.5


Самый высокий приоритет всегда будет у реальных переменных среды:


export PHP_VERSION=8.6

docker compose --env-file .env \
--env-file .env.local \
config --environment | grep PHP_VERSION

# выведет PHP_VERSION=8.6


Про второй уровень, уровень контейнера, расскажу в следующем посте.

📁 Set, use, and manage variables in a Compose file with interpolation
📁 Environment variables precedence in Docker Compose

🐘 Кстати, этот пост я опубликовал в PHPeople ещё в прошлом году, присоединяйся!
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍62🔥159🤡5
Переменные среды в Docker Compose

Разобравшись с переменными уровня хоста, мы готовы обсудить второй уровень.

2. Переменные Docker-сервиса

По умолчанию сервис не получает никакие переменные среды с хоста. Мы можем их прокинуть, используя ключи environment и env_file.

environment можно оформить как объект:


php:
environment:
DB_HOST: postgres
STORAGE_PATH: ${STORAGE_PATH}


или как массив:


php:
environment:
- DB_HOST=postgres
- STORAGE_PATH=${STORAGE_PATH}


Тут возникает интересный момент со значениями по умолчанию. Допустим, в контейнере крутится приложение на Symfony, которое обрабатывает отсуствие переменной среды STORAGE_PATH с использованием процессоров:


$di->parameters()
->set(
'storage.default_path',
'%kernel.project_dir%/var/storage/%kernel.environment%',
);

$di->services()
->set(Storage::class)
->args([
'path' => env('STORAGE_PATH')
->default('storage.default_path')
]);


Если в compose.yaml прописать STORAGE_PATH=${STORAGE_PATH:?/app/var/storage/dev}, это будет не то же самое. Без значения по умолчанию тоже нельзя оставить переменную, иначе Docker выдаст предупреждение и присвоит переменной пустую строку.

Решение, конечно же, есть в документации, но его легко не заметить:

Environment variables can be declared by a single key (no value to equals sign). In this case Compose relies on you to resolve the value. If the value is not resolved, the variable is unset and is removed from the service container environment.



php:
environment:
- STORAGE_PATH: ${STORAGE_PATH}
+ STORAGE_PATH:


или


php:
environment:
- - STORAGE_PATH=${STORAGE_PATH}
+ - STORAGE_PATH


По сути, это самый верный и простой способ прокинуть переменные среды с хоста в контейнер "как есть".

У env_file тоже есть несколько интересных нюансов. Например, начиная с Docker 2.24.0, можно объявлять необязательные файлы:


php:
env_file:
- path: .env # required by default
- path: .env.local
required: false


Сами env файлы по умолчанию парсятся в формате Docker: с интерполяцией ${}, двумя вариантами синтаксиса (: и =) и экранированием. Это можно выключить, задав файлу format: raw.

В будущем обсудим, как укротить всю эту нереальную гибкость и выработать best practice.

📁 Документация по environment
📁 Документация по env_file

🐘 Кстати, этот пост я опубликовал в PHPeople ещё в прошлом году, присоединяйся!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3513🤡7🔥6
🗺️ ClassMap: типизируем опции, конфиги, атрибуты

Новая лекция в Пых Лектории про паттерн ClassMap — расширяемый и типобезопасный способ передачи конфигурации между компонентами.

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

Также лекция затрагивает следующие темы:
• проектирование расширяемых ООП-компонентов,
• иммутабельность,
• дженерики,
• клонирование в PHP 8.5.

Залетай в Хобота, чтобы посмотреть!

50 минут / 1000 рублей
3💊33👍24🔥1354🤮3🤡3👏2🤯2💩2👎1
Пых
🗺️ ClassMap: типизируем опции, конфиги, атрибуты Новая лекция в Пых Лектории про паттерн ClassMap — расширяемый и типобезопасный способ передачи конфигурации между компонентами. План лекции: • берём популярную библиотеку Symfony и находим три проблемы, связанные…
🗺️ ClassMap: типизируем опции, конфиги, атрибуты

Друзья, я осознал, что из тизера и описания многие не поняли, о чём моя новая лекция.

Вместо лишних слов выкладываю первые 11 минут материала, где я подробно демонстрирую проблематику и формулирую задачу.

📹 YouTube | 📹 VK Видео | 💙 Лекция целиком
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍267🔥7💊4🤮3🤡3💩2
Знакомство с новыми авторами PHPeople

У меня в офисе наконец-то появился проводной интернет, и я запускаю сезон стримов на Пыхе!

Для начала сегодня в 19:00 встретимся с новыми авторами PHPeople:

Александр Макаров — всемирно известный лидер команды Yii,
Пётр Мязин — автор Пятиминутки, перешёл с PHP на ИИ,
Павла Бучнев — фартанист и вайб-кодер,
Вадим Дворовенко — знает Laravel как Тейлор, но ещё не лысый,
Edmond Dantes — разрабатывает асинхронный PHP будущего.

Чуть позже объявлю, когда будет первый PHP-линч и Open Source Цех.

📹 YouTube | 📹 VK Видео | 🐘 PHPeople
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27👍1312😁3🤮1
Сегодня наконец-то PHP-линч #29!

Я открываю новый сезон знаменитой рубрики PHP-линч! Сам по ней невероятно соскучился.

Хотелось бы сразу посмотреть на Yii3, но лучше мы в этот раз разогреемся чем-то поменьше, а, например, в следующую среду весь стрим посвятим Yii.

Залетайте в 19:00 на 📹 YouTube и 📹 VK Видео.

#php_линч
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27👍86