Новое в Symfony 4.4: Разные улучшения (Часть 3)

Улучшения хеширования паролей и миграции

В Symfony 4.3 ввели собственный кодер паролей, чтобы Symfony выбирал лучший алгоритм для автоматического хэширования паролей. Это все еще рекомендуемый параметр, но некоторые приложения должны придерживаться определенного алгоритма по некоторым причинам.

Вот почему в Symfony 4.4 исключили все определенные кодировщики, поэтому вы можете снова использовать их в своей конфигурации безопасности:

# config/packages/security.yaml
security:
    # ...
    encoders:
        App\Entity\User:
            algorithm: 'argon2i'
            algorithm: 'argon2id'
            algorithm: 'auto'
            algorithm: 'bcrypt'
            algorithm: 'sodium'

В связи с этим и с миграцией паролей добавили новую опцию migrate_from, которая позволяет кодировщикам определять свой исходный алгоритм при миграции на новый кодировщик:

# config/packages/security.yaml
security:
    # ...
    encoders:
        App\Entity\User:
            algorithm: 'argon2i'
            migrate_from: 'bcrypt'

WebserverBundle стал устаревшим

WebServerBundle — это тонкая оболочка поверх встроенного веб-сервера PHP. Несколько лет назад было полезно быстро запускать проекты на локальном компьютере. Однако, поскольку мы представили локальный веб-сервер Symfony, WebServerBundle бледнеет в сравнении.

Для начала, WebServerBundle намного медленнее, потому что он может обслуживать только один запрос за раз (сервер Symfony загружает их параллельно). Кроме того, он не готов к современным приложениям, поскольку он не поддерживает HTTPS, тогда как сервер Symfony поддерживает это и автоматически генерирует для вас сертификаты.

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

Вот почему отказались от WebServerBundle в Symfony 4.4 (и удалили его в Symfony 5.0). В качестве альтернативы используйте сервер Symfony, предоставляемый при установке Symfony на ваш компьютер.

Более быстрая компиляция контейнеров

Компиляция контейнера сервисов может занять некоторое время в среде разработки, когда приложение определяет множество сервисов. Когда два или более одновременных запроса должны компилировать контейнер, это может привести к долгому ожиданию.

В Symfony 4.4 завернули компиляцию контейнера в условную блокировку, так что только первый запрос компилирует ее, в то время как другие запросы ждут. На практике это делает компиляцию заметной быстрее в среде разработки.

Более простая конфигурация редиректов YAML

Перенаправление на другой URL или маршрут в контроллере просто благодаря классам и ярлыкам, предоставленным Symfony. Однако настроить перенаправление HTTP в файлах YAML не так просто из-за многословности ссылок на контроллеры PHP. Например:

# config/routes.yaml
doc_shortcut:
    path: /doc
    controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController::redirectAction
    defaults:
        route: 'doc_page'

legacy_doc:
    path: /legacy/doc
    controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController::urlRedirectAction
    defaults:
        path: 'https://legacy.example.com/doc'

В Symfony 4.4 немного улучшили это, сделав активизируемый RedirectController. Предыдущая конфигурация маршрутизации в Symfony 4.4 выглядит следующим образом:

# config/routes.yaml
doc_shortcut:
    path: /doc
    controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController
    defaults:
        route: 'doc_page'

legacy_doc:
    path: /legacy/doc
    controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController
    defaults:
        path: 'https://legacy.example.com/doc'

Понятные исключения

При запуске тестов часто можно увидеть в консоли отображенную HTML-страницу с некоторыми исключениями. Эта HTML-страница обычно настолько длинна, что трудно найти основное сообщение об исключении. В Symfony 4.4 улучшили это, добавив два основных сообщения об исключениях в виде HTML-комментариев на странице исключений:

<html>
    <!-- Notice: Undefined index: payouts in /Volumes/CS/www/src/Generated/GraphQL/
         Query/TransactionList/Data.php line 33 (500 Internal Server Error) -->
    <head>
        <meta charset="UTF-8">
        <meta name="robots" content="noindex,nofollow">
        <meta name="viewport" content="width=device-width,initial-scale=1">
        <title>    Notice: Undefined index: payouts in /Volumes/CS/www/src/Generated/GraphQL/Query/TransactionList/Data.php line 33 (500 Internal Server Error)
</title>
        <link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAgCAYAAAABtRhCAAADVUlEQVRIx82XX0jTURTHLYPyqZdefQx66CEo80+aYpoIkqzUikz6Z5klQoWUWYRIJYEUGpQ+lIr9U5dOTLdCtkmWZis3rbnC5fw/neYW002307mX/cZvP3/7o1PwwOdh95x7vnf39zvnd29AgBer2xO6DclAXiMqZAqxIiNIN/IYSUS2BPhjmGATchUxI+ADWiRhpWK7HKuHFVBFdmU5YvnI4grFGCaReF/EBH4KsZlGgj2JBTuCYBWRIYF8YoEOJ6wBt/gEs7mBbyOjQXruPLSdOgPCiEiPSUUHDoL8Ug5IUo9B/d5wrt+G7OAKNrODPuVdB6vRCIzN6SdBlpW9RIgk/1FeAXabzRlrUPVCS/JhbmwudztnGeeH9AyXBIwtmM3wLinZJZHifjHw2V+NBoRh+9ixQrbgbnaSIcl7cGea6hoXQbNe7za241oeO5Z0p42M4BV2EqP2D50wo+6HzvwC6C4sApNOR8cmOrtcnhtj2kYRyC9eBvXzKrBZrXSs72kFd1t3MoKVbMekQkEnSNKOO8fac3LpmK6l1TlGtsxmsdKFsecPYgwxst0cwROMYDXboSotg0WLBRqjY51jLYcENElXwW2XJKPydvoI2GN9T8rBtrAArYIUruBJXkFheCQYlCpQP6uk5dAQFQNaUROMSGVQFxLmkoQsxDJrhLbTZ+nvVsERME9MgPJRKV/58AsyomTSzE813WLFvWK++qI0xSfQl8k8Pg46sYRuv5t6dS+4RqxDwaa4BGjYH+NTQvKScIp9+YL/hoZh3jDtLRHtt2C3g6bmhX+CpsFBWg7ilDSPgj0lD2ncr5ev/BP8VvyAJhqVyZeUhPOrEhEFxgEtjft846Z/guQTNT89Q5P9flMLoth4F7808wKtWWKzAwNQHxrh/1vaid2F+XpYTSbQf1XA2McOmOpROnvpvMEA4tSjq1cW0sws2gCYxswY6TKkvzYnJq1NHZLnRU4BX+4U0uburvusu8Kv8iHY7qefkM4IFngJHEOUXmLEPgiGsI8YnlZILit3vSSLRTQe/MPIZva5pshNIEmyFQlCvruJKXPkCEfmePzkphXHdzZNQdoRI9KPlBAxlj/I8U97ERPS5bjGbWDFbEdqHVe5caTBeZZx2H/IMvzeN15yoQAAAABJRU5ErkJggg==%0A">

       <!-- ... clip ... -->

    Sfjs.addEventListener(document, 'DOMContentLoaded', function() {
        Sfjs.createTabs();
        Sfjs.createToggles();
        Sfjs.createFilters();
    });

/*]]>*/</script>

    </body>
</html>
<!-- Notice: Undefined index: payouts in /Volumes/CS/www/src/Generated/GraphQL/
     Query/TransactionList/Data.php line 33 (500 Internal Server Error) -->