Это не для требования, а для эмуляции. Чтобы он не видел реально установленную в системе версию.
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. От него уходить некуда и незачем.
elmut
есть файл composer.json и к нему подключил свой собственный Compsoer-пакет(расширение находится на локальном компьютере).
Как можно сделать так чтобы при изменении Composer-пакет локальный, главный Compsoer ненужно было обновлять composer update
Дмитрий Елисеев
Проставить с папки символическую ссылку если она не ставится автоматически.
Анатолий
Тут в видео array_merge_recursive, а в коммите array_replace_recursive. Помню, весной от и до прошерстил почему конфиги криво мерджились. Потом следующие уроки посмотрел и уже после этого разобрался как recursive функции php работают.
Если кто-то будет мучится с array_replace функциями из этих видео - просто не забивайте сильного голову, потом все равно либа от Laminas их заменит.
Ярослав
Напишу, может кому пригодится. В composer 2.0 hirak/prestissimo не работает. Видать из-за ненадобности. Так что я убрал этот плагин и вот мой рабочий вариант:
Игнорируйте тест установки скелетона, идите дальше, там где всё устанавливается по мере надобности. И будет счастье :)
Дядя Женя
Вопрос по оплате и прочим удобствам, связанным с ней. Решил оформить подписку. Вбил данные карты и ничего дальше не происходит. Деньги не списываются, никаких кодов не приходит, висит пустой бланк заказа. Даже вернее сказать совсем пустой, белый, без полей. Была бы возможность прикрепить скрин - показал бы. И жаль, что в кабинете нет возможности задать вопрос по теме оплаты.
Карта мастеркард. Вроде должна работать на перечисление в другую страну, по крайней мере проверена в некоторых магазинах Европы )))
Дмитрий Елисеев
В почте выяснили, что в другом браузере всё получилось. Может какое-то расширение браузера мешало.
Дядя Женя
Да, что-то я забыл тут написать о решении проблемы. В любом случае - спасибо
Небольшой оффтоп. Можете показать, как реализован видео сервис?
В каком смысле?
Пока просто стандартный показ
<video><src="video.mp4"></video>
с файлового хостинга.Спасибо
Как правильно загружать и показывать видео с сервера
У композера вроде есть специально platform параметр для требования php https://getcomposer.org/doc/06-config.md#platform
Это не для требования, а для эмуляции. Чтобы он не видел реально установленную в системе версию.
56:25 А зачем использовать рефлексию, когда мы можем также явно указать класс для контейнера? рефлексия же медленная, или экономия на спичках?
Экономия на спичках.
php -- --install-dir что значат первые два тире?
Это значит, что параметры для php закончились и остальное надо игнорировать, так как далее пойдут параметры уже для самого скрипта.
Что значит объявление функции static вне класса ?
То, что функция или переменная после него создаётся всего один раз.
Здравствуйте, Дмитрий! Спасибо за огромную проделанную работу.
В коде вы неоднократно используете анонимные статические функции вне класса. В официальной документации по PHP мне удалось найти лишь, что "Начиная с PHP 5.4, анонимные функции могут быть объявлены статически. Это предотвратит их автоматическое связывание с текущим классом. Объекты также не будут с ними связаны во время выполнения."
Однако не удалось найти, что "функция или переменная после него создаётся всего один раз". Подскажите, пожалуйста, где об этом можно почитать?
В разделе об областях видимости переменных
Внимательно перечитал этот раздел официальной документации вместе с пользовательскими комментариями к нему, однако никакой информации об анонимных статических функциях там не нашел.
В различных статьях на иных ресурсах использование статических анонимных рассматривается лишь в контексте связывания с $this из текущего класса, упоминается о некотором увеличении производительности при их использовании. Но нигде нет информации, что "функция или переменная после него создаётся всего один раз".
Пожалуйста, объясните необходимость использования, например, в routes.php именно статической анонимной функции и что означает в этом контексте "функция или переменная после него создаётся всего один раз".
Это общая информация об использовании конструкций
global
иstatic
в таком виде с чем угодно. Хоть с переменными, хоть с функциями.Про это по ссылке выше есть два предложения:
Это говорит, что созданное в первый раз значение никогда не удаляется и оно же потом используется повторно.
Никакой необходимости нет. Это просто плагин 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 для каждого программиста полностью отпадает.
я не понял момент с 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
. Тогда оно само с нужными версиями пропишется.Просто у меня уже готовый код из коммитов, где всё уже заранее прописалось.
Спасибо. Я понял. Думал может какая фишка есть, которая это вставляет, а я не знаю.
43min. У вас подсвечивается папка
src
и при создании класса подставляетсяnamespace
иdeclare(strict_types=1)
Как этого добиться?
По этому мануалу мне удалось добиться подстановки namespace
Папка не подсвечивается. :)
Нашел. Тупо нажать правой кнопкой и выбрать 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.
Спасибо, очень помог совет.
Еще один тупой вопрос:
Когда мы делаем
$app->get('/', Http\Action\HomeAction::class)
HomeAction::class
- эта конструкция возвращает полное имя класса HomeAction, т.е. строку.а нам нужно вызвать объект как функцию т.е.
$action($request, $response, $args)
Почему без скобок происходит вызов?
Этим мы просто маршрутизатору передаём строкой имя класса. А сам фреймворк уже потом создаёт объект и производит вызов с $request и $response.
Вот у меня тут вопросик есть) Как правильно поступать с правами? Докер не под юзеровским айдишником делает папку вендор. Из за чего проблемы с правами. Знаю что в докерфайле можно присвоить uid и gid, корректен ли такой способ? Или данную манипуляцию в мэйкфайле можно? Какая практика вообще общепринятая?
С vendor всегда работаем изнутри контейнера, запуская composer require и composer update. Поэтому права здесь нам не мешают.
Но если что-то генерируем в коде и надо поменять права снаружи, то меняем владельца на себя:
Хочется поблагодарить Дмитрия и его супругу за проделанную работу и за самый годный контент по "правильному" программированию в рунет сети. Слежу за деятельностью Дмитрия ещё с создания его сайта блога. Спасибо большое.
Спасибо за тёплые слова! Очень приятно, если видеоматериалы вам помогают. Сейчас мы экспериментируем над записью эпизодов, качеством и этапами обработки. Обо всём пишу в своём блоге, возможно это покажется интересным.
Вы контроллеры сделали фреймворконезависимыми. А что насчет консольных команд? Они напрямую зависят от symfony/console. Почему в случае с консольными командами мы делаем это допущение?
Для контроллеров есть десятки HTTP-фреймворков и для независимости есть PSR-7 и PSR-15.
А для консольных команд популярен только
symfony/console
. От него уходить некуда и незачем.есть файл composer.json и к нему подключил свой собственный Compsoer-пакет(расширение находится на локальном компьютере).
Как можно сделать так чтобы при изменении Composer-пакет локальный, главный Compsoer ненужно было обновлять
composer update
Проставить с папки символическую ссылку если она не ставится автоматически.
Тут в видео array_merge_recursive, а в коммите array_replace_recursive. Помню, весной от и до прошерстил почему конфиги криво мерджились. Потом следующие уроки посмотрел и уже после этого разобрался как recursive функции php работают.
Если кто-то будет мучится с array_replace функциями из этих видео - просто не забивайте сильного голову, потом все равно либа от Laminas их заменит.
Напишу, может кому пригодится. В composer 2.0 hirak/prestissimo не работает. Видать из-за ненадобности. Так что я убрал этот плагин и вот мой рабочий вариант:
Строка
rm -rf /root/.composer/cache
теперь тоже не нужна.Спасибо за урок, тут был вопрос. Я с ним разобрался благодаря комментариям
Понимаю, что прошло много времени с этого урока,но фрэймворк не устанавливается, выдает ошибку: https://monosnap.com/file/UPKsaVIBn6VR0j3kdAanhlB7hUFnu3
Игнорируйте тест установки скелетона, идите дальше, там где всё устанавливается по мере надобности. И будет счастье :)
Вопрос по оплате и прочим удобствам, связанным с ней. Решил оформить подписку. Вбил данные карты и ничего дальше не происходит. Деньги не списываются, никаких кодов не приходит, висит пустой бланк заказа. Даже вернее сказать совсем пустой, белый, без полей. Была бы возможность прикрепить скрин - показал бы. И жаль, что в кабинете нет возможности задать вопрос по теме оплаты. Карта мастеркард. Вроде должна работать на перечисление в другую страну, по крайней мере проверена в некоторых магазинах Европы )))
В почте выяснили, что в другом браузере всё получилось. Может какое-то расширение браузера мешало.
Да, что-то я забыл тут написать о решении проблемы. В любом случае - спасибо
Или войти через: