Установка Slim и Symfony Console

Подготовка структуры директорий API. Добавление образа PHP-CLI. Установка Slim Framework. Ускорение установки в Composer.

Скрытый контент
Комментарии (35)
Александр Кулик

Небольшой оффтоп. Можете показать, как реализован видео сервис?

Ответить
Дмитрий Елисеев

В каком смысле?

Ответить
Дмитрий Елисеев

Пока просто стандартный показ <video><src="video.mp4"></video> с файлового хостинга.

Ответить
Александр Кулик

Спасибо

Ответить
Александр Кулик

Как правильно загружать и показывать видео с сервера

Ответить
Дмитрий Елисеев

Это не для требования, а для эмуляции. Чтобы он не видел реально установленную в системе версию.

Ответить
Sergei

56:25 А зачем использовать рефлексию, когда мы можем также явно указать класс для контейнера? рефлексия же медленная, или экономия на спичках?

Ответить
Дмитрий Елисеев

Экономия на спичках.

Ответить
Роман

php -- --install-dir что значат первые два тире?

Ответить
Дмитрий Елисеев

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

Ответить
Oaks

Что значит объявление функции static вне класса ?

Ответить
Дмитрий Елисеев

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

Ответить
Андрей

Здравствуйте, Дмитрий! Спасибо за огромную проделанную работу.

В коде вы неоднократно используете анонимные статические функции вне класса. В официальной документации по PHP мне удалось найти лишь, что "Начиная с PHP 5.4, анонимные функции могут быть объявлены статически. Это предотвратит их автоматическое связывание с текущим классом. Объекты также не будут с ними связаны во время выполнения."

Однако не удалось найти, что "функция или переменная после него создаётся всего один раз". Подскажите, пожалуйста, где об этом можно почитать?

Ответить
Андрей

Внимательно перечитал этот раздел официальной документации вместе с пользовательскими комментариями к нему, однако никакой информации об анонимных статических функциях там не нашел.

В различных статьях на иных ресурсах использование статических анонимных рассматривается лишь в контексте связывания с $this из текущего класса, упоминается о некотором увеличении производительности при их использовании. Но нигде нет информации, что "функция или переменная после него создаётся всего один раз".

Пожалуйста, объясните необходимость использования, например, в routes.php именно статической анонимной функции и что означает в этом контексте "функция или переменная после него создаётся всего один раз".

Ответить
Дмитрий Елисеев

никакой информации об анонимных статических функциях там не нашел.

Это общая информация об использовании конструкций global и static в таком виде с чем угодно. Хоть с переменными, хоть с функциями.

Но нигде нет информации, что "функция или переменная после него создаётся всего один раз".

Про это по ссылке выше есть два предложения:

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

Теперь $a будет проинициализирована только при первом вызове функции, а каждый вызов функции будет выводить значение $a и инкрементировать его.

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

Объясните необходимость использования, например, в routes.php именно статической анонимной функции... Упоминается о некотором увеличении производительности при их использовании.

Никакой необходимости нет. Это просто плагин EA Extended в PhpStorm рекомендует анонимные функции обозначать со словом static для микрооптимизации производительности. Особенно если метод с такой функцией внутри вызывается много раз в цикле, чтобы там на каждой итерации снова и снова одну и ту же анонимку не создавать.

Ответить
Сарибжанов Ильдар

Чутка погундеть пришёл: «Чтобы не морочиться с конфигурационными файлами, типа conf или .env удобнее использовать окружение докера»

спустя 2 минуты: «Чтобы эти параметры не прописывать по всему коду удобнее создать конфигурационный файл» 0_о

Я слегка запутался, так конфигурационные файлы - это плохо или хорошо?

Ответить
Дмитрий Елисеев

Имеется в виду не морочиться с копированием и ручным заполнением параметров в локальных файлах вроде config-local.php или .env-local из .gitignore, как это делается в Yii и Laravel.

Вместо этого делаем фиксированный config.php с прямым чтением getenv(...) из окружения.

Ответить
Сарибжанов Ильдар

Универсальность порождает избыточность. Фреймворки дают готовые файлы, чтобы можно было быстро стартануть. Конечно, в нашем случае нет смысла делать какие-то conf-local, хотя в большой команде, если всё окружение будет разворачиваться локально, то, возможно и будет смысл иметь какие-то индивидуальные настройки из .local файла.

Например, если в проде у нас кэш в редиса, а очереди в реббита, в деве/стейже очереди синхронные, а локально было бы проще кэш отключить совсем.

В общем, какие-то конфиг файлы могут быть «тонко настраиваемыми» и тогда придётся их заполнять.

Ответить
Дмитрий Елисеев

Например, если в проде у нас очереди в реббите, в деве/стейже очереди синхронные.

Как раз такое разделение весьма опасно тем, что на деве и стейже всё синхронно работает, а на проде что-то будет асинхронно падать. Или если в проде есть репликация БД и конфигурация с двумя базами, а на деве её нет и конфигурация с одной. Или если в проде почта отправляется по SMTP, а на локалке эмулируется сохранением в файлы.

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

Единственное, что в config/dev/cache.php и для тестов будет отключен кэш через enable=false.

В итоге необходимость в личном файле config-local для каждого программиста полностью отпадает.

Ответить
Ruslan

я не понял момент с php-di (с 39 минуты) . Мы сначала добавили use DI\Container; в индекс, и он на в композер подставил зависимость, или до это в композел руками вписали cтроку "php-di/php-di": "^6.0", ? Или просто из-за монтажа так получилось? а до этого было docker-compose run --rm api-php-cli composer require php-di/php-di.

Если руками редактировать composer.json , то потребуется composer update. Проясните пожалуйста.

Ответить
Дмитрий Елисеев

В новом проекте не правьте вручную, а всегда делайте composer require. Тогда оно само с нужными версиями пропишется.

Просто у меня уже готовый код из коммитов, где всё уже заранее прописалось.

Ответить
Ruslan

Спасибо. Я понял. Думал может какая фишка есть, которая это вставляет, а я не знаю.

Ответить
Ruslan

43min. У вас подсвечивается папка src и при создании класса подставляется namespace и declare(strict_types=1)

Как этого добиться?

По этому мануалу мне удалось добиться подстановки namespace

Папка не подсвечивается. :)

Ответить
Ruslan

Нашел. Тупо нажать правой кнопкой и выбрать Mark as Source. Но с declare(strict_types=1) Как быть?

Ответить
Дмитрий Елисеев

Чтобы вручную не помечать папки через Mark as Source и не размечать vendor, нужно зайти в PHP > Composer и включить там опцию Mark packages as libraries. Это заодно правильно настроит игнор и импорт из папки vendor.

А для declare перейдите в Editor > File and Code Templates и там впишите declare в PHP File Header.

Ответить
Ruslan

Еще один тупой вопрос:

Когда мы делаем $app->get('/', Http\Action\HomeAction::class)

HomeAction::class - эта конструкция возвращает полное имя класса HomeAction, т.е. строку.

а нам нужно вызвать объект как функцию т.е. $action($request, $response, $args)

Почему без скобок происходит вызов?

Ответить
Дмитрий Елисеев

Этим мы просто маршрутизатору передаём строкой имя класса. А сам фреймворк уже потом создаёт объект и производит вызов с $request и $response.

Ответить
Shaitan

Вот у меня тут вопросик есть) Как правильно поступать с правами? Докер не под юзеровским айдишником делает папку вендор. Из за чего проблемы с правами. Знаю что в докерфайле можно присвоить uid и gid, корректен ли такой способ? Или данную манипуляцию в мэйкфайле можно? Какая практика вообще общепринятая?

Ответить
Дмитрий Елисеев

С vendor всегда работаем изнутри контейнера, запуская composer require и composer update. Поэтому права здесь нам не мешают.

Но если что-то генерируем в коде и надо поменять права снаружи, то меняем владельца на себя:

sudo chown $USER:$USER api -R
Ответить
BATPYIIIKOB

Хочется поблагодарить Дмитрия и его супругу за проделанную работу и за самый годный контент по "правильному" программированию в рунет сети. Слежу за деятельностью Дмитрия ещё с создания его сайта блога. Спасибо большое.

Ответить
Юлия Елисеева

Спасибо за тёплые слова! Очень приятно, если видеоматериалы вам помогают. Сейчас мы экспериментируем над записью эпизодов, качеством и этапами обработки. Обо всём пишу в своём блоге, возможно это покажется интересным.

Ответить
Андрей

Вы контроллеры сделали фреймворконезависимыми. А что насчет консольных команд? Они напрямую зависят от symfony/console. Почему в случае с консольными командами мы делаем это допущение?

Ответить
Дмитрий Елисеев

Для контроллеров есть десятки HTTP-фреймворков и для независимости есть PSR-7 и PSR-15.

А для консольных команд популярен только symfony/console. От него уходить некуда и незачем.

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий