Мое dev окружение для PHP проектов

Разработка проектов требует не только навыков программирования, но и умения настроить эффективное рабочее окружение. В этой статье я поделюсь своим опытом создания dev-окружения для PHP-проектов с использованием Docker. Я расскажу, как организовать файловую структуру, настроить Dockerfile и docker-compose.yml, а также поделюсь полезными советами по оптимизации и безопасности. Независимо от того, работаете ли вы над pet-проектом или готовитесь к командной разработке, эти практики помогут вам создать надежную и гибкую среду разработки.

Dev окружение с Docker (generated by ChatGPT)

В основу этого окружения легли мои любимые и часто используемые инструменты:

  • Docker для контейнеризации
  • Docker compose для управления контейнерами
  • PHP последней версии
  • Composer для управления зависимостями PHP
  • xDebug для отладки приложения
  • RoadRunner для запуска приложения в режиме Long-Running
  • PHP-фреймворк Yii3
  • БД PostgreSQL, т.к. она умеет в keep-alive коннекты, в отличие от некоторых.

September 30, 2024
Около 6 мин
Public или private по умолчанию, что выбрать?

На одном из проектов я встретил интересное мнение. Весь код в проекте должен быть максимально открыт по умолчанию. Т.е. мы делаем все методы и поля public, а final нигде не ставим. Мотивировано это было сложностями дальнейшей поддержки:

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

Это мнение было очень необычным для меня, и я решил выяснить: действительно ли приватные поля и методы принесут больше проблем, чем публичные.
Давайте напишем класс с лишним публичным методом и посмотрим, насколько просто его будет поддерживать.

interface FooInterface {
  public function foo();
}

class Foo implements FooInterface {
  public function foo() {
    // do stuff
    $this->bar();
    // do stuff
  }

  public function bar() {
    // do stuff
  }
}

April 30, 2023
Около 2 мин
Как делать не надо #1. Несуществующие поля трейтов

Этой статьей я открываю рубрику из практики "Как делать не надо". В ней будет код из реальных проектов, из которого я уберу все отсылки к самим проектам. И, конечно, разъяснение: почему так делать нельзя, и как бы поступить стоило.

Итак, первый пациент. Внутри трейта используются поля его наследников. То есть, что-то такое:

trait Foo
{
    public function bar(): string
    {
        return $this->field . self::CONSTANT . $this->method() . true;
    }
}

Примечание

Или даже хуже, $this->{$attribute}. Но это уже совсем ни в какие ворота не лезет, т.к. шанс схлопотать 500ю ошибку поднимается почти до 100%.


April 23, 2023
Около 1 мин
Пример настройки xDebug в докере

Когда-то давно я собрал рабочий комбайн из PHP, xDebug, Docker и PhpStorm. С тех пор я таскаю его из проекта в проект и горя не знаю. Для тех, у кого настройка локального окружения с докером и xDebug вызывает сложности, выкладываю этот конфиг с пояснениями. Ниже мы напишем образ контейнера с установленным в нем xDebug, настроим PhpStorm и разберем рабочую конфигурацию Docker Compose.

Пример настройки xDebug в докере

January 21, 2023
Около 3 мин