{"id":444113,"date":"2025-01-04T15:02:22","date_gmt":"2025-01-04T15:02:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=444113"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2025-01-04T15:02:22","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=444113","title":{"rendered":"<span>\u0414\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u043f\u043e PHP, Laravel \u0438 Symfony \u0437\u0430 \u0434\u0435\u043a\u0430\u0431\u0440\u044c&#8217;2024<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u0421\u0435\u0440\u0433\u0435\u0439 \u041f\u0430\u043d\u0442\u0435\u043b\u0435\u0435\u0432, \u041a\u0438\u0440\u0438\u043b\u043b \u041d\u0435\u0441\u043c\u0435\u044f\u043d\u043e\u0432 \u0438 \u0414\u0430\u043d\u0438\u043b \u0429\u0443\u0446\u043a\u0438\u0439 \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u0437\u0430 \u0434\u0435\u043a\u0430\u0431\u0440\u044c \u0432 PHP, Symfony \u0438 Laravel (\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e). \u0412\u0441\u0451 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0431\u044b\u0442\u044c \u0432 \u0442\u0435\u043c\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e, \u044d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0432\u0430\u0441. \ud83d\ude80<\/p>\n<h3>\u041d\u043e\u0432\u043e\u0441\u0442\u0438 PHP \u0441 \u0421\u0435\u0440\u0433\u0435\u0435\u043c \u041f\u0430\u043d\u0442\u0435\u043b\u0435\u0435\u0432\u044b\u043c<\/h3>\n<h4>\u0412\u044b\u0448\u043b\u0438 PHP 8.2.27, PHP 8.3.15 \u0438 PHP 8.4.2<\/h4>\n<p>\u0412\u044b\u043f\u0443\u0441\u043a\u0438 \u0441 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u044b\u0448\u043b\u0438 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e. \u041a\u0441\u0442\u0430\u0442\u0438, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430, \u0440\u0435\u043b\u0438\u0437\u044b \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043d\u0430 GitHub, \u0440\u0430\u043d\u044c\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0433\u0438.\u00a0 \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0440\u0435\u043b\u0438\u0437-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0434\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u044c \u043b\u044e\u0434\u044f\u043c, \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0433\u0430 \u2013 \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0440\u0435\u043b\u0438\u0437, \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0430\u0443\u043a\u0430\u043b\u043e\u0441\u044c, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u0430\u043b\u043e\u0439 \u043a\u0440\u043e\u0432\u044c\u044e. \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0435 \u0432 \u043a\u0443\u0440\u0441\u0435, \u0441\u0431\u043e\u0440\u043a\u0438 \u0430\u0440\u0445\u0438\u0432\u043e\u0432 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0433\u043e\u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0432\u0442\u043e\u0440\u043d\u0438\u043a\u0430\u043c, \u0430 \u0430\u043d\u043e\u043d\u0441 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u2013 \u043f\u043e \u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430\u043c. \u0414\u0432\u0430 \u0434\u043d\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0441\u0431\u043e\u0440\u043e\u043a \u043f\u043e\u0434 Windows \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438.\u00a0\u0414\u043e \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 php.net \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0440\u0430\u0441\u0441\u044b\u043b\u043e\u043a, \u0440\u0435\u043b\u0438\u0437 \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u043c \u0438 \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u0435\u0433 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442.<\/p>\n<h4>\u26a0\ufe0f\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430\u0441\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 PHP 8.2<\/h4>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u0442\u043e\u0433\u043e \u0433\u043e\u0434\u0430, \u0432\u0435\u0440\u0441\u0438\u0438 PHP \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u043b\u0435\u0442: 2 \u0433\u043e\u0434\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 2 \u0433\u043e\u0434\u0430 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 PHP 8.1 \u043f\u0440\u043e\u0434\u043b\u0435\u043d\u0430 \u0434\u043e 31 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2025, \u0430 PHP 8.2 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e 31 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2026 \u0433\u043e\u0434\u0430. PHP 8.2.27 \u0441\u0442\u0430\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0432\u044b\u043f\u0443\u0441\u043a\u043e\u043c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 \u0441\u0431\u043e\u0440\u043a\u0443 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430 \u044f \u0440\u0435\u0448\u0438\u043b <a href=\"https:\/\/youtu.be\/mBbOCi9oeHA\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0432\u0438\u0434\u0435\u043e<\/a>, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0435\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<h4>\u00ab\u0421\u0432\u043e\u044f \u0438\u0433\u0440\u0430\u00bb \u043f\u043e PHP. \u0424\u0438\u043d\u0430\u043b<\/h4>\n<p>\u0421\u043e\u0441\u0442\u043e\u044f\u043b\u0430\u0441\u044c <a href=\"https:\/\/youtube.com\/live\/6zbliSDrgCg\" rel=\"noopener noreferrer nofollow\">\u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u0433\u0440\u0430 \u044d\u0442\u043e\u0433\u043e \u0433\u043e\u0434\u0430<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0448\u043b\u0438\u0441\u044c \u041a\u0438\u0440\u0438\u043b\u043b \u041d\u0435\u0441\u043c\u0435\u044f\u043d\u043e\u0432, \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0413\u0430\u0433\u0430\u0440\u0438\u043d \u0438 \u041f\u0430\u0432\u0435\u043b \u0411\u0443\u0447\u043d\u0435\u0432. \u0412 2025 \u0433\u043e\u0434\u0443 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u0430, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u043a\u0430\u043a\u0438\u0445 \u0433\u043e\u0441\u0442\u0435\u0439 \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043a\u0430\u043d\u0430\u043b\u0435, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b \u0438 \u0441\u0430\u043c\u0438 \u043d\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0443\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0438\u0433\u0440? \u2013 \u0414\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u0441\u0432\u043e\u0438\u043c\u0438 \u043c\u044b\u0441\u043b\u044f\u043c\u0438, \u043c\u044b \u0447\u0438\u0442\u0430\u0435\u043c \u0438 \u043f\u0440\u0438\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044e.<\/p>\n<h4>PHP Russia 2024<\/h4>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0434\u0435\u043a\u0430\u0431\u0440\u044f \u0432 \u041c\u043e\u0441\u043a\u0432\u0435 \u043f\u0440\u043e\u0448\u043b\u0430 \u043f\u044f\u0442\u0430\u044f \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f PHP Russia. \u041c\u043d\u043e\u0433\u0438\u0435 \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0432\u043e\u0438 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u044f \u043e\u0442 \u043f\u043e\u0435\u0437\u0434\u043a\u0438, \u0437\u0430\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b\u044b <a href=\"https:\/\/t.me\/cutcode\" rel=\"noopener noreferrer nofollow\">\u0414\u0430\u043d\u0438\u043b\u0430<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/t.me\/sergei_predvoditelev\" rel=\"noopener noreferrer nofollow\">\u0421\u0435\u0440\u0433\u0435\u044f \u041f\u0440\u0435\u0434\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0432\u0430<\/a>. \u0412\u0430\u043b\u0435\u043d\u0442\u0438\u043d \u0423\u0434\u0430\u043b\u044c\u0446\u043e\u0432 \u0432\u0437\u044f\u043b \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u0443 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u043a\u0435\u0440\u0430 \u0418\u043e\u0430\u043d\u043d\u0438\u0441\u0430 \u041b\u0443\u043a\u0435\u0440\u0438\u0441\u0430, <a href=\"https:\/\/youtu.be\/rycC75QpIPY\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435<\/a>, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b\u0438.<\/p>\n<p>\u041c\u044b, \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 CutCode, \u0442\u0430\u043a\u0436\u0435 \u0432\u0437\u044f\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u0443 \u0441\u043f\u0438\u043a\u0435\u0440\u043e\u0432 \u0438 \u0433\u043e\u0441\u0442\u0435\u0439, <a href=\"https:\/\/youtu.be\/wxp4iDfNrgo\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430\u0448 \u043e\u0442\u0447\u0435\u0442 \u043e \u043f\u043e\u0435\u0437\u0434\u043a\u0435<\/a> \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0435 CutCode \u0438 \u0437\u0430\u0433\u043b\u044f\u043d\u0438\u0442\u0435 <a href=\"https:\/\/t.me\/php_fart\/149\" rel=\"noopener noreferrer nofollow\">\u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b Fart Time<\/a>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b!<\/p>\n<p>\u041e\u0442 \u0441\u0435\u0431\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044e, \u0447\u0442\u043e \u0440\u0430\u0434 \u0431\u044b\u043b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0445, \u0441 \u043a\u0435\u043c \u0440\u0430\u043d\u044c\u0448\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0442\u0440\u0438\u043c\u0430\u0445 \u0438 \u043d\u0430 GitHub, \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c\u0441\u044f \u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0433\u043e\u0434\u0443 \ud83d\ude42<\/p>\n<h4>\u0412\u044b\u0448\u0435\u043b Rector 2.0<\/h4>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430 \u2013 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439:<\/p>\n<ul>\n<li>\n<p>php-parser 4.x \u0434\u043e 5.0<\/p>\n<\/li>\n<li>\n<p>PHPStan 1.x \u0434\u043e 2.0<\/p>\n<\/li>\n<li>\n<p>\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f PHP 7.4<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0431\u0435\u0437 \u043d\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439: \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0444\u043b\u0430\u0433 <code>--only<\/code> \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 Behat \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430.<\/p>\n<h4>\u0412\u044b\u0448\u043b\u0430 Laravel Nova 5<\/h4>\n<p>\u0412 \u043f\u044f\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0430\u0434\u043c\u0438\u043d\u043a\u0438 \u043e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Laravel \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (Inertia 2, PHP 8.1+, Laravel 10+), \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0430\u043d\u0435\u043b\u0438 \u0432\u043a\u043b\u0430\u0434\u043e\u043a \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u043b\u0435\u0439.<\/p>\n<p>\u0415\u0449\u0435 \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u0438 Nova \u0434\u043e\u0433\u043e\u043d\u0438\u0442 <a href=\"https:\/\/moonshine-laravel.com\/\" rel=\"noopener noreferrer nofollow\">MoonShine<\/a>, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u0441\u0442\u0430\u0442\u0438, \u043d\u0430 \u0434\u043d\u044f\u0445 \u0442\u0430\u043a \u0436\u0435 \u0432\u044b\u0448\u043b\u0430 \u043c\u0430\u0436\u043e\u0440\u043d\u0430\u044f \u0442\u0440\u0435\u0442\u044c\u044f \u0432\u0435\u0440\u0441\u0438\u044f. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 <a href=\"https:\/\/www.youtube.com\/live\/LpEEZ-qb8jQ\" rel=\"noopener noreferrer nofollow\">\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044e \u0440\u0435\u043b\u0438\u0437\u0430<\/a>, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b\u0438.<\/p>\n<h3>PHP Core<\/h3>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u044f\u0434\u0440\u0430 PHP \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0441\u0432\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0435\u0440\u0438\u0438\u00a0<a href=\"https:\/\/thephp.foundation\/blog\/tag\/roundup\/\" rel=\"noopener noreferrer nofollow\">PHP Core Roundup<\/a> \u043e\u0442 PHP Foundation, \u043c\u044b \u043b\u0438\u0448\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e \u043d\u0438\u043c \u043f\u0440\u043e\u0431\u0435\u0436\u0438\u043c\u0441\u044f:<\/p>\n<h4>\ud83d\udcca RFC: Attributes on Constants<\/h4>\n<p>\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0431\u044b\u043b\u0438 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432\u00a0<a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\" rel=\"noopener noreferrer nofollow\">RFC: Attributes v2<\/a>. Daniel Scherzer \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0432\u043d\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430\u00a0<code>const<\/code>, \u0430 \u043d\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>define<\/code>. \u0413\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430 RFC \u043f\u0440\u043e\u0434\u043b\u0438\u0442\u0441\u044f \u0434\u043e 6 \u044f\u043d\u0432\u0430\u0440\u044f, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, RFC \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043d\u044f\u0442.<\/p>\n<pre><code class=\"php\">\/\/ \u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e #[\\MyAttribute] const Example1 = 1;  \/\/ \u0410 \u0442\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f #[\\MyAttribute] const Example2 = 2,       Example3 = 3;<\/code><\/pre>\n<h4>\ud83d\udcca\u00a0RFC: Error Backtraces v2<\/h4>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u0448\u0438\u0431\u043a\u0438 PHP \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043e\u043a, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442\u044c \u0432\u044b\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u043f\u0440\u0438\u0447\u0438\u043d\u044b. Eric Norris \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443, <code>E_FATAL_ERRORS<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0435 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0444\u0430\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a. \u0413\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430 RFC \u043f\u0440\u043e\u0434\u043b\u0438\u0442\u0441\u044f \u0434\u043e 10 \u044f\u043d\u0432\u0430\u0440\u044f.<\/p>\n<h4>\ud83d\udce3RFC: Asymmetric Visibility for Static Properties<\/h4>\n<p>\u0412 RFC <a href=\"https:\/\/wiki.php.net\/rfc\/asymmetric-visibility-v2\" rel=\"noopener noreferrer nofollow\">Asymmetric Visibility v2<\/a> \u0434\u043b\u044f PHP 8.4 \u0431\u044b\u043b\u0430 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043e\u043f\u0443\u0449\u0435\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0430\u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432. \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, \u0443\u0436\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0432\u0448\u0430\u044f\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 Ilija Tovilo \u0438 Larry Garfield \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0443\u044e \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0442\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u044b.<\/p>\n<pre><code class=\"php\">class Example {     public private(set) static string $classTitle = 'Example class';      \/\/ Implicitly public-read, just like object properties.     protected(set) static int $counter = 0;      public static function changeName(string $name): void     {         \/\/ From private scope, so this is allowed.         self::$classTitle = $name;     } }  print Example::$classTitle; \/\/ \u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e.  Example::$classTitle = 'Nope'; \/\/ \u0410 \u0442\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f. <\/code><\/pre>\n<h4>\u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u0435\u0436\u0435\u0433\u043e\u0434\u043d\u044b\u0439 \u043e\u043f\u0440\u043e\u0441 \u043f\u043e PHP!<\/h4>\n<p>\u0412\u0441\u0435 \u0435\u0449\u0451 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u0435\u0436\u0435\u0433\u043e\u0434\u043d\u043e\u043c \u043e\u043f\u0440\u043e\u0441\u0435 \u043f\u043e PHP, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0430 \u0447\u0435\u043c \u043c\u044b \u043f\u0438\u0448\u0435\u043c, \u0447\u0435\u043c \u0436\u0438\u0432\u0435\u043c \u0438 \u043a\u0443\u0434\u0430 \u0434\u0432\u0438\u0436\u0435\u043c\u0441\u044f! \u0412 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u0441\u0438\u043b\u0430\u043c\u0438 CutCode \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 PHP \u0432 2024 \u0433\u043e\u0434\u0443. \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443 1120 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u043d\u0430 \u043a\u0430\u043a\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 PHP \u0441\u0438\u0434\u044f\u0442, \u043a\u0430\u043a\u0438\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u043b\u044e\u0431\u044f\u0442 \u0438 \u043a\u0430\u043a \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0418\u0418. \u0412 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u043f\u0440\u043e\u0441\u0435\u0449\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435! \u0412\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435, \u043d\u043e\u0432\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0438 \u0434\u0430\u0436\u0435 \u043f\u0430\u0440\u0443 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u043c. \u041e\u043f\u0440\u043e\u0441 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439. \u041d\u043e \u043a\u0442\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u0432\u043e\u0439 email \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u043e\u0437\u044b\u0433\u0440\u044b\u0448\u0435 \u0441\u043b\u043e\u043d\u0430. \u0410 \u0448\u0430\u043d\u0441 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0435\u0441\u0442\u044c \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e! \u041f\u0440\u043e\u0439\u0434\u0438\u0442\u0435 \u043e\u043f\u0440\u043e\u0441 \u0438 \u043f\u043e\u043c\u043e\u0433\u0438\u0442\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0440\u0435\u0437 \u043f\u043e \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0439 PHP-\u0442\u0443\u0441\u043e\u0432\u043a\u0435! \u041f\u043e \u0438\u0442\u043e\u0433\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0438 \u0441\u0442\u0430\u0442\u0435\u0439, \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432, \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u043f\u043e PHP. \u0412\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u043d\u0430 <a href=\"https:\/\/phpcommunity.ru\" rel=\"noopener noreferrer nofollow\">phpcommunity.ru<\/a> \u0438 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0430 \u00ab\u0425\u0430\u0431\u0440\u0435\u00bb.<\/p>\n<p><a href=\"https:\/\/docs.google.com\/forms\/d\/e\/1FAIpQLSdHxQ8jPapOz6YDsGViqc1x6agJuzx2RxIjskxNcdiPM82_tA\/viewform\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u043f\u0440\u043e\u0441<\/a><\/p>\n<h4>PHP-\u0441\u043b\u043e\u043d\u044b<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0443\u0441\u043f\u0435\u043b\u0438 \u043a\u0443\u043f\u0438\u0442\u044c PHP-\u0441\u043b\u043e\u043d\u0430 \u0441\u043e \u0441\u043a\u0438\u0434\u043a\u043e\u0439 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443, \u0442\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0439\u0442\u0435, \u0432\u0441\u0435 \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434\u044b \u0432 2025 \u0433\u043e\u0434\u0443 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0412\u043f\u0435\u0440\u0435\u0434\u0438 \u0435\u0449\u0435 \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0430\u0437\u0434\u043d\u0438\u043a\u043e\u0432, \u0438 PHP-\u0441\u043b\u043e\u043d\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u043f\u043e\u0434\u0430\u0440\u043a\u043e\u043c \u0441\u0435\u0431\u0435 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0443. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442 <a href=\"http:\/\/elephpants.ru\/?ref=cutcode\" rel=\"noopener noreferrer nofollow\">elephpants.ru<\/a> \u0438 \u0432\u0432\u043e\u0434\u0438\u0442\u0435 \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434 <code>CutCode<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u043e\u043d\u0438\u043a\u0430 \u0441\u043e \u0441\u043a\u0438\u0434\u043a\u043e\u0439.<\/p>\n<h3>Laravel \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u0441 \u0414\u0430\u043d\u0438\u043b\u043e\u043c \u0429\u0443\u0446\u043a\u0438\u043c<\/h3>\n<h4>11.34 Add Number::spellOrdinal() to spell ordinals as words.\u00a0<\/h4>\n<p><a href=\"https:\/\/github.com\/laravel\/framework\/pull\/53661\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/laravel\/framework\/pull\/53661<\/a><\/p>\n<p>Joel Stein \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043c\u0435\u0442\u043e\u0434 <code>spellOrdinal()<\/code> \u0432 \u0445\u0435\u043b\u043f\u0435\u0440 <code>Number<\/code>, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0435 \u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430\u043c\u0438.<\/p>\n<pre><code class=\"php\">'The ' . Number::spellOrdinal(40) . ' president of the United States is Ronald Reagan';<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c integer, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u044c\u044e.\u00a0<\/p>\n<h4>11.34 Add shorthands for fake HTTP responses<\/h4>\n<p><a href=\"https:\/\/github.com\/laravel\/framework\/pull\/53663\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/laravel\/framework\/pull\/53663<\/a><\/p>\n<p>Jason McCreary \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0441\u043e\u043a\u0440\u0430\u0449\u0451\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 HTTP-\u043e\u0442\u0432\u0435\u0442\u043e\u0432 &#8212;\u00a0 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <code>fake<\/code>. \u0414\u043e \u0432\u0435\u0440\u0441\u0438\u0438 11.34 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043a\u0440\u0430\u0449\u0451\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u043d\u043e \u044d\u0442\u043e\u0442 PR \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0435\u043b\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 \u0438\u043b\u0438 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0443\u0441-\u043a\u043e\u0434\u0430.<\/p>\n<pre><code class=\"php\">\/\/ \u0414\u043e Http::fake([    'google.com' =&gt; Http::response('Hello World'),    'github.com' =&gt; Http::response(['foo' =&gt; 'bar']),    'forge.laravel.com' =&gt; Http::response(status: 204), ]);  \/\/ \u041f\u043e\u0441\u043b\u0435 Http::fake([    'google.com' =&gt; 'Hello World',    'github.com' =&gt; ['foo' =&gt; 'bar'],    'forge.laravel.com' =&gt; 204, ]);<\/code><\/pre>\n<h4>11.34 Add Request::fluent method<\/h4>\n<p><a href=\"https:\/\/github.com\/laravel\/framework\/pull\/53662\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/laravel\/framework\/pull\/53662<\/a><\/p>\n<p>\u0421\u0442\u0438\u0432 \u0411\u0430\u0443\u043c\u0430\u043d \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043c\u0435\u0442\u043e\u0434 <code>fluent()<\/code> \u0432 \u043a\u043b\u0430\u0441\u0441 HTTP Request, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432.<\/p>\n<pre><code class=\"php\">\/** @var Illuminate\\Http\\Request $request *\/ $data = $request-&gt;fluent(); $data-&gt;title; $data-&gt;body; \/\/ etc.<\/code><\/pre>\n<h4>11.35 URI<\/h4>\n<p><a href=\"https:\/\/github.com\/laravel\/framework\/pull\/53731\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/laravel\/framework\/pull\/53731<\/a><\/p>\n<p>\u0410\u0432\u0442\u043e\u0440 \u044d\u0442\u043e\u0433\u043e PR \u0441\u0430\u043c Taylor. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b Uri \u2014 \u043a\u043b\u0430\u0441\u0441, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 URI \u043e\u0442 PHP League. Uri \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 URI \u0432 \u0432\u0430\u0448\u0435\u043c Laravel-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430\u043c\u0438.<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0430 Uri \u2014 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 URI, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u043f\u0443\u0442\u044f\u043c\u0438. \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e support \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0442\u0440\u043e\u0438\u0442\u044c URL, Path, Fragment \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c <code>scheme()<\/code>, <code>host()<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435:<\/p>\n<pre><code class=\"php\">use Illuminate\\Support\\Uri;  $uri = Uri::of('https:\/\/moonshine-laravel.com')    -&gt;withPath('links')    -&gt;withQuery(['page' =&gt; 2])    -&gt;withFragment('new');  (string) $url; \/\/ https:\/\/moonshine-laravel.com\/links?page=2#new  $uri-&gt;path(); \/\/ links $uri-&gt;scheme(); \/\/ https $uri-&gt;port(); \/\/ null $uri-&gt;host(); \/\/ moonshine-laravel.com<\/code><\/pre>\n<h4>11.35 Allow sorting routes by precedence in artisan routes:list.<\/h4>\n<p><a href=\"https:\/\/github.com\/laravel\/framework\/pull\/53706\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/laravel\/framework\/pull\/53706<\/a><\/p>\n<p>PR \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0441 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u043e\u0443\u0442\u043e\u0432. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e URI. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043b\u0435\u0433\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043d\u0430\u0434 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430).<\/p>\n<p>\u0418 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0440\u043e\u0443\u0442\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b, \u0430 \u043f\u043e\u043d\u044f\u0442\u044c \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e &#8212; \u0441\u043b\u043e\u0436\u043d\u043e. \u042d\u0442\u043e\u0442 pull request \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u043f\u0446\u0438\u044e <code>--sort=precedence<\/code>. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u0443\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0435 \u043f\u043e URI, \u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043e\u043d\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b. \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c.\u00a0<\/p>\n<h4>11.36 Uri and UriQueryString implement Stringable<\/h4>\n<p><a href=\"https:\/\/github.com\/laravel\/framework\/pull\/53873\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/laravel\/framework\/pull\/53873<\/a><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0441 \u043d\u043e\u0432\u044b\u043c support \u043a\u043b\u0430\u0441\u0441\u043e\u043c URI \u043e\u0442 Taylor. \u042d\u0442\u043e\u0442 PR \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>Stringable<\/code>, \u0441\u0442\u0440\u0430\u043d\u043d\u043e \u0447\u0442\u043e Taylor \u0441\u0440\u0430\u0437\u0443 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b, \u043d\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<h4>11.36 Add new Uri class to default, global aliases<\/h4>\n<p><a href=\"https:\/\/github.com\/laravel\/framework\/pull\/53884\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/laravel\/framework\/pull\/53884<\/a><\/p>\n<p>\u042d\u0442\u043e\u0442 PR \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f URI &#8212; \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 alias \u043f\u043e\u0434 \u043d\u0435\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0431\u043b\u0435\u0439\u0434\u0430\u0445 \u0438 \u0433\u0434\u0435 \u0443\u0433\u043e\u0434\u043d\u043e \u0431\u0435\u0437 \u0438\u043c\u043f\u043e\u0440\u0442\u0430.\u00a0<\/p>\n<h3>Symfony \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u0441 \u041a\u0438\u0440\u0438\u043b\u043b\u043e\u043c \u041d\u0435\u0441\u043c\u0435\u044f\u043d\u043e\u0432\u044b\u043c<\/h3>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0441\u0438\u043c\u0444\u043e\u043d\u044f\u0448\u043a\u0438!<\/p>\n<p>\u042d\u0442\u043e \u0441\u043d\u043e\u0432\u0430 \u044f, \u041a\u0438\u0440\u0438\u043b\u043b \u041d\u0435\u0441\u043c\u0435\u044f\u043d\u043e\u0432. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e \u0432\u0430\u0441 \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c \u0441 \u0432\u0441\u044f\u043a\u0438\u043c\u0438 \u043c\u0435\u043b\u043a\u0438\u043c\u0438 \u043d\u043e\u0432\u0438\u043d\u043e\u0447\u043a\u0430\u043c\u0438 \u0443\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u043c\u0435\u0441\u044f\u0446\u0430. \u0417\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u043c \u0441 Symfony 7.2. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0432 <a href=\"https:\/\/t.me\/symfony_cutcode\" rel=\"noopener noreferrer nofollow\">symfony-\u0447\u0430\u0442<\/a>.<\/p>\n<h4>\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 messenger<\/h4>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 Messenger \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442\u044c <code>RecoverableMessageHandlingException<\/code> \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0412 Symfony 7.2 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u0430 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0435\u0433\u043e Retry-After \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u0442\u0432\u0435\u0442\u0430. \u0414\u0430 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0435\u0441\u043b\u0438 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 I\/O, \u0442\u043e \u043d\u0435 \u0434\u043e\u043b\u0431\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0430 \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0441 \u043d\u0435\u043a\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u0435 \u0436\u0434\u0451\u043c Circuit Breaker \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f.<\/p>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-symfony-7-2-misc-improvements-part-1#custom-message-retry-delay\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0432 Coalesce-\u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u0445<\/h4>\n<p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <code>ExpressionLanguage<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 &#171;\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u043d\u0443\u043b\u0435\u043c&#187;, \u0442.\u0435. \u044d\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 &#171;coalescence&#187;:<\/p>\n<p>( `foo ?? &#8216;no&#8217;`, `foo.baz ?? foo[&#8216;baz&#8217;] ?? &#8216;no&#8217;`, \u0438 \u0442. \u0434.).<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 PHP, \u043e\u043d \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439. \u0420\u0435\u0431\u044f\u0442\u0430 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 Symfony 7.2, \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u043d\u0443\u043b\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0435\u0434\u0435\u0442 \u0441\u0435\u0431\u044f \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 PHP.<\/p>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-symfony-7-2-misc-improvements-part-1#better-coalesce-support-in-expressions\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432 Passport \u0447\u0435\u0440\u0435\u0437 \u043b\u043e\u0433\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/h4>\n<p>\u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 &#171;login()&#187; \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e (\u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e) \u0432\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<pre><code class=\"php\">public function someAction(Security $security): Response {     \/\/ \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043b\u043e\u0433\u0438\u043d \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0444\u0430\u0439\u0440\u0432\u043e\u043b \"other_firewall\"     $security-&gt;login($user, 'form_login', 'other_firewall'); }<\/code><\/pre>\n<p>\u0412 Symfony 7.2 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 Passport:<\/p>\n<pre><code class=\"php\">$security-&gt;login($user, attributes: ['referer' =&gt; 'https:\/\/oauth.example.com']);<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-symfony-7-2-misc-improvements-part-1#passing-custom-attributes-to-passports-via-user-login\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043e\u043f\u0446\u0438\u044f &#171;calendar&#187; \u0432 &#171;DateType&#187;<\/h4>\n<p><strong>\u00a0<\/strong>PHP \u043a\u043b\u0430\u0441\u0441 <code>IntlCalendar<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0435\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 ICU, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f. \u0412 Symfony 7.2 \u0431\u044b\u043b\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043e \u043f\u043e\u043b\u0435 \u0444\u043e\u0440\u043c\u044b <code>DateType<\/code>, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044f \u0447\u0435\u0440\u0435\u0437 \u043d\u043e\u0432\u0443\u044e \u043e\u043f\u0446\u0438\u044e &#171;calendar&#187;.<\/p>\n<p>\u041f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0442\u0435\u043f\u0435\u0440\u044c \u0432 <code>DateType<\/code> \u0442\u0438\u043f \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 <code>IntlCalendar<\/code>. <strong>\u00a0<\/strong><\/p>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-symfony-7-2-misc-improvements-part-1#add-calendar-option-to-datetype\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0446\u0432\u0435\u0442\u043e\u0432 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438<\/h4>\n<p>\u0412 Symfony 4.4 \u0431\u044b\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <code>\"NO_COLOR\"<\/code> \u043a\u0430\u043a \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443 \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438. \u0412 Symfony 7.2 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 <code>\"FORCE_COLOR\"<\/code>.<\/p>\n<p>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043b\u044e\u0431\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0438 \u0442\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043a\u0430\u043a <code>\"Console\"<\/code>, <code>\"PhpUnitBridge\"<\/code>, <code>\"VarDumper\"<\/code> \u0438 \u043f\u0440\u043e\u0447., \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0446\u0432\u0435\u0442\u043e\u0432.<\/p>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-symfony-7-2-misc-improvements-part-1#force-color-in-console-output\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0432 VarDumper<\/h4>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 &#171;\u0444\u0438\u0447&#187; \u0432 PHP 8.4 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 &#171;\u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432&#187; (\u0438\u043b\u0438 &#171;\u0445\u0443\u043a\u043e\u0432&#187;) \u043f\u043e\u043c\u0438\u043c\u043e &#171;\u043f\u043e\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432&#187;, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u043d\u0435\u0435. \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e, \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435\/\u043f\u043e\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 PHP \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u043e\u0433\u0438\u043a\u0443 \u0431\u0435\u0437 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432 \u043d\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"php\">class VirtualHookedClass {     \/\/ ...     public string $fullName {         get =&gt; $this-&gt;firstName . ' ' . $this-&gt;lastName;     }      private $untypedFullName {         get =&gt; $this-&gt;firstName . ' ' . $this-&gt;lastName;     } }<\/code><\/pre>\n<p>\u0412 Symfony 7.2 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 (\u0445\u0443\u043a\u043e\u0432) \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 VarDumper \u0434\u043b\u044f \u0434\u0430\u043c\u043f\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u0418 \u0445\u043e\u0442\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0443\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e (\u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043b\u043e\u0433\u0438\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438\u00a0\u043d\u0435\u0433\u043e), \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0438\u0445 \u0438\u043c\u0435\u043d\u0430 \u0438 \u0442\u0438\u043f\u044b:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ha\/34\/gd\/ha34gdvddcljnbobw-ghgqiqdfm.png\" width=\"501\" height=\"331\" data-src=\"https:\/\/habrastorage.org\/webt\/ha\/34\/gd\/ha34gdvddcljnbobw-ghgqiqdfm.png\"\/><\/figure>\n<p>\u041f\u0440\u0438\u0437\u043d\u0430\u0442\u044c\u0441\u044f, \u044f \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u043b\u044f &#171;\u043d\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445&#187; \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u043e\u0434\u043d\u0430\u043a\u043e, \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044e \u0447\u0442\u043e \u043e\u043d\u0438 \u0442\u043e\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f, \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0432\u043e\u0434\u044f\u0442 \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u043a\u0446\u0435\u043d\u0442 \u0432 \u044d\u0442\u043e\u043c \u0430\u043d\u043e\u043d\u0441\u0435 \u0431\u044b\u043b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u0445.<\/p>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-symfony-7-2-misc-improvements-part-1#support-virtual-properties-in-vardumper\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0440\u0430\u0441\u0447\u0435\u0442\u043d\u043e\u0439 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044f<\/h4>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u0430 <code>PasswordStrength<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043e\u0441\u0442\u0438\u0433 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 &#171;\u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u0438&#187;, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0432 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435. \u0412 Symfony 7.2 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c <code>\"estimateStrength()\"<\/code> \u043c\u0435\u0442\u043e\u0434\u0430 \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u0430 \u0441 private \u043d\u0430 public. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0439 \u043d\u0430\u0434\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0435\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u043b\u0438 \u043b\u0443\u0447\u0448\u0435 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0432\u043e\u0438\u0445 \u043f\u0430\u0440\u043e\u043b\u0435\u0439.<strong>\u00a0<\/strong><\/p>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-symfony-7-2-misc-improvements-part-2#access-to-the-estimated-password-strength\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>\u0423\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u0435 \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f RequestStack<\/h4>\n<p>\u0420\u0430\u043d\u044c\u0448\u0435 \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 <code>RequestStack<\/code> \u0432 \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u0430\u0445 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043c\u0438\u043a\u0440\u043e\u043f\u043e\u0440\u0442\u044f\u043d\u043e\u0447\u043a\u0430 \u043a\u043e\u0434\u0430 \u0438\u0437 3\u0445 \u0441\u0442\u0440\u043e\u043a. \u0418 \u0445\u043e\u0442\u044f \u043e\u043d\u0430 \u043d\u0435 \u0442\u0430\u043a\u0430\u044f \u0443\u0436 \u0438 \u0441\u0442\u0440\u0430\u0448\u043d\u0430\u044f, \u043d\u043e \u044d\u0442\u043e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430.<\/p>\n<pre><code class=\"php\">$requestStack = new RequestStack(); $requestStack-&gt;push(Request::create('\/'));  $someCustomClass = new MyCustomClass($requestStack);<\/code><\/pre>\n<p>\u0412 Symfony 7.2 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b\u0438 \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 RequestStack, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0422\u0430\u043a \u0447\u0442\u043e \u043c\u0438\u043a\u0440\u043e\u043f\u043e\u0440\u0442\u044f\u043d\u043a\u0430 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u0430\u0441\u044c, \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0434\u043e 1 \u0441\u0442\u0440\u043e\u0447\u043a\u0438.<\/p>\n<pre><code class=\"php\">$someCustomClass = new MyCustomClass(     new RequestStack([ Request::create('\/') ]), );<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-symfony-7-2-misc-improvements-part-2#simpler-requeststack-unit-testing\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432 HTML Sanitizer<\/h4>\n<p>\u0412 Symfony 7.2 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u043d\u043e\u0432\u044b\u0439 <code>\"defaultAction()\"<\/code> \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <code>HtmlSanitizer<\/code>. \u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043d\u043e \u043d\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0438\u043b\u0438 \u043d\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u044b:<\/p>\n<pre><code class=\"php\">use Symfony\\Component\\HtmlSanitizer\\HtmlSanitizer; use Symfony\\Component\\HtmlSanitizer\\HtmlSanitizerAction;  $config = (new HtmlSanitizerConfig())     -&gt;defaultAction(HtmlSanitizerAction::Block)     -&gt;allowElement('p');  $sanitizer = new HtmlSanitizer($config);<\/code><\/pre>\n<p>HtmlSanitizerAction \u2014 \u044d\u0442\u043e PHP enum \u0441 \u0442\u0440\u0435\u043c\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438:\u00a0<\/p>\n<ul>\n<li>\n<p>Drop &#8212; \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438 \u0435\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b;\u00a0<\/p>\n<\/li>\n<li>\n<p>Block &#8212; \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b;\u00a0<\/p>\n<\/li>\n<li>\n<p>Allow &#8212; \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/p>\n<\/li>\n<\/ul>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-symfony-7-2-misc-improvements-part-2#default-action-in-the-html-sanitizer\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f &#171;defaultNull()&#187; \u0432 BooleanNode<\/h4>\n<p>\u041a\u0442\u043e \u043d\u0435 \u043f\u043e\u043d\u044f\u043b, \u0442\u043e \u043d\u043e\u0432\u043e\u0441\u0442\u044c \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0431\u0430\u043d\u0434\u043b\u043e\u0432. \u0410 \u0442\u043e\u0447\u043d\u0435\u0435 \u0438\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 <code>\"defaultNull()\"<\/code> \u0432 <code>BooleanNode<\/code> \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f null \u043a true. \u0422.\u0435. \u0435\u0441\u043b\u0438 \u043a\u043e\u043d\u0444\u0438\u0433 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d \u044f\u0432\u043d\u043e, \u0442\u043e \u0441\u0447\u0438\u0442\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0442.\u0435. null, \u0447\u0442\u043e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e true. \u041f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u044e, \u0442\u0430\u043a\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u0431\u044b\u043b\u0430.<\/p>\n<p>\u0412 Symfony 7.2 \u043e\u0431\u043d\u043e\u0432\u0438\u043b\u0438 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u043e\u043b\u0435\u0435 \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u043e \u0438 \u044f\u0432\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0431\u0443\u043b\u0435\u0432\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 null. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u0438\u043f \u0441 bool \u043d\u0430 boollnull.<\/p>\n<pre><code class=\"php\">-&gt;booleanNode('enabled')   -&gt;defaultNull() -&gt;end()<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-symfony-7-2-misc-improvements-part-2#allow-using-defaultnull-on-boolean-nodes\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u043e\u0441\u0442\u0438 IP-\u0430\u0434\u0440\u0435\u0441\u0430<\/h4>\n<p>\u041a\u043b\u0430\u0441\u0441 <code>IpUtils<\/code> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u043e\u0434 <code>\"anonymize()\"<\/code> \u0434\u043b\u044f \u0441\u043e\u043a\u0440\u044b\u0442\u0438\u044f \u0447\u0430\u0441\u0442\u0438 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043b\u044f \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0412 Symfony 7.2 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0434\u0432\u0430 \u043d\u043e\u0432\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u043a \u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u0442\u043e\u0434\u0443, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0439\u0442 \u043d\u0443\u0436\u043d\u043e \u0430\u043d\u043e\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"php\">$ipv4 = IpUtils::anonymize('123.234.235.236', 2); \/\/ '123.234.0.0'  $ipv6 = IpUtils::anonymize('2a01:198:603:10:396e:4789:8e99:890f', 3, 10); \/\/ '2a01:198:603::'<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-symfony-7-2-misc-improvements-part-2#better-ip-address-anonymization\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d StringNode<\/h4>\n<p>\u041f\u0440\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u0438\u043f\u043e\u0432 \u0443\u0437\u043b\u043e\u0432 \u0434\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435, \u0446\u0435\u043b\u044b\u0435, \u0447\u0438\u0441\u043b\u0430 \u0441 \u043f\u043b\u0430\u0432\u0430\u044e\u0449\u0435\u0439 \u0442\u043e\u0447\u043a\u043e\u0439, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0438 \u0442.\u0434.). \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0418\u0445 \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u043a scalar \u0443\u0437\u043b\u044b (\u0442.\u0435. <code>ScalarNode<\/code>).<\/p>\n<p>\u0412 Symfony 7.2 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u0443\u0437\u043b\u0430 \u0438 <code>\"stringNode()\"<\/code> \u043c\u0435\u0442\u043e\u0434 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u044f\u0432\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u0441\u0442\u0440\u043e\u043a\u0438:<\/p>\n<pre><code class=\"php\">$rootNode     -&gt;children()         \/\/ ...         -&gt;stringNode('username')             -&gt;defaultValue('root')         -&gt;end()         -&gt;stringNode('password')             -&gt;defaultValue('root')         -&gt;end()     -&gt;end() ;<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-symfony-7-2-misc-improvements-part-2#string-configuration-node\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f Security \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430<\/h4>\n<p>\u0412 Symfony 7.2 \u043f\u0430\u043d\u0435\u043b\u044c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 Symfony Profiler \u0431\u044b\u043b\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043d\u043e\u0432\u044b\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0431\u044b\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u200b\u200b\u0432\u043a\u043b\u0430\u0434\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432. \u0420\u0430\u043d\u0435\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441, \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b\u0438\u0441\u044c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ii\/yz\/jb\/iiyzjbsu8shbwghufi3rwkouvlk.png\" width=\"975\" height=\"150\" data-src=\"https:\/\/habrastorage.org\/webt\/ii\/yz\/jb\/iiyzjbsu8shbwghufi3rwkouvlk.png\"\/><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0432\u0438\u0434\u043d\u044b \u0432\u0441\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043c\u0435\u0447\u0435\u043d \u043a\u0430\u043a \u00ab\u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\u00bb:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/vn\/az\/x5\/vnazx5wigz2ggjmgq915yocqyko.png\" width=\"975\" height=\"150\" data-src=\"https:\/\/habrastorage.org\/webt\/vn\/az\/x5\/vnazx5wigz2ggjmgq915yocqyko.png\"\/><\/figure>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u044d\u0442\u043e\u0433\u043e, \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0430\u0439\u0440\u0432\u043e\u043b\u043b\u0430 \u0441 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0430 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0434\u0435\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0440\u0430\u043d\u0435\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043b\u043e\u0433\u0430\u0443\u0442 \u0440\u043e\u0443\u0442):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/cq\/ug\/4o\/cqug4oniiopqoochzkzc_ohusx4.png\" width=\"753\" height=\"137\" data-src=\"https:\/\/habrastorage.org\/webt\/cq\/ug\/4o\/cqug4oniiopqoochzkzc_ohusx4.png\"\/><\/figure>\n<p>\u0412\u043a\u043b\u0430\u0434\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0442\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u0430 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u0442\u043a\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.\u00a0<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043b\u0435\u043d\u0438\u0432\u044b\u043c, \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043b\u044e\u0431\u044b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u0443 <code>\"onAuthenticationFailure()\"<\/code>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/n4\/yc\/xx\/n4ycxxli5pziic4-eo8q_b0hfay.png\" width=\"972\" height=\"725\" data-src=\"https:\/\/habrastorage.org\/webt\/n4\/yc\/xx\/n4ycxxli5pziic4-eo8q_b0hfay.png\"\/><\/figure>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-symfony-7-2-misc-improvements-part-2#security-profiler-improvements\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h3>Twig<\/h3>\n<p>\u0412\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e, \u0432\u044b\u0448\u0435\u043b Twig 3.15. \u042d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0438\u043a\u0430\u043a (\u043d\u0443 \u043f\u043e\u0447\u0442\u0438) \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d \u0441 Symfony, \u043d\u043e \u0438\u0437-\u0437\u0430 \u0435\u0433\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0438 \u0433\u043b\u0443\u0431\u043e\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0432 \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u0438\u043c\u0444\u043e\u043d\u0438 &#8212; \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0431\u043e\u0439\u0442\u0438 \u043d\u043e\u0432\u0438\u043d\u043a\u0438 Twig \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439.<\/p>\n<h4>Twig: \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/h4>\n<p>\u0412 Twig \u043e\u0434\u043d\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0438\u043b\u0438 \u043c\u043d\u043e\u0433\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e `{# &#8230; #}` \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/p>\n<p>Twig 3.15 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0442\u0438\u043f \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 `# &#8230;` \u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435:<\/p>\n<pre><code class=\"php\">{{     # \u0412\u043d\u0443\u0442\u0440\u0438 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439!     \"Hello World\" | trans }}  {{   {     # \u0412\u043d\u0443\u0442\u0440\u0438 object-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439     hello: 'world', # \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0442\u0443\u0442   } | join(', ') # \u0430 \u043c\u043e\u0436\u043d\u043e \u0442\u0443\u0442 }}  {% props     # \u0434\u0430 \u0433\u0434\u0435 \u0443\u0433\u043e\u0434\u043d\u043e...     some = true,     any = null, %}<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-twig-3-15-part-1#inline-comments\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>Twig: \u0424\u0443\u043d\u043a\u0446\u0438\u044f enum<\/h4>\n<p>Twig 3.15 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, <code>enum()<\/code> \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u043c\u0438 (\u0435\u043d\u0430\u043c\u0430\u043c\u0438) \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u0445:<\/p>\n<pre><code class=\"php\">{# \u0432\u044b\u0432\u043e\u0434 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f (\u043a\u0435\u0439\u0441\u0430 \u0443 \u0435\u043d\u0430\u043c\u0430) #} {{ enum('Path\\\\To\\\\EnumClass').SomeCase.value }}  {# \u0432\u044b\u0437\u043e\u0432 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 \u0443 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f #} {{ enum('Path\\\\To\\\\EnumClass').method() }}  {# \u0432\u044b\u0432\u043e\u0434 \u0432\u0441\u0435\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f #} {% for case in enum('Path\\\\To\\\\EnumClass').cases() %}     &lt;li&gt;{{ case.value }}&lt;\/li&gt; {% endif %}<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-twig-3-15-part-1#added-an-enum-function\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>Twig: \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e &#171;xor&#187;<\/h4>\n<p>Twig 3.15 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <code>xor<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0432 true \u043a\u043e\u0433\u0434\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0435\u0433\u043e \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432 \u0440\u0430\u0432\u0435\u043d true, \u043d\u043e \u043d\u0435 \u043e\u0431\u0430.<\/p>\n<pre><code class=\"php\">{% if coupon.isValid xor user.hasLoyaltyDiscount %}     &lt;p&gt;\u041e\u0433\u043e! \u041d\u0438\u0447\u0435\u0433\u043e \u0441\u0435\u0431\u0435 \u0443 \u0432\u0430\u0441 \u0442\u0443\u0442 \u0441\u043a\u0438\u0434\u043e\u0447\u043a\u0430!&lt;\/p&gt; {% else %}     &lt;p&gt;\u041d\u0435\u0430, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0438\u043b\u0438 \u0441\u043a\u0438\u0434\u043e\u0447\u043d\u044b\u0439 \u043a\u0443\u043f\u043e\u043d, \u0438\u043b\u0438 \u0441\u043a\u0438\u0434\u043a\u0443 \u0437\u0430 \u043b\u043e\u044f\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u041e\u0431\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043d\u0435\u043b\u044c\u0437\u044f&lt;\/p&gt; {% endif %}<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-twig-3-15-part-1#support-for-xor-logical-operator\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>Twig: \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432<\/h4>\n<p>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b Twig \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 PHP, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0439 \u0432 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u042d\u0442\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0431\u044b\u043b\u0438 \u0432\u0432\u0435\u0434\u0435\u043d\u044b PHP 7.4 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u0438. \u0412 Twig 3.15 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0431\u0435\u0437 \u0441\u043a\u043e\u0431\u043e\u043a, \u0442.\u0435. \u043e\u043d\u0438 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u043e\u0447\u044c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u043e Twig 4, \u0433\u0434\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0441\u044f:<\/p>\n<pre><code class=\"php\">{# \u274c \u044d\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e #} {{ foo ?? bar ~ baz }} {# \u2705 \u043b\u0443\u0447\u0448\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a (\u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 Twig 3.x) #} {{ (foo ?? bar) ~ baz }} {# \u2705 \u0438\u043b\u0438 \u0442\u0430\u043a (\u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 Twig 4.x ) #} {{ foo ?? (bar ~ baz) }}  {# \u274c \u044d\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e #} {{ foo ~ bar + baz }} {# \u2705 \u043b\u0443\u0447\u0448\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a (\u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 Twig 3.x) #} {{ (foo ~ bar) + baz }} {# \u2705 \u0438\u043b\u0438 \u0442\u0430\u043a (\u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 Twig 4.x) #} {{ foo ~ (bar + baz) }}  {# \u274c \u044d\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e #} {{ not foo * bar }} {# \u2705 \u043b\u0443\u0447\u0448\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a (\u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 Twig 3.x) #} {{ not (foo * bar) }} {# \u2705 \u0438\u043b\u0438 \u0442\u0430\u043a (\u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 Twig 4.x) #} {{ (not foo) * bar }}<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-twig-3-15-part-1#operator-precedence-fixes\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>Twig: \u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f JSON \u0444\u0430\u0439\u043b\u043e\u0432<\/h4>\n<p>Twig \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0444\u0430\u0439\u043b\u044b \u0441 \u0438\u043c\u0435\u043d\u0435\u043c <code>template_name.js.twig<\/code>\u00a0\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442 js-\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.\u00a0<\/p>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Twig 3.15, js-\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a \u0444\u0430\u0439\u043b\u0430\u043c JSON (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>template_name.json.twig<\/code>). \u0420\u0430\u043d\u0435\u0435 \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 html-\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e, \u0447\u0442\u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0433\u043b\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438.<\/p>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-twig-3-15-part-1#automatic-escaping-strategy-for-json-files\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>Twig: \u0414\u0435\u043f\u0440\u0435\u043a\u0435\u0439\u0442 sandbox-\u0442\u0435\u0433\u0430<\/h4>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f Twig <code>sandbox<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u043a\u043e\u0434. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u043b\u043e\u0441\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e sandbox-\u0442\u0435\u0433\u0430. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Twig 3.15 \u044d\u0442\u043e\u0442 \u0442\u0435\u0433 \u0443\u0441\u0442\u0430\u0440\u0435\u043b. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c sandboxed-\u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>include()<\/code>:<\/p>\n<pre><code class=\"php\">{# \u274c \u0442\u0430\u043a \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f #} {% sandbox %}     {{ include('untrusted_template.html') }} {% endsandbox %}  {# \u2705 \u043b\u0443\u0447\u0448\u0435 \u0442\u0430\u043a #} {{ include('untrusted_template.html', sandboxed: true) }}<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-twig-3-15-part-1#deprecated-the-sandbox-tag\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>Twig: \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0434\u0435\u043f\u0440\u0435\u043a\u0435\u0439\u0442\u043e\u0432 \u0434\u043b\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/h4>\n<p>Twig \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043c\u0435\u0447\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>deprecated<\/code>\u00a0\u043e\u043f\u0446\u0438\u0438:<\/p>\n<pre><code class=\"php\">new TwigFilter('...', ..., ['deprecated' =&gt; true, 'alternative' =&gt; 'new_one']);<\/code><\/pre>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Twig 3.15, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043e\u043f\u0446\u0438\u044e <code>deprecation_info<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0430\u043d\u0438\u0438 \u0438 \u0435\u0433\u043e \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430\u0445:<\/p>\n<pre><code class=\"php\">use Twig\\DeprecatedCallableInfo;  new TwigFilter('...', ..., ['deprecation_info' =&gt; new DeprecatedCallableInfo(     'vendor\/package',  # \u0423\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 \u043f\u0430\u043a\u0435\u0442     '3.14',            # \u0423\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f     'new_one',         # \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)     'other-vendor\/some-package',  # \u041f\u0430\u043a\u0435\u0442 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)     '4.2.0'            # \u0412\u0435\u0440\u0441\u0438\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e) )])<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-twig-3-15-part-1#better-deprecation-of-twig-callables\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>Twig: \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 Twig \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438<\/h4>\n<p>\u0428\u0430\u0431\u043b\u043e\u043d\u044b Twig \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <code>try ... catch<\/code> \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u043b\u0438 \u0442\u0435\u0433\u0430 \u043f\u0435\u0440\u0435\u0434 \u0438\u0445 \u0432\u044b\u0437\u043e\u0432\u043e\u043c. \u042d\u0442\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043e\u0448\u0438\u0431\u043a\u0430\u043c \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u043f\u0430\u043a\u0435\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432 Symfony. Twig 3.15 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 <code>guard<\/code>-\u0442\u0435\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b Twig \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u0444\u0443\u043d\u043a\u0442\u043e\u0440 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. <strong>\u00a0<\/strong><\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u0430\u043a\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u043a <code>Webpack Encore<\/code>, \u0442\u0430\u043a \u0438 <code>AssetMapper<\/code>, \u0438 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0431\u043b\u043e\u043d:<\/p>\n<pre><code class=\"php\">{% if app_uses_webpack_encore %}     {{ encore_entry_link_tags('some-asset') }} {% else %}     {{ importmap('some-asset') }} {% endif %}<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0438 <code>Webpack Encore<\/code> \u0438 <code>AssetMapper<\/code>. \u0415\u0441\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 <code>encore_entry_link_tags()<\/code> \u0438\u043b\u0438 <code>importmap()<\/code>, \u0442\u043e Twig \u0443\u043f\u0430\u0434\u0451\u0442 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.<\/p>\n<p>\u0421 \u043d\u043e\u0432\u044b\u043c <code>guard<\/code>-\u0442\u0435\u0433\u043e\u043c \u0432 Twig 3.15 \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u044b. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"php\">{% guard function encore_entry_link_tags %}     {{ encore_entry_link_tags('some-asset') }} {% endguard %}  {% guard function importmap %}     {{ importmap('some-asset') }} {% endguard %}<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-twig-3-15-part-1#checking-twig-callables-at-compilation-time\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>Twig: \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f dot-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430<\/h4>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>attribute()<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u043e\u043b\u044f\u043c \u0438\u043b\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u0433\u0434\u0435 \u0438\u043c\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\/\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c.<strong>\u00a0<\/strong><\/p>\n<pre><code class=\"php\">{# \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 dot-\u043d\u043e\u0442\u0430\u0446\u0438\u0438, \u0442.\u043a. \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e fullName - \u043b\u0438\u0442\u0435\u0440\u0430\u043b #} {{ user.fullName }}  {# \u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 attribute(), \u0442.\u043a. \u0438\u043c\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 #} {% for property in ['fullName', 'email', 'phoneNumber'] %}     {{ attribute(user, property) }} &lt;br&gt; {% endfor %}<\/code><\/pre>\n<p>\u0412 Twig 3.15 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u00a0<code>attribute()<\/code> \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0430, \u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0442\u043e\u0447\u043a\u0438 \u0431\u044b\u043b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432:<\/p>\n<pre><code class=\"php\">{# \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e, \u0432\u044b\u0432\u043e\u0434\u0438\u043c\u043e\u0435 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 #} {% for property in ['fullName', 'email', 'phoneNumber'] %}     {{ user.(property) }} &lt;br&gt; {% endfor %}<\/code><\/pre>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>attribute()<\/code> \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u0430 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0439, \u043e\u043d\u0430 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u0438 \u0432 Twig 4.0, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u0438\u043c \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435\u043c dot-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"php\">{# \u0420\u0430\u043d\u0435\u0435, \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u0438 \u0432 PHP, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e constant #} {{ constant('App\\\\Some\\\\Namespace\\\\Of\\\\Some\\\\Class::CONSTANT_NAME') }}  {# \u0442\u0435\u043f\u0435\u0440\u044c \u043a \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a \u0436\u0435 \u043a\u0430\u043a \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c #} {# SHIPPING_TYPE_EXPEDITED - \u044d\u0442\u043e \u0438\u043c\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0432 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0435 \u043e\u0442 Order \u043a\u043b\u0430\u0441\u0441\u0430 #} {{ order.SHIPPING_TYPE_EXPEDITED }}<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-twig-3-15-part-2#dot-operator-improvements\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>Twig: \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/h4>\n<p>\u041c\u0430\u043a\u0440\u043e\u0441\u044b Twig \u043f\u043e\u0445\u043e\u0436\u0438 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432. \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 Twig 3.15 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0441 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c <code>argument: value<\/code>, \u043a\u0430\u043a \u0432 PHP:<\/p>\n<pre><code class=\"php\">{{ forms.field(type: 'text', name: 'user[name]') }}<\/code><\/pre>\n<p>\u0418\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e dot-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430:<\/p>\n<pre><code class=\"php\">{{ user.fullName(maxLength: 32) }}  {% for property in ['fullName', 'email', 'phoneNumber'] %}     {{ user.(property)(escape: true, maxLength: 32) }} &lt;br \/&gt; {% endfor %}<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u0438\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0435\u0437\u0434\u0435: \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0445, \u0442\u0435\u0441\u0442\u0430\u0445, \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u0445 \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0445 dot-\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-twig-3-15-part-2#named-arguments-improvements\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>\u0418\u043c\u0435\u043d\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 PHP \u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435<\/h4>\n<p>\u0420\u0430\u043d\u0435\u0435 Twig \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b \u0438\u043c\u0435\u043d\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 <code>snake_case<\/code> \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0442\u043e\u0440\u043e\u0432, \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0438\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u044b. \u0412 Twig 3.15 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0431\u043e <code>snake_case<\/code>, \u043b\u0438\u0431\u043e <code>camelCase<\/code>, \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u043e\u0439 PHP:<\/p>\n<pre><code class=\"php\">{# \u041e\u0431\u0430 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0432\u0435\u0440\u043d\u0443\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 #} {{ order.summary(include_total: true) }} {{ order.summary(includeTotal: true) }}<\/code><\/pre>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435, \u0432\u0441\u044f \u044d\u0442\u0430 Laravel-like \u043c\u0430\u0433\u0438\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u0430. \u0421\u043b\u0430\u0432\u0430 \u0423\u0438\u0446\u0438\u043b\u043e\u043f\u043e\u0442\u0447\u043b\u0438, \u0447\u0442\u043e \u043e\u043d\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430, \u043e\u0434\u0438\u043d \u0432 <code>camelCase<\/code>, \u0434\u0440\u0443\u0433\u043e\u0439 \u0432 <code>snake_case<\/code>. \u041f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u043a\u0435\u0439\u0441 \u0432\u0440\u044f\u0434 \u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u043d\u043e \u043a\u0430\u043a \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0438\u043c\u0451\u043d \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0437\u0430\u0433\u0430\u0434\u043a\u043e\u0439.<\/p>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-twig-3-15-part-2#free-form-php-callable-argument-names\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>Twig: \u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432<\/h4>\n<p>\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <code>`...`<\/code> (\u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438, spread, variadic, \u043f\u0440\u043e\u0447.) \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<strong>\u00a0<\/strong><\/p>\n<pre><code class=\"php\">{% set attr = [{type: 'submit'}, {class: 'btn btn-primary'}, {'data-tracking-id', '12345'}] %}  {{ html_attributes(...attr) }}<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-twig-3-15-part-2#argument-unpacking\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<h4>Twig: \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/h4>\n<p>\u0421\u0442\u0440\u0435\u043b\u043e\u0447\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043b\u044e\u0431\u0438\u043c\u044b\u0435 \u043c\u043d\u043e\u0433\u0438\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438, \u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0432 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0445 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u0445, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0435\u0437\u0434\u0435. \u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0442\u0435\u0441\u0442\u0430\u0445, \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432:<\/p>\n<pre><code class=\"php\">{% set people = [     {first: \"\u0414\u0430\u043d\u0438\u043b\", last: \"\u0418\u0432\u0430\u043d\u043e\u0432\u0438\u0447\"},     {first: \"\u0414\u0430\u043d\u0438\u0441\u043b\u0430\u0432\", last: \"\u0418\u0432\u0430\u043d\u044b\u0447\"},     {first: \"\u0414\u0435\u044f\u043d\u0438\u0440\", last: \"\u0412\u0430\u043d-\u043a\u043b\u043e\u0434\u044b\u0447\"}, ] %}  {# \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043c\u0430\u043a\u0440\u043e\u0441 #} {{ _self.display_people_names(people, (person) =&gt; person.first) }}<\/code><\/pre>\n<p>\u0410 \u0435\u0449\u0451 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"php\">{# \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0435\u0435 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 #} {% set first_name_fn = (p) =&gt; p.first %}  {{ _self.display_people_names(people, first_name_fn) }}<\/code><\/pre>\n<blockquote>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a href=\"https:\/\/symfony.com\/blog\/new-in-twig-3-15-part-2#arrow-functions-in-all-twig-callables\" rel=\"noopener noreferrer nofollow\">symfony.com<\/a><\/p>\n<\/blockquote>\n<p>\u0412\u0438\u0434\u0435\u043e \u0432\u0435\u0440\u0441\u0438\u044f \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442\u0430:\u00a0<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/6778fa3e1234a3d79a40653d\" data-style=\"\" id=\"6778fa3e1234a3d79a40653d\" width=\"\"><\/div>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/871542\/\"> https:\/\/habr.com\/ru\/articles\/871542\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u0421\u0435\u0440\u0433\u0435\u0439 \u041f\u0430\u043d\u0442\u0435\u043b\u0435\u0435\u0432, \u041a\u0438\u0440\u0438\u043b\u043b \u041d\u0435\u0441\u043c\u0435\u044f\u043d\u043e\u0432 \u0438 \u0414\u0430\u043d\u0438\u043b \u0429\u0443\u0446\u043a\u0438\u0439 \u0441\u043e\u0431\u0440\u0430\u043b\u0438 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u0437\u0430 \u0434\u0435\u043a\u0430\u0431\u0440\u044c \u0432 PHP, Symfony \u0438 Laravel (\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e). \u0412\u0441\u0451 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0431\u044b\u0442\u044c \u0432 \u0442\u0435\u043c\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e, \u044d\u0442\u043e\u0442 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0432\u0430\u0441. \ud83d\ude80<\/p>\n<h3>\u041d\u043e\u0432\u043e\u0441\u0442\u0438 PHP \u0441 \u0421\u0435\u0440\u0433\u0435\u0435\u043c \u041f\u0430\u043d\u0442\u0435\u043b\u0435\u0435\u0432\u044b\u043c<\/h3>\n<h4>\u0412\u044b\u0448\u043b\u0438 PHP 8.2.27, PHP 8.3.15 \u0438 PHP 8.4.2<\/h4>\n<p>\u0412\u044b\u043f\u0443\u0441\u043a\u0438 \u0441 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043e\u0448\u0438\u0431\u043e\u043a \u0432\u044b\u0448\u043b\u0438 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e. \u041a\u0441\u0442\u0430\u0442\u0438, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430, \u0440\u0435\u043b\u0438\u0437\u044b \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u044b \u043d\u0430 GitHub, \u0440\u0430\u043d\u044c\u0448\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0433\u0438.\u00a0 \u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0440\u0435\u043b\u0438\u0437-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0434\u0430\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u044c \u043b\u044e\u0434\u044f\u043c, \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0433\u0430 \u2013 \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0440\u0435\u043b\u0438\u0437, \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0430\u0443\u043a\u0430\u043b\u043e\u0441\u044c, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u0440\u0435\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043c\u0430\u043b\u043e\u0439 \u043a\u0440\u043e\u0432\u044c\u044e. \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0435 \u0432 \u043a\u0443\u0440\u0441\u0435, \u0441\u0431\u043e\u0440\u043a\u0438 \u0430\u0440\u0445\u0438\u0432\u043e\u0432 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0433\u043e\u0432 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0432\u0442\u043e\u0440\u043d\u0438\u043a\u0430\u043c, \u0430 \u0430\u043d\u043e\u043d\u0441 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u2013 \u043f\u043e \u0447\u0435\u0442\u0432\u0435\u0440\u0433\u0430\u043c. \u0414\u0432\u0430 \u0434\u043d\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0441\u0431\u043e\u0440\u043e\u043a \u043f\u043e\u0434 Windows \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438.\u00a0\u0414\u043e \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u043e\u0441\u0442\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 php.net \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0440\u0430\u0441\u0441\u044b\u043b\u043e\u043a, \u0440\u0435\u043b\u0438\u0437 \u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u043c \u0438 \u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0442\u0435\u0433 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442.<\/p>\n<h4>\u26a0\ufe0f\u0417\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0430\u0441\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 PHP 8.2<\/h4>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u044d\u0442\u043e\u0433\u043e \u0433\u043e\u0434\u0430, \u0432\u0435\u0440\u0441\u0438\u0438 PHP \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u043b\u0435\u0442: 2 \u0433\u043e\u0434\u0430 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 2 \u0433\u043e\u0434\u0430 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 PHP 8.1 \u043f\u0440\u043e\u0434\u043b\u0435\u043d\u0430 \u0434\u043e 31 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2025, \u0430 PHP 8.2 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e 31 \u0434\u0435\u043a\u0430\u0431\u0440\u044f 2026 \u0433\u043e\u0434\u0430. PHP 8.2.27 \u0441\u0442\u0430\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0432\u044b\u043f\u0443\u0441\u043a\u043e\u043c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0438 \u0441\u0431\u043e\u0440\u043a\u0443 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430 \u044f \u0440\u0435\u0448\u0438\u043b <a href=\"https:\/\/youtu.be\/mBbOCi9oeHA\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0430 \u0432\u0438\u0434\u0435\u043e<\/a>, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0435\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<h4>\u00ab\u0421\u0432\u043e\u044f \u0438\u0433\u0440\u0430\u00bb \u043f\u043e PHP. \u0424\u0438\u043d\u0430\u043b<\/h4>\n<p>\u0421\u043e\u0441\u0442\u043e\u044f\u043b\u0430\u0441\u044c <a href=\"https:\/\/youtube.com\/live\/6zbliSDrgCg\" rel=\"noopener noreferrer nofollow\">\u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u0433\u0440\u0430 \u044d\u0442\u043e\u0433\u043e \u0433\u043e\u0434\u0430<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0448\u043b\u0438\u0441\u044c \u041a\u0438\u0440\u0438\u043b\u043b \u041d\u0435\u0441\u043c\u0435\u044f\u043d\u043e\u0432, \u0410\u043b\u0435\u043a\u0441\u0435\u0439 \u0413\u0430\u0433\u0430\u0440\u0438\u043d \u0438 \u041f\u0430\u0432\u0435\u043b \u0411\u0443\u0447\u043d\u0435\u0432. \u0412 2025 \u0433\u043e\u0434\u0443 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u0430, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u043a\u0430\u043a\u0438\u0445 \u0433\u043e\u0441\u0442\u0435\u0439 \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043a\u0430\u043d\u0430\u043b\u0435, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b \u0438 \u0441\u0430\u043c\u0438 \u043d\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 \u043f\u0440\u0438\u043d\u044f\u0442\u044c \u0443\u0447\u0430\u0441\u0442\u0438\u0435 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0438\u0433\u0440? \u2013 \u0414\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u0441\u0432\u043e\u0438\u043c\u0438 \u043c\u044b\u0441\u043b\u044f\u043c\u0438, \u043c\u044b \u0447\u0438\u0442\u0430\u0435\u043c \u0438 \u043f\u0440\u0438\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044e.<\/p>\n<h4>PHP Russia 2024<\/h4>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u0434\u0435\u043a\u0430\u0431\u0440\u044f \u0432 \u041c\u043e\u0441\u043a\u0432\u0435 \u043f\u0440\u043e\u0448\u043b\u0430 \u043f\u044f\u0442\u0430\u044f \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044f PHP Russia. \u041c\u043d\u043e\u0433\u0438\u0435 \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0432\u043e\u0438 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u044f \u043e\u0442 \u043f\u043e\u0435\u0437\u0434\u043a\u0438, \u0437\u0430\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b\u044b <a href=\"https:\/\/t.me\/cutcode\" rel=\"noopener noreferrer nofollow\">\u0414\u0430\u043d\u0438\u043b\u0430<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/t.me\/sergei_predvoditelev\" rel=\"noopener noreferrer nofollow\">\u0421\u0435\u0440\u0433\u0435\u044f \u041f\u0440\u0435\u0434\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0432\u0430<\/a>. \u0412\u0430\u043b\u0435\u043d\u0442\u0438\u043d \u0423\u0434\u0430\u043b\u044c\u0446\u043e\u0432 \u0432\u0437\u044f\u043b \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u0443 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0430\u043d\u0433\u043b\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u043a\u0435\u0440\u0430 \u0418\u043e\u0430\u043d\u043d\u0438\u0441\u0430 \u041b\u0443\u043a\u0435\u0440\u0438\u0441\u0430, <a href=\"https:\/\/youtu.be\/rycC75QpIPY\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435<\/a>, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b\u0438.<\/p>\n<p>\u041c\u044b, \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 CutCode, \u0442\u0430\u043a\u0436\u0435 \u0432\u0437\u044f\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0432\u044c\u044e \u0443 \u0441\u043f\u0438\u043a\u0435\u0440\u043e\u0432 \u0438 \u0433\u043e\u0441\u0442\u0435\u0439, <a href=\"https:\/\/youtu.be\/wxp4iDfNrgo\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430\u0448 \u043e\u0442\u0447\u0435\u0442 \u043e \u043f\u043e\u0435\u0437\u0434\u043a\u0435<\/a> \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0435 CutCode \u0438 \u0437\u0430\u0433\u043b\u044f\u043d\u0438\u0442\u0435 <a href=\"https:\/\/t.me\/php_fart\/149\" rel=\"noopener noreferrer nofollow\">\u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c-\u043a\u0430\u043d\u0430\u043b Fart Time<\/a>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b!<\/p>\n<p>\u041e\u0442 \u0441\u0435\u0431\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044e, \u0447\u0442\u043e \u0440\u0430\u0434 \u0431\u044b\u043b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043c\u043d\u043e\u0433\u0438\u0445, \u0441 \u043a\u0435\u043c \u0440\u0430\u043d\u044c\u0448\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0441\u0442\u0440\u0438\u043c\u0430\u0445 \u0438 \u043d\u0430 GitHub, \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c\u0441\u044f \u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0433\u043e\u0434\u0443 \ud83d\ude42<\/p>\n<h4>\u0412\u044b\u0448\u0435\u043b Rector 2.0<\/h4>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430 \u2013 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0437\u0430 \u0441\u0447\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439:<\/p>\n<ul>\n<li>\n<p>php-parser 4.x \u0434\u043e 5.0<\/p>\n<\/li>\n<li>\n<p>PHPStan 1.x \u0434\u043e 2.0<\/p>\n<\/li>\n<li>\n<p>\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f PHP 7.4<\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0431\u0435\u0437 \u043d\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439: \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0444\u043b\u0430\u0433 <code>--only<\/code> \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 Behat \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430.<\/p>\n<h4>\u0412\u044b\u0448\u043b\u0430 Laravel Nova 5<\/h4>\n<p>\u0412 \u043f\u044f\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0430\u0434\u043c\u0438\u043d\u043a\u0438 \u043e\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Laravel \u043c\u043e\u0434\u0435\u0440\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 (Inertia 2, PHP 8.1+, Laravel 10+), \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u0430\u043d\u0435\u043b\u0438 \u0432\u043a\u043b\u0430\u0434\u043e\u043a \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u043b\u0435\u0439.<\/p>\n<p>\u0415\u0449\u0435 \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c \u0438 Nova \u0434\u043e\u0433\u043e\u043d\u0438\u0442 <a href=\"https:\/\/moonshine-laravel.com\/\" rel=\"noopener noreferrer nofollow\">MoonShine<\/a>, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u0441\u0442\u0430\u0442\u0438, \u043d\u0430 \u0434\u043d\u044f\u0445 \u0442\u0430\u043a \u0436\u0435 \u0432\u044b\u0448\u043b\u0430 \u043c\u0430\u0436\u043e\u0440\u043d\u0430\u044f \u0442\u0440\u0435\u0442\u044c\u044f \u0432\u0435\u0440\u0441\u0438\u044f. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 <a href=\"https:\/\/www.youtube.com\/live\/LpEEZ-qb8jQ\" rel=\"noopener noreferrer nofollow\">\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044e \u0440\u0435\u043b\u0438\u0437\u0430<\/a>, \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043b\u0438.<\/p>\n<h3>PHP Core<\/h3>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043d\u043e\u0432\u043e\u0441\u0442\u0435\u0439 \u044f\u0434\u0440\u0430 PHP \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0441\u0432\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0435\u0440\u0438\u0438\u00a0<a href=\"https:\/\/thephp.foundation\/blog\/tag\/roundup\/\" rel=\"noopener noreferrer nofollow\">PHP Core Roundup<\/a> \u043e\u0442 PHP Foundation, \u043c\u044b \u043b\u0438\u0448\u044c \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e \u043d\u0438\u043c \u043f\u0440\u043e\u0431\u0435\u0436\u0438\u043c\u0441\u044f:<\/p>\n<h4>\ud83d\udcca RFC: Attributes on Constants<\/h4>\n<p>\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0431\u044b\u043b\u0438 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432\u00a0<a href=\"https:\/\/wiki.php.net\/rfc\/attributes_v2\" rel=\"noopener noreferrer nofollow\">RFC: Attributes v2<\/a>. Daniel Scherzer \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0432\u043d\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438.<\/p>\n<p>\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0433\u043e \u0441\u043b\u043e\u0432\u0430\u00a0<code>const<\/code>, \u0430 \u043d\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>define<\/code>. \u0413\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430 RFC \u043f\u0440\u043e\u0434\u043b\u0438\u0442\u0441\u044f \u0434\u043e 6 \u044f\u043d\u0432\u0430\u0440\u044f, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, RFC \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043d\u044f\u0442.<\/p>\n<pre><code class=\"php\">\/\/ \u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e #[\\MyAttribute] const Example1 = 1;  \/\/ \u0410 \u0442\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f #[\\MyAttribute] const Example2 = 2,       Example3 = 3;<\/code><\/pre>\n<h4>\ud83d\udcca\u00a0RFC: Error Backtraces v2<\/h4>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u0448\u0438\u0431\u043a\u0438 PHP \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0445 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043e\u043a, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442\u044c \u0432\u044b\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0438\u0445 \u043f\u0440\u0438\u0447\u0438\u043d\u044b. Eric Norris \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443, <code>E_FATAL_ERRORS<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0435 \u0442\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0434\u043b\u044f \u0444\u0430\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a. \u0413\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430 RFC \u043f\u0440\u043e\u0434\u043b\u0438\u0442\u0441\u044f \u0434\u043e 10 \u044f\u043d\u0432\u0430\u0440\u044f.<\/p>\n<h4>\ud83d\udce3RFC: Asymmetric Visibility for Static Properties<\/h4>\n<p>\u0412 RFC <a href=\"https:\/\/wiki.php.net\/rfc\/asymmetric-visibility-v2\" rel=\"noopener noreferrer nofollow\">Asymmetric Visibility v2<\/a> \u0434\u043b\u044f PHP 8.4 \u0431\u044b\u043b\u0430 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043e\u043f\u0443\u0449\u0435\u043d\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0430\u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u043e\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432. \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, \u0443\u0436\u0435 \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0432\u0448\u0430\u044f\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 Ilija Tovilo \u0438 Larry Garfield \u043f\u0440\u043e\u0432\u0435\u043b\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u043e\u0441\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0430\u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u0443\u044e \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432, \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0442\u044b \u043a\u0430\u0440\u0442\u0438\u043d\u044b.<\/p>\n<pre><code class=\"php\">class Example {     public private(set) static string $classTitle = 'Example class';      \/\/ Implicitly public-read, just like object properties.     protected(set) static int $counter = 0;      public static function changeName(string $name): void     {         \/\/ From private scope, so this is allowed.         self::$classTitle = $name;     } }  print Example::$classTitle; \/\/ \u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e.  Example::$classTitle = 'Nope'; \/\/ \u0410 \u0442\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f. <\/code><\/pre>\n<h4>\u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u0435\u0436\u0435\u0433\u043e\u0434\u043d\u044b\u0439 \u043e\u043f\u0440\u043e\u0441 \u043f\u043e PHP!<\/h4>\n<p>\u0412\u0441\u0435 \u0435\u0449\u0451 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u0435\u0436\u0435\u0433\u043e\u0434\u043d\u043e\u043c \u043e\u043f\u0440\u043e\u0441\u0435 \u043f\u043e PHP, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0430 \u0447\u0435\u043c \u043c\u044b \u043f\u0438\u0448\u0435\u043c, \u0447\u0435\u043c \u0436\u0438\u0432\u0435\u043c \u0438 \u043a\u0443\u0434\u0430 \u0434\u0432\u0438\u0436\u0435\u043c\u0441\u044f! \u0412 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u0441\u0438\u043b\u0430\u043c\u0438 CutCode \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0430\u043c\u044b\u0435 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0432\u043c\u0435\u0441\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435 PHP \u0432 2024 \u0433\u043e\u0434\u0443. \u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443 1120 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u043d\u0430 \u043a\u0430\u043a\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 PHP \u0441\u0438\u0434\u044f\u0442, \u043a\u0430\u043a\u0438\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u043b\u044e\u0431\u044f\u0442 \u0438 \u043a\u0430\u043a \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0418\u0418. \u0412 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u043f\u0440\u043e\u0441\u0435\u0449\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435! \u0412\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435, \u043d\u043e\u0432\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0438 \u0434\u0430\u0436\u0435 \u043f\u0430\u0440\u0443 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u043c. \u041e\u043f\u0440\u043e\u0441 \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0439. \u041d\u043e \u043a\u0442\u043e \u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0441\u0432\u043e\u0439 email \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u0440\u043e\u0437\u044b\u0433\u0440\u044b\u0448\u0435 \u0441\u043b\u043e\u043d\u0430. \u0410 \u0448\u0430\u043d\u0441 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0435\u0441\u0442\u044c \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e! \u041f\u0440\u043e\u0439\u0434\u0438\u0442\u0435 \u043e\u043f\u0440\u043e\u0441 \u0438 \u043f\u043e\u043c\u043e\u0433\u0438\u0442\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0440\u0435\u0437 \u043f\u043e \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0439 PHP-\u0442\u0443\u0441\u043e\u0432\u043a\u0435! \u041f\u043e \u0438\u0442\u043e\u0433\u0430\u043c \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u0434\u0431\u043e\u0440\u043a\u0438 \u0441\u0442\u0430\u0442\u0435\u0439, \u0434\u043e\u043a\u043b\u0430\u0434\u043e\u0432, \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u043f\u043e PHP. \u0412\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u043c \u043d\u0430 <a href=\"https:\/\/phpcommunity.ru\" rel=\"noopener noreferrer nofollow\">phpcommunity.ru<\/a> \u0438 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0430 \u00ab\u0425\u0430\u0431\u0440\u0435\u00bb.<\/p>\n<p><a href=\"https:\/\/docs.google.com\/forms\/d\/e\/1FAIpQLSdHxQ8jPapOz6YDsGViqc1x6agJuzx2RxIjskxNcdiPM82_tA\/viewform\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u043f\u0440\u043e\u0441<\/a><\/p>\n<h4>PHP-\u0441\u043b\u043e\u043d\u044b<\/h4>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0443\u0441\u043f\u0435\u043b\u0438 \u043a\u0443\u043f\u0438\u0442\u044c PHP-\u0441\u043b\u043e\u043d\u0430 \u0441\u043e \u0441\u043a\u0438\u0434\u043a\u043e\u0439 \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u043c \u0433\u043e\u0434\u0443, \u0442\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0439\u0442\u0435, \u0432\u0441\u0435 \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434\u044b \u0432 2025 \u0433\u043e\u0434\u0443 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0412\u043f\u0435\u0440\u0435\u0434\u0438 \u0435\u0449\u0435 \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0430\u0437\u0434\u043d\u0438\u043a\u043e\u0432, \u0438 PHP-\u0441\u043b\u043e\u043d\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u043c \u043f\u043e\u0434\u0430\u0440\u043a\u043e\u043c \u0441\u0435\u0431\u0435 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0443. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442 <a href=\"http:\/\/elephpants.ru\/?ref=cutcode\" rel=\"noopener noreferrer nofollow\">elephpants.ru<\/a> \u0438 \u0432\u0432\u043e\u0434\u0438\u0442\u0435 \u043f\u0440\u043e\u043c\u043e\u043a\u043e\u0434 <code>CutCode<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043b\u043e\u043d\u0438\u043a\u0430 \u0441\u043e \u0441\u043a\u0438\u0434\u043a\u043e\u0439.<\/p>\n<h3>Laravel \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u0441 \u0414\u0430\u043d\u0438\u043b\u043e\u043c \u0429\u0443\u0446\u043a\u0438\u043c<\/h3>\n<h4>11.34 Add Number::spellOrdinal() to spell ordinals as words.\u00a0<\/h4>\n<p><a href=\"https:\/\/github.com\/laravel\/framework\/pull\/53661\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/laravel\/framework\/pull\/53661<\/a><\/p>\n<p>Joel Stein \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043c\u0435\u0442\u043e\u0434 <code>spellOrdinal()<\/code> \u0432 \u0445\u0435\u043b\u043f\u0435\u0440 <code>Number<\/code>, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0435 \u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430\u043c\u0438.<\/p>\n<pre><code class=\"php\">'The ' . Number::spellOrdinal(40) . ' president of the United States is Ronald Reagan';<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c integer, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0447\u0438\u0441\u043b\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u044c\u044e.\u00a0<\/p>\n<h4>11.34 Add shorthands for fake HTTP responses<\/h4>\n<p><a href=\"https:\/\/github.com\/laravel\/framework\/pull\/53663\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/laravel\/framework\/pull\/53663<\/a><\/p>\n<p>Jason McCreary \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0441\u043e\u043a\u0440\u0430\u0449\u0451\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 HTTP-\u043e\u0442\u0432\u0435\u0442\u043e\u0432 &#8212;\u00a0 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0442\u043e\u0434 <code>fake<\/code>. \u0414\u043e \u0432\u0435\u0440\u0441\u0438\u0438 11.34 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u043a\u0440\u0430\u0449\u0451\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u043d\u043e \u044d\u0442\u043e\u0442 PR \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0435\u043b\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 \u0438\u043b\u0438 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0443\u0441-\u043a\u043e\u0434\u0430.<\/p>\n<pre><code class=\"php\">\/\/ \u0414\u043e Http::fake([    'google.com' =&gt; Http::response('Hello World'),    'github.com' =&gt; Http::response(['foo' =&gt; 'bar']),    'forge.laravel.com' =&gt; Http::response(status: 204), ]);  \/\/ \u041f\u043e\u0441\u043b\u0435 Http::fake([    'google.com' =&gt; 'Hello World',    'github.com' =&gt; ['foo' =&gt; 'bar'],    'forge.laravel.com' =&gt; 204, ]);<\/code><\/pre>\n<h4>11.34 Add Request::fluent method<\/h4>\n<p><a href=\"https:\/\/github.com\/laravel\/framework\/pull\/53662\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/laravel\/framework\/pull\/53662<\/a><\/p>\n<p>\u0421\u0442\u0438\u0432 \u0411\u0430\u0443\u043c\u0430\u043d \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043c\u0435\u0442\u043e\u0434 <code>fluent()<\/code> \u0432 \u043a\u043b\u0430\u0441\u0441 HTTP Request, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432.<\/p>\n<pre><code class=\"php\">\/** @var Illuminate\\Http\\Request $request *\/ $data = $request-&gt;fluent(); $data-&gt;title; $data-&gt;body; \/\/ etc.<\/code><\/pre>\n<h4>11.35 URI<\/h4>\n<p><a href=\"https:\/\/github.com\/laravel\/framework\/pull\/53731\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/laravel\/framework\/pull\/53731<\/a><\/p>\n<p>\u0410\u0432\u0442\u043e\u0440 \u044d\u0442\u043e\u0433\u043e PR \u0441\u0430\u043c Taylor. \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b Uri \u2014 \u043a\u043b\u0430\u0441\u0441, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 URI \u043e\u0442 PHP League. Uri \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 URI \u0432 \u0432\u0430\u0448\u0435\u043c Laravel-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430\u043c\u0438.<\/p>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0430 Uri \u2014 \u044d\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 URI, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u043f\u0443\u0442\u044f\u043c\u0438. \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e support \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u0442\u0440\u043e\u0438\u0442\u044c URL, Path, Fragment \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c <code>scheme()<\/code>, <code>host()<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435:<\/p>\n<pre><code class=\"php\">use Illuminate\\Support\\Uri;  $uri = Uri::of('https:\/\/moonshine-laravel.com')    -&gt;withPath('links')    -&gt;withQuery(['page' =&gt; 2])    -&gt;withFragment('new');  (string) $url; \/\/ https:\/\/moonshine-laravel.com\/links?page=2#new  $uri-&gt;path(); \/\/ links $uri-&gt;scheme(); \/\/ https $uri-&gt;port(); \/\/ null $uri-&gt;host(); \/\/ moonshine-laravel.com<\/code><\/pre>\n<h4>11.35 Allow sorting routes by precedence in artisan routes:list.<\/h4>\n<p><a href=\"https:\/\/github.com\/laravel\/framework\/pull\/53706\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/laravel\/framework\/pull\/53706<\/a><\/p>\n<p>PR \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0441 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0441\u043f\u0438\u0441\u043a\u0430 \u0440\u043e\u0443\u0442\u043e\u0432. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e URI. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043b\u0435\u0433\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043d\u0430\u0434 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430).<\/p>\n<p>\u0418 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0440\u043e\u0443\u0442\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b, \u0430 \u043f\u043e\u043d\u044f\u0442\u044c \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e &#8212; \u0441\u043b\u043e\u0436\u043d\u043e. \u042d\u0442\u043e\u0442 pull request \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u043f\u0446\u0438\u044e <code>--sort=precedence<\/code>. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u0443\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043d\u0435 \u043f\u043e URI, \u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u043e\u043d\u0438 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u044b. \u0422\u0435\u043c \u0441\u0430\u043c\u044b\u043c, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c.\u00a0<\/p>\n<h4>11.36 Uri and UriQueryString implement Stringable<\/h4>\n<p><a href=\"https:\/\/github.com\/laravel\/framework\/pull\/53873\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/laravel\/framework\/pull\/53873<\/a><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0441 \u043d\u043e\u0432\u044b\u043c support \u043a\u043b\u0430\u0441\u0441\u043e\u043c URI \u043e\u0442 Taylor. \u042d\u0442\u043e\u0442 PR \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code>Stringable<\/code>, \u0441\u0442\u0440\u0430\u043d\u043d\u043e \u0447\u0442\u043e Taylor \u0441\u0440\u0430\u0437\u0443 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b, \u043d\u043e \u0432 \u043e\u0431\u0449\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.<\/p>\n<h4>11.36 Add new Uri class to default, global aliases<\/h4>\n<p><a href=\"https:\/\/github.com\/laravel\/framework\/pull\/53884\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/laravel\/framework\/pull\/53884<\/a><\/p>\n<p>\u042d\u0442\u043e\u0442 PR \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f URI &#8212; \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 alias \u043f\u043e\u0434 \u043d\u0435\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0431\u043b\u0435\u0439\u0434\u0430\u0445 \u0438 \u0433\u0434\u0435 \u0443\u0433\u043e\u0434\u043d\u043e \u0431\u0435\u0437 \u0438\u043c\u043f\u043e\u0440\u0442\u0430.\u00a0<\/p>\n<h3>Symfony \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u0441 \u041a\u0438\u0440\u0438\u043b\u043b\u043e\u043c \u041d\u0435\u0441\u043c\u0435\u044f\u043d\u043e\u0432\u044b\u043c<\/h3>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0441\u0438\u043c\u0444\u043e\u043d\u044f\u0448\u043a\u0438!<\/p>\n<p>\u042d\u0442\u043e \u0441\u043d\u043e\u0432\u0430 \u044f, \u041a\u0438\u0440\u0438\u043b\u043b \u041d\u0435\u0441\u043c\u0435\u044f\u043d\u043e\u0432. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e \u0432\u0430\u0441 \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c \u0441 \u0432\u0441\u044f\u043a\u0438\u043c\u0438 \u043c\u0435\u043b\u043a\u0438\u043c\u0438 \u043d\u043e\u0432\u0438\u043d\u043e\u0447\u043a\u0430\u043c\u0438 \u0443\u0448\u0435\u0434\u0448\u0435\u0433\u043e \u043c\u0435\u0441\u044f\u0446\u0430. \u0417\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u043c \u0441 Symfony 7.2. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u0432 <a href=\"https:\/\/t.me\/symfony_cutcode\" rel=\"noopener noreferrer nofollow\">symfony-\u0447\u0430\u0442<\/a>.<\/p>\n<h4>\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0439<\/h><\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-444113","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/444113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=444113"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/444113\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=444113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=444113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=444113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}