Symfony 4: Кращі практики

Будь-яка велика версія проекту - це можливість переглянути свої найкращі практики. Модернізація їх. Пристосування їх до нових функцій проекту. Symfony 4 не є винятком.

Перш за все стандартизація

Symfony 4 буде еволюцією сучасних практик, намагаючись використовувати більш стандартні інструменти.

Symfony прагне охопити PHP та веб-стандарти. Важко повірити, що Symfony 2 розпочався в той час, коли композитора не існувало. З того часу спільнота PHP створила групу Fig, яка прийняла кілька рекомендацій. Symfony була однією з перших головних рамок, яка прийняла більшість PSR, не порушуючи зворотної сумісності. PSR-3 для лісозаготівлі багато років тому. PSR-4 для автозавантаження. Зовсім недавно PSR-6 для кешування. Наступна версія Symfony, версія 3.3, реалізує PSR-16 для кешування та абсолютно новий PSR-11 для сумісності контейнерів. У нас навіть може бути випадок використання PSR-13.

Використання стандартів допомагає в інтероперабельності, а також у від'єднанні коду від рамки.

Програми без пакетів

Перехід до програм без пакетів було пояснено у попередній публікації блогу. Тут я знову згадую, оскільки це важлива зміна в нинішньому наборі найкращих практик.

Змінні середовища

Поточна книга найкращих практик Symfony дуже детально пояснює, як створити параметри конфігурації в додатку Symfony. Коли використовувати app / config / settings.yml для конфігурації, пов'язаної з інфраструктурою, або app / config / config.yml для налаштування, пов’язаного з додатком.

Я б підходив до рекомендацій, щоб максимально уникати використання app / config / config.yml. Є дійсні випадки використання, але я можу порахувати їх з одного боку.

Symfony 4 не матиме еквівалента app / config / settings.yml. Замість цього використовуйте змінні середовища. Саме це робить більшість фреймворків іншими мовами. Це також одна з рекомендацій Маніфесту 12-факторного застосування. Той, що заохочується багатьма сучасними хостинг-платформами.

Використання змінних довкілля, хоча і далеко не ідеально, має багато переваг над тим, що ми робимо в даний час. Змінні середовища є більш "стандартним" способом керування налаштуваннями, які залежать від середовища (немає необхідності керувати параметрами.yml.dist, наприклад). Змінні середовища можуть бути прочитані декількома програмами, оскільки вони не залежать від вашого коду, рамки та мови. Змінні середовища допомагають при розгортанні файлової системи лише для читання, оскільки вони відокремлюються від вашого коду. Значення змінних оточуючих середовищ можна змінювати "динамічно" без перерозподілу вашої програми (очищення кешу для Symfony). І останнє, але не менш важливе, змінні середовища можна керувати наявними інструментами.

Зауважте, що зберігання секретів у змінних середовища не є більш "захищеним", ніж зберігання їх у файлі конфігурації.

Оскільки використання змінних оточуючих середовищ може бути громіздким у розвитку, використання «стандартного» .env-файлу простіше та рекомендується. Symfony 3.3 постачається з новим компонентом Dotenv, який буде використовуватися за замовчуванням у додатках Symfony 4. Перемикання між .env-файлом та "реальними" змінними середовища буде здійснюватися автоматично та прозоро.

Зауважте, що ви також можете визначити змінні середовища у файлі paramet.yaml, якщо вам це краще. Це не буде рекомендованим способом. Зауважте, що paramet.yaml не є помилкою помилки параметра.yml! Це ще одна зміна в Symfony 4, про яку піде мова в наступній статті.

Як хороший побічний ефект, він допомагає спростити спосіб обробки середовища Symfony і прапор налагодження як консоллю, так і веб-додатками.

В даний час консольний інструмент Symfony може приймати середовище та прапор налагодження через прапорці --env та --no-debug. Або за допомогою змінних середовища SYMFONY_ENV та SYMFONY_DEBUG.

З Symfony 4 це більше не потрібно. APP_ENV та APP_DEBUG можна використовувати як для веб-переднього контролера, так і для консольного інструменту.

Не більше ./bin/console foo: bar --env = prod --no-debug або SYMFONY_ENV = prod SYMFONY_DEBUG = 0 ./bin/console foo: bar. Просто використовуйте ./bin/console foo: bar.

Це просто працює. У розробці та на виробничих серверах.

Symfony 4 рясніє такими спрощеннями.

Уніфікований веб-фронт-контролер

Symfony 3 має два веб-фронтальних контролера. Один оптимізований для виробництва. Один оптимізований для розвитку. Symfony 4 використовує лише один. Більше не потрібно видаляти передній веб-контролер розробки. Більше проблем із безпекою немає, якщо ви забудете.

Ви б подумали, що код складніший, ніж раніше. Це навіть не так, оскільки нам вдалося видалити багато «застарілого» коду. Завдяки змінній середовища. Завдяки PHP 7 та видаленню завантажувальних програм та кеш-класів. Завдяки Symfony 3.3, який знімає потребу в певному автозавантажувачі.

Makefilefile

У багатьох проектах є деякі спеціальні сценарії: обгортка для запуску одиничного або інтеграційного тестів, сценарій, який запускає вбудований сервер PHP тощо. Сценарії, для яких писати команду консолі Symfony, не мали б сенсу.

Для зручності ви могли їх визначити у файлі програми composer.json. Silex робить це із записом сценарію, який запускає вбудований сервер PHP. Але це виникає з багатьма проблемами, такими як тайм-аути або непідтримка кодів аварійних відхилень ANSI.

Хоча централізація команд допомагає у відкритті. А як щодо використання Makefile замість цього? Це, мабуть, найсуперечливіша особливість Symfony 4. Я їхав туди-сюди. Але я переконаний, що це приносить велику цінність і допомагає вирішити деякі питання.

make - це відомий «стандартний» інструмент. Він більш потужний, ніж сценарії, якими керує композитор. Це не покладається на PHP. Використовуйте його для полегшення розгортання, підключення до віддалених серверів через SSH, для запуску тестових сценарій Blackfire. Використовуйте його для запуску npm, gulp, webpack, ви його назвали. Завдання, де використання команд Symfony не є практичним і не бажаним.

Прибуток від виконання рецептів паралельно. Не виконуйте завдань, якщо нічого не змінилося. Зробити потужно.

Візьмемо один приклад, очищення кешу. Symfony має команду очистити та прогріти кеш. Виконання обох в одному і тому ж процесі працює не так добре, оскільки PHP не може перезавантажити клас, якщо він змінився. Але це легко досягти за допомогою make:

кеш-очищення:
  @test -f bin / console && bin / console cache: clear --no-warmup || rm -rf var / cache / *
.PHONY: кеш-прозоре
кеш-розминка: кеш-очищення
  @test -f бін / консоль && bin / консольний кеш: розминка || echo "не може розігріти кеш (потрібна symfony / console)"
.ФОНІЯ: розминка кеша

Як інший приклад, більшість моїх PHP-проектів мають два завдання, які допомагають запускати тести Blackfire:

bf-dev:
   blackfire-player --endpoint = http: // `сервер bin / console: status --filter = address` запустіть тести / bkf / all.bkf
.ФОНІЯ: bf-dev
bf-prod:
  blackfire-player --endpoint = https: //twig.sensiolabs.org запустити тести / bkf / all.bkf --variable = "env = prod"
.ФОНІЯ: bf-prod

Хочете перейти на додаток до режиму "обслуговування"? Використовуйте команду make, а не команду Symfony.

Управління активами

Assetic було видалено в Symfony Standard Edition 3.0. Наразі ми не рекомендуємо жодних замін, оскільки світ JavaScript все ще працює над "стандартним" інструментом. Але Symfony 4 дасть рекомендацію та забезпечить глибоку інтеграцію. Детальніше про це через кілька тижнів. Проте я хотів би зазначити це, оскільки ми також підтримуємо активи, які є символьними посиланнями / скопійованими з пакетів у веб / пакети / через активи: встановити, але це, мабуть, щось, що не витримає Symfony 5. Тим більше, що у нас є безлічна структура додатків зараз.

Підтримка нових найкращих практик має певний вплив на структуру каталогів, яка буде наступною темою. Будьте в курсі!

Оригінально опубліковано на fabien.potencier.org.