<!DOCTYPE html>
<html class="h-100" data-bs-theme="light" data-mantine-color-scheme="light" lang="ru" prefix="og: https://ogp.me/ns#">
<head>
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta content="IE=Edge" http-equiv="X-UA-Compatible">
<link crossorigin="true" href="https://cdn.hexlet.io" rel="preconnect">
<link href="https://mc.yandex.ru" rel="preconnect">
<meta content="aa2vrdtq64dub8knuf83lwywit311w" name="facebook-domain-verification">
<link href="/favicon.ico" rel="icon" sizes="any">
<link href="/favicon.svg" rel="icon" type="image/svg+xml">
<link href="/apple-touch-icon.png" rel="apple-touch-icon">
<link href="/manifest.webmanifest" rel="manifest">
<script>
//<![CDATA[
window.gon={};gon.ym_counter="25559621";gon.is_bot=true;gon.applications={};gon.current_user={"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26 18:37:19 UTC","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false};gon.token="DiXI6tnztEDD7AtUCuJse7i9s6WfePBaKHZg5kYHYdPh9APdK40ZIHWvL8wG7ZwMeLSeD5dPDviVlvqyFACGvQ";gon.locale="ru";gon.language="ru";gon.theme="light";gon.rails_env="production";gon.mobile=false;gon.google={"analytics_key":"UA-1360700-51","optimize_key":"GTM-5QDVFPF"};gon.captcha={"google_v3_site_key":"6LenGbgZAAAAAM7HbrDbn5JlizCSzPcS767c9vaY","yandex_site_key":"ysc1_Vyob5ZPPUdPBsu0ykt8bVFdzsfpoVjQChLGl2b4g19647a89","verification_failed":null};gon.social_signin=false;gon.typoreporter_google_form_id="1FAIpQLSeibfGq-KvWQ2Fyru-zkFFRVTLBuzXAHAoEyN1p49FtDmNoNA";
//]]>
</script>
<meta charset="utf-8">
<title>Микрофреймворки | Ключевые аспекты веб-разработки на PHP</title>
<meta name="description" content="Микрофреймворки / Ключевые аспекты веб-разработки на PHP: Рассматриваем идею микрофреймворков">
<link rel="canonical" href="https://ru.hexlet.io/courses/php-overview-of-web-development/lessons/microframework/theory_unit">
<meta name="robots" content="noarchive">
<meta property="og:title" content="Микрофреймворки">
<meta property="og:title" content="Ключевые аспекты веб-разработки на PHP">
<meta property="og:description" content="Микрофреймворки / Ключевые аспекты веб-разработки на PHP: Рассматриваем идею микрофреймворков">
<meta property="og:url" content="https://ru.hexlet.io/courses/php-overview-of-web-development/lessons/microframework/theory_unit">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="2v6ZDYm55Empf6KmJ0BaIjXa7XFRXvXz4le6OABZWDI1L1I6e8dJKR88hj4rT6pV9dPA21lpC1FftyBsUl6_XA" />
<script src="/vite/assets/inertia-DfXos102.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/preload-helper-BJ4cLWpC.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ahoy-DrlRQ-1D.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/analytics-cb8xch9l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Surface-DL2bpZA-.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/extends-C-EagtpE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/inheritsLoose-BBd-DCVI.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/objectWithoutPropertiesLoose-DRHXDhjp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/index.esm-DAqKOkZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Button-CGPUux8l.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/CloseButton-D1euiPao.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Group-BX48WcuU.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Loader-BQEY8g6v.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Modal-Cy3HByv7.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/OptionalPortal-1Hza5P2w.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Stack-CtjJzfw4.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Textarea-Ck64llAy.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/DirectionProvider-Dc9zdUke.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/events-DJQOhap0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-reduced-motion-D2owz4wa.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-disclosure-zKtK5W1r.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/use-hotkeys-Cnc_Rwkb.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/random-id-DOQyszCZ.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/exports-C_MrNx_T.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<link rel="stylesheet" href="/vite/assets/application-BqhCP46M.js" />
<script src="/vite/assets/application-Df9RExpe.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/autocomplete-VMNbxKGl.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/createPopper-C3aM9r1M.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/js.cookie-D1-O8zkX.js" as="script" crossorigin="anonymous"><link rel="stylesheet" href="/vite/assets/application-C8HjmMaq.css" media="screen" />
<script>
window.ym = function(){(ym.a=ym.a||[]).push(arguments)};
window.addEventListener('load', function() {
setTimeout(function() {
ym.l = 1*new Date();
ym(window.gon.ym_counter, "init", {
clickmap: true,
trackLinks: true,
accurateTrackBounce: true,
webvisor: true
});
// Загружаем скрипт
var k = document.createElement('script');
k.async = 1;
k.src = 'https://mc.yandex.ru/metrika/tag.js';
document.head.appendChild(k);
ym(window.gon.ym_counter, 'getClientID', function(clientID) {
window.ymClientId = clientID;
});
}, 1500);
});
</script>
<!-- Google Tag Manager - deferred -->
<script>
// dataLayer stub сразу — пуши работают до загрузки скрипта
window.dataLayer = window.dataLayer || [];
// Сам скрипт — отложенно после load
window.addEventListener('load', function() {
setTimeout(function() {
dataLayer.push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
var j = document.createElement('script');
j.async = true;
j.src = 'https://www.googletagmanager.com/gtm.js?id=GTM-WK88TH';
document.head.appendChild(j);
}, 1500);
});
</script>
<!-- End Google Tag Manager -->
</head>
<body>
<noscript>
<div>
<img alt="" src="https://mc.yandex.ru/watch/25559621" style="position:absolute; left:-9999px;">
</div>
</noscript>
<header class="sticky-top bg-body">
<nav class="navbar navbar-expand-lg">
<div class="container-xxl">
<a class="navbar-brand" href="/"><img alt="Логотип Хекслета" height="24" src="https://ru.hexlet.io/vite/assets/logo_ru_light-BpiEA1LT.svg" width="96">
</a><button aria-controls="collapsable" aria-expanded="false" aria-label="Меню" class="navbar-toggler border-0 mb-0 mt-1" data-bs-target="#collapsable" data-bs-toggle="collapse">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="collapsable">
<ul class="navbar-nav mb-lg-0 mt-lg-1">
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
Все курсы
<span class="bi bi-chevron-down align-middle ms-1"></span>
</button>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item d-flex py-2" href="/courses"><div class="fw-bold me-auto">Все что есть</div>
<div class="text-muted">117</div>
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные категории</b>
</li>
<li>
<a class="dropdown-item py-2" href="/courses_devops">Курсы по DevOps
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_data_analytics">Курсы по аналитике данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_programming">Курсы по программированию
</a></li>
<li>
<a class="dropdown-item py-2" href="/courses_testing">Курсы по тестированию
</a></li>
<li>
<hr class="dropdown-divider">
</li>
<li class="dropdown-item">
<b>Популярные курсы</b>
</li>
<li>
<a class="dropdown-item py-2" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/go">Go-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/java">Java-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/python">Python-разработчик
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/qa-auto-engineer-java">Автоматизатор тестирования на Java
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/data-analytics">Аналитик данных
</a></li>
<li>
<a class="dropdown-item py-2" href="/programs/frontend">Фронтенд-разработчик
</a></li>
</ul>
</li>
<li class="nav-item dropdown">
<button aria-haspopup class="btn nav-link" data-bs-toggle="dropdown" type="button">
О Хекслете
<span class="bi bi-chevron-down align-middle"></span>
</button>
<ul class="dropdown-menu bg-body">
<li>
<a class="dropdown-item py-2" href="/pages/about">О нас
</a></li>
<li>
<a class="dropdown-item py-2" href="/blog">Блог
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/hse-research" role="button">Результаты (Исследование)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://career.hexlet.io" role="button">Хекслет Карьера
</span></li>
<li>
<a class="dropdown-item py-2" href="/testimonials">Отзывы студентов
</a></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://t.me/hexlet_help_bot" role="button">Поддержка (В ТГ)
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/referal-program/?promo_creative=priglasite-druzei&promo_name=referal-program&promo_position=promo_position&promo_start=010724&promo_type=link" role="button">Реферальная программа
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://special.hexlet.io/certificate" role="button">Подарочные сертификаты
</span></li>
<li>
<span class="dropdown-item py-2 external-link" data-href="https://hh.ru/employer/4307094" role="button">Вакансии
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://b2b.hexlet.io" data-target="_blank" role="button">Компаниям
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexly.ru/" data-target="_blank" role="button">Колледж
</span></li>
<li>
<span class="dropdown-item d-flex external-link" rel="noopener noreferrer nofollow" data-href="https://hexlyschool.ru/" data-target="_blank" role="button">Частная школа
</span></li>
</ul>
</li>
<li><a class="nav-link" href="/subscription/new">Подписка</a></li>
</ul>
<ul class="navbar-nav flex-lg-row align-items-lg-center gap-2 ms-auto">
<li>
<a class="nav-link" aria-label="Переключить тему" href="/theme/switch?new_theme=dark"><span aria-hidden="true" class="bi bi-moon"></span>
</a></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="/u/new" role="button"><span>Регистрация</span>
</span></li>
<li>
<span data-target="_self" class="nav-link external-link" data-href="https://ru.hexlet.io/session/new" role="button"><span>Вход</span>
</span></li>
</ul>
</div>
</div>
</nav>
</header>
<div class="x-container-xxxl">
</div>
<main class="mb-6 min-vh-100 h-100">
<link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzk5MiwicHVyIjoiYmxvYl9pZCJ9fQ==--e9d0f30948ea766a7e6bc3e3d56c192344d45fb8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programming-cuate%20(1).png"/><link rel="preload" as="image" href="/vite/assets/development-BVihs_d5.png"/><div id="app" data-page="{"component":"web/courses/lessons/theory_unit","props":{"errors":{},"locale":"ru","language":"ru","httpsHost":"https://ru.hexlet.io","host":"ru.hexlet.io","colorScheme":"light","auth":{"user":{"id":null,"last_viewed_notification_id":null,"email":null,"state":null,"first_name":"","last_name":"","created_at":"2026-02-26T18:37:19.537Z","current_program":null,"current_team":null,"full_name":"","guest":true,"can_use_paid_features":false,"is_hexlet_employee":false,"sanitized_phone_number":"","can_subscribe":true,"can_renew_education":false}},"cloudflareTurnstileSiteKey":"0x4AAAAAAA15KmeFXzd2H0Xo","vkIdClientId":"51586979","yandexIdClientId":"88d071f1d3384eb4bd1deb37910235c7","formAuthToken":"hzx0CgsyBTYGjNSWA-DFl7fOePPXSVD21l9OPo9Avmlo7b89-UyoVrDP8A4P7zXgd8dVWd9-rlRrv9Rq3UdZBw","topics":[{"id":46930,"title":"Здравствуйте! При попытке установить зависимость получаю вот такое сообщение об ошибке:\n[ErrorExpertion]\n\"continue\" targeting switch is equivalent to \"break\". Did you mean to use \"continue 2\"? Это что такое? Раньше ничего подобного не было. \n","plain_title":"Здравствуйте! При попытке установить зависимость получаю вот такое сообщение об ошибке: [ErrorExpertion] \"continue\" targeting switch is equivalent to \"break\". Did you mean to use \"continue 2\"? Это что такое? Раньше ничего подобного не было. ","creator":{"public_name":"Svitlana Starodub","id":299286,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":101196,"body":"В документации composer сказано, что одной из причин может быть либо отсутствие свобоной памяти, либо выключенный swap. Взгляните на статью — [proc_open(): fork failed errors](https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors), там сказано как провести диагностику свободной памяти.\n\nНо могут быть и другие причины. Я бы порекомендовал вам попробовать адресовать этот вопрос ребятам в нашем Слаке, так получится решить проблему более оперативно. О том как подключиться к воркспейсу можно почитать здесь — [Слак Хекслета](https://help.hexlet.io/article/66-slack)","topic_id":46930},{"creator":{"public_name":"Svitlana Starodub","id":299286,"is_tutor":false},"id":101178,"body":"**Роман Ашиков**, Здравствуйте! Командой composer self-update обновить не получилось, прошлось удалять и устанавливать заново (согласно инстукций из рекомендованного вами треда). Теперь другая проблема - при установке зависимости выдает ошибку -proc_open(): fork failed - Cannot allocate memory.","topic_id":46930},{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":101120,"body":"Добрый день! Эта ошибка связана с изменениями касающимися оператора continue внутри switch в версии PHP 7.3.\n\nСкорее всего вам просто нужно обновить composer. Поробуйте запустить:\n\n composer self-update\n\nНапишите, пожалуйста, сохраняется ли проблема.\n\nА вот хороший тред по вашей ошибке на stackoverflow.com — [Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”?](https://stackoverflow.com/questions/54184707/warning-continue-targeting-switch-is-equivalent-to-break-did-you-mean-to-u)","topic_id":46930},{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":101310,"body":"Отлично!","topic_id":46930},{"creator":{"public_name":"Svitlana Starodub","id":299286,"is_tutor":false},"id":101283,"body":"Здравствуйте! Все получилось, спасибо большое за помощь.\n","topic_id":46930}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Микрофреймворки","entity_url":null,"active":true}},{"id":45949,"title":"Доброго времени!\nЗастрял на выполнении 5 шага Самостоятельной работы.\n\nКогда пытаю запустить public/index.php\n\nВ терминале выдает ошибку: [Скрин](https://cloud.mail.ru/public/3w65/3MBUZZdfy)\n\nНа странице браузера пусто.\n\nСодержание файла index.php : [Скрин](https://cloud.mail.ru/public/22nR/3kURyjhKu)\n\nПодскажите как определять причины таких ошибок. Я так понимаю интерпретатор не может найти метод класса, но как понять почему?\n\nЗаранее благодарю!","plain_title":"Доброго времени! Застрял на выполнении 5 шага Самостоятельной работы. Когда пытаю запустить public/index.php Выдает ошибку: Скрин (https://cloud.mail.ru/public/3w65/3MBUZZdfy) Содержание файла index.php : Скрин (https://cloud.mail.ru/public/22nR/3kURyjhKu) Подскажите как определять причины таких ошибок. Я так понимаю интерпретатор не может найти метод класса, но как понять почему? Заранее благодарю! ","creator":{"public_name":"Aleksandr","id":264058,"is_tutor":false},"comments":[{"creator":{"public_name":"Sergey","id":46834,"is_tutor":false},"id":104802,"body":"**Роман Ашиков**, а в чём смысл установки всех зависимостей, когда в руководстве чёрным по белому пишут ' you need to install one of the following implementations'? ","topic_id":45949},{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":99289,"body":"Приветствую, Александр! В таких случаях обычно приходится обращаться к документации или гуглить ошибку.\n\nПроверьте все ли зависимости у вас установлены. В _composer.json_ секция `require` должна выглядеть так:\n\n \"require\": {\n \"slim/slim\": \"^4.0\",\n \"slim/psr7\": \"^1.1\",\n \"nyholm/psr7\": \"^1.3\",\n \"nyholm/psr7-server\": \"^1.0\",\n \"guzzlehttp/psr7\": \"^1.6\",\n \"http-interop/http-factory-guzzle\": \"^1.0\",\n \"laminas/laminas-diactoros\": \"^2.3\"\n }\n\nВ [README](https://github.com/slimphp/Slim) под заголовком \"Hello World using AppFactory with PSR-7 auto-detection\" как раз говорится о том, что чтобы заработал `AppFactory::create()`, нужно установить дополнительные пакеты. Там же приводятся необходимые для этого команды.\n\nНапишите, пожалуйста, удалось ли вам разобраться с этой ошибкой.","topic_id":45949}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Микрофреймворки","entity_url":null,"active":true}},{"id":29999,"title":"У меня всё сработало, как надо. о я решил поэкспериментировать - добавил файл test.php, добавил его в composer.json в секцию autoload, запустил команду composer dump-autoload. Обратился к этому файлу в index.php , но он почему-то не вывел сообщение, заключённое в test.php . Подскажите, в чём я ошибся?","plain_title":"У меня всё сработало, как надо. о я решил поэкспериментировать - добавил файл test.php, добавил его в composer.json в секцию autoload, запустил команду composer dump-autoload. Обратился к этому файлу в index.php , но он почему-то не вывел сообщение, заключённое в test.php . Подскажите, в чём я ошибся? ","creator":{"public_name":"Alexey Danilov","id":145698,"is_tutor":false},"comments":[{"creator":{"public_name":"Alexey Danilov","id":145698,"is_tutor":false},"id":64978,"body":"\n```\n<?php\n\nrequire 'vendor/autoload.php';\n\n$app = new Slim\\App();\n\n$app->get('/hello/{name}', function ($request, $response, $args) {\n return $response->getBody()->write(\"Hello, \" . $args['name']);\n});\n$app->run();\nMyClass::howAreYou();\n`\n```\n\n```\n<?php\nclass MyClass{\n static function howAreYou(){\n echo 'How are you?';\n }\n}\n```\n\n```\n\n{\n \"name\": \"alexey/slim-project\",\n \"description\": \"It's my test project\",\n \"authors\": [\n {\n \"name\": \"AlexeyDanilov\",\n \"email\": \"al.s.danilov@gmail.com\"\n }\n ],\n\"autoload\": {\n \"files\": [\n \"test.php\"\n ]\n},\n \"require\": {\n \"slim/slim\": \"^3.0\"\n }\n}\n\n```","topic_id":29999}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Микрофреймворки","entity_url":null,"active":true}},{"id":48840,"title":"При всех проделанных действиях согласно заданию получил такую ошибку:\n\n[Wed Oct 28 12:14:11 2020] PHP Fatal error: Interface 'Psr\\Http\\Message\\RequestFactoryInterface' not found in /home/ilitqa/my-first-composer-project/vendor/nyholm/psr7/src/Factory/Psr17Factory.php on line 14\n[Wed Oct 28 12:14:11 2020] 127.0.0.1:55798 [500]: /hello/mike - Interface 'Psr\\Http\\Message\\RequestFactoryInterface' not found in /home/ilitqa/my-first-composer-project/vendor/nyholm/psr7/src/Factory/Psr17Factory.php on line 14\n\n","plain_title":"При всех проделанных действиях согласно заданию получил такую ошибку: [Wed Oct 28 12:14:11 2020] PHP Fatal error: Interface 'Psr\\Http\\Message\\RequestFactoryInterface' not found in /home/ilitqa/my-first-composer-project/vendor/nyholm/psr7/src/Factory/Psr17Factory.php on line 14 [Wed Oct 28 12:14:11 2020] 127.0.0.1:55798 [500]: /hello/mike - Interface 'Psr\\Http\\Message\\RequestFactoryInterface' not found in /home/ilitqa/my-first-composer-project/vendor/nyholm/psr7/src/Factory/Psr17Factory.php on line 14 ","creator":{"public_name":"Sergey","id":46834,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":104860,"body":"Приветствую, Сергей!\n\nПроверьте, пожалуйста, установлена ли у вас в проекте зависимость — https://github.com/slimphp/Slim-Psr7. Еще можно привести содержимое файла composer.json в комментарии, так будет легче понять где была допущена ошибка.","topic_id":48840}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Микрофреймворки","entity_url":null,"active":true}},{"id":32345,"title":"```\n^Cmarud@qwer:~/example/php-package$ php -S localhost:8000 -t public\nPHP 7.2.19-0ubuntu0.18.04.2 Development Server started at Sun Sep 29 23:46:30 2019\nListening on http://localhost:8000\nDocument root is /home/marud/example/php-package/public\nPress Ctrl-C to quit.\n[Sun Sep 29 23:46:52 2019] PHP Fatal error: Uncaught Error: Class 'Slim\\Factory\\AppFactory' not found in /home/marud/example/php-package/public/index.php:9\nStack trace:\n#0 {main}\n thrown in /home/marud/example/php-package/public/index.php on line 9\n[Sun Sep 29 23:46:52 2019] 127.0.0.1:51848 [500]: /hello/mike - Uncaught Error: Class 'Slim\\Factory\\AppFactory' not found in /home/marud/example/php-package/public/index.php:9\nStack trace:\n#0 {main}\n thrown in /home/marud/example/php-package/public/index.php on line 9\n[Sun Sep 29 23:46:55 2019] PHP Fatal error: Uncaught Error: Class 'Slim\\Factory\\AppFactory' not found in /home/marud/example/php-package/public/index.php:9\nStack trace:\n#0 {main}\n thrown in /home/marud/example/php-package/public/index.php on line 9\n[Sun Sep 29 23:46:55 2019] 127.0.0.1:51847 [500]: /hello/mike - Uncaught Error: Class 'Slim\\Factory\\AppFactory' not found in /home/marud/example/php-package/public/index.php:9\nStack trace:\n#0 {main}\n thrown in /home/marud/example/php-package/public/index.php on line 9\n```\nмой репозиторий: https://github.com/Emit27/slim/tree/master/php-package\n\nВ чем ошибка не совсем понимаю, еще сам поковыряюсь...\nПрошу подсказать!!!\nвыдает Страница недоступна Сайт localhost пока не может обработать этот запрос.\nHTTP ERROR 500","plain_title":"^Cmarud@qwer:~/example/php-package$ php -S localhost:8000 -t public PHP 7.2.19-0ubuntu0.18.04.2 Development Server started at Sun Sep 29 23:46:30 2019 Listening on http://localhost:8000 Document root is /home/marud/example/php-package/public Press Ctrl-C to quit. [Sun Sep 29 23:46:52 2019] PHP Fatal error: Uncaught Error: Class 'Slim\\Factory\\AppFactory' not found in /home/marud/example/php-package/public/index.php:9 Stack trace: #0 {main} thrown in /home/marud/example/php-package/public/index.php on line 9 [Sun Sep 29 23:46:52 2019] 127.0.0.1:51848 [500]: /hello/mike - Uncaught Error: Class 'Slim\\Factory\\AppFactory' not found in /home/marud/example/php-package/public/index.php:9 Stack trace: #0 {main} thrown in /home/marud/example/php-package/public/index.php on line 9 [Sun Sep 29 23:46:55 2019] PHP Fatal error: Uncaught Error: Class 'Slim\\Factory\\AppFactory' not found in /home/marud/example/php-package/public/index.php:9 Stack trace: #0 {main} thrown in /home/marud/example/php-package/public/index.php on line 9 [Sun Sep 29 23:46:55 2019] 127.0.0.1:51847 [500]: /hello/mike - Uncaught Error: Class 'Slim\\Factory\\AppFactory' not found in /home/marud/example/php-package/public/index.php:9 Stack trace: #0 {main} thrown in /home/marud/example/php-package/public/index.php on line 9 мой репозиторий: https://github.com/Emit27/slim/tree/master/php-package В чем ошибка не совсем понимаю, еще сам поковыряюсь... ","creator":{"public_name":"Дмитрий И","id":208344,"is_tutor":false},"comments":[{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":70265,"body":"> https://github.com/Emit27/slim/tree/master/php-package/vendor\n\nВот это нужно в gitignore добавлять. Зависимости не комитят.\n\nhttps://github.com/Emit27/slim/blob/master/php-package/composer.json\n\nУ вас слим не установлен как зависимость. Поэтому он не может заработать.\n\np.s. про зависимости рассказывалось в курсе по настройке окружения","topic_id":32345}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Микрофреймворки","entity_url":null,"active":true}},{"id":38922,"title":"Думаю немного разъяснить значение этого пункта в задании:\n> Создайте файл public/index.php, куда добавьте пример из README.\n\nНужно прямо на гитхабе открыть файл README.md и выполнить пример под названием \n> Hello World using AppFactory with PSR-7 auto-detection\n\nТам в начале подрузамевается, что нужно установить Slim-Psr7 (composer require slim/psr7) и далее взять код который идет ниже и вставить в public/index.php\n\nА то у меня без установки Slim-Psr7 не заработало. И не сразу догадался до этого.","plain_title":"Думаю немного разъяснить значение этого пункта в задании: Создайте файл public/index.php, куда добавьте пример из README. Нужно прямо на гитхабе открыть файл READMI.md и выполнить пример под названием Hello World using AppFactory with PSR-7 auto-detection Там в начале подрузамевается, что нужно установить Slim-Psr7 (composer require slim/psr7) и далее взять код который идет ниже и вставить в public/index.php А то у меня без установки Slim-Psr7 не заработало. И не сразу догадался до этого. ","creator":{"public_name":"Роман Жаров","id":99387,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Kozlov","id":231814,"is_tutor":false},"id":85284,"body":"Добрый вечер! \nСпасибо, дополнил инструкцию! :)","topic_id":38922},{"creator":{"public_name":"Aleksandr","id":264058,"is_tutor":false},"id":99240,"body":"Доброго времени!\nПри попытке установить зависимость: sudo composer require slim/psr7\n\nВыдает:\n[InvalidArgumentException]\nCould not find package slim/psr7 at any version matching your PHP version 7 \n .0.33.0\n\nНа сколько я понял, он не может найти пакеты соответствующие моей версии PHP. Только пока не пойму что с этим делать?\n\nPHP version 7.0.33","topic_id":38922}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Микрофреймворки","entity_url":null,"active":true}},{"id":53253,"title":"Hi!\n ДЗ выполнилось на Ура! Благо, научили внимательно читать и кнопать без ошибок. А теперь вопрос!? То-ли я наперед забежал и что-то упустил, то-ли голову перегрузил. Сделать сделал, все заработало, увидел кино на мониторе. А что сделал, так и не понял. Начал искать информацию по Slim-PSR, и нашел на Ваших курсах далеко впереди. ДЗ для тренировки пальцев? Спасибо. ","plain_title":"Hi! ДЗ выполнилось на Ура! Благо, научили внимательно читать и кнопать без ошибок. А теперь вопрос!? То-ли я наперед забежал и что-то упустил, то-ли голову перегрузил. Сделать сделал, все заработало, увидел кино на мониторе. А что сделал, так и не понял. Начал искать информацию по Slim-PSR, и нашел на Ваших курсах далеко впереди. ДЗ для тренировки пальцев? Спасибо. ","creator":{"public_name":"Вячеслав Макаров","id":350060,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":113375,"body":"Приветствую, Вячеслав!\n\nВ этом курсе даётся поверхностное представление о том, как происходит веб-разработка на PHP. Закладывается фундамент для понимания более сложных вещей, и даётся обоснование всему следующему обучению. На данном этапе не стоит переживать, если вы что-то не до конца понимаете. Просто двигайтесь дальше. Как говорится: \"Всему своё время\". Когда пройдёте профессию полностью, можете попробовать вернуться к этому курсу и оценить его новым взглядом. Вы удивитесь, когда будете понимать абсолютно всё, что рассказывается в уроках и по ссылкам в дополнительных материалах. А детально разработка на микрофреймворке Slim будет рассматриваться в курсе https://ru.hexlet.io/courses/php-mvc","topic_id":53253}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Микрофреймворки","entity_url":null,"active":true}},{"id":56263,"title":"Здравствуйте, случайно сделал инициализацию и установил фреймворк как зависимость в рабочей директории \"/Users/Nickname\". Чем это чревато и можно ли как-то откатить то, что натворил. ","plain_title":"Здравствуйте, случайно сделал инициализацию и установил фреймворк как зависимость в рабочей директории \"/Users/Nickname\". Чем это чревато и можно ли как-то откатить то, что натворил. ","creator":{"public_name":"Никита Алексеевич","id":359859,"is_tutor":false},"comments":[{"creator":{"public_name":"Никита Алексеевич","id":359859,"is_tutor":false},"id":119220,"body":"Один из вариантов удалить все файлы composer через rm -r?","topic_id":56263},{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":119275,"body":"Приветствую, Никита! \n\nВ целом ничем не чревато. Они просто засоряют каталог с пользователями.\n\n> Один из вариантов удалить все файлы composer через rm -r?\n\nКак вариант да. Главное не задеть каталоги других пользователей кроме Nickname, если они есть в этой директории. С rm нужно быть особенно аккуратным.","topic_id":56263}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Микрофреймворки","entity_url":null,"active":true}},{"id":54183,"title":"Вроде всё сделал верно (разве что инициализировал проект в директории hexlet-php) страницы бесконечно загружались. Я поменял порт с localhost:5555 на localhost:9001 и всё заработало. Это допустимо или нет? \n\nВыполняю в приложении Ubuntu 20.04 LTS для Windows 10.","plain_title":"Вроде всё сделал верно (разве что инициализировал проект в директории hexlet-php) страницы бесконечно загружались. Я поменял порт с localhost:5555 на localhost:9001 и всё заработало. Это допустимо или нет? Выполняю в приложении Ubuntu 20.04 LTS для Windows 10. ","creator":{"public_name":"Кирилл Карпухин","id":354765,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":115229,"body":"Сложно однозначно что-то утверждать с локальными проблемами, не видя что происходит в терминале. Но скорее всего 5555 порт уже был чем-то занят. В таком случае порт либо освобождают, либо выбирают другой порт, как это сделали вы. Так что да, это вполне допустимо.\n\nКстати, по такого рода локальным проблемам можно писать ребятам в наш слак, так можно получить ответ намного оперативнее. Там всегда есть народ, в том числе и опытные разработчики, которые обязательно вам помогут разобраться. О том как подключиться можно почитать тут — https://help.hexlet.io/ru/articles/111445-soobshchestvo-kheksleta-v-slake","topic_id":54183},{"creator":{"public_name":"Кирилл Карпухин","id":354765,"is_tutor":false},"id":115272,"body":"Оказалось что я недоустановил пакет Slim согласно документации. А чтобы нужный порт заработал можно закрыть и открыть приложение Ubuntu вновь","topic_id":54183}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Микрофреймворки","entity_url":null,"active":true}},{"id":67187,"title":"я обратил внимание, что localhost:5555 не работает, а работает localhost:8000 для встроенного веб-сервера. И кстати в описании микрофреймворка Slim тоже приводятся инструкции для localhost:8000. Так что наверное поправить нужно здесь и в первом уроке курса.\n\nНу и напишите с чем связаны такие замены.","plain_title":"я обратил внимание, что localhost:5555 не работает, а работает localhost:8000 для встроенного веб-сервера. И кстати в описании микрофреймворка Slim тоже приводятся инструкции для localhost:5555. Так что наверное поправить нужно здесь и в первом уроке курса. Ну и напишите с чем связаны такие замены. ","creator":{"public_name":"Артем Похилюк","id":440928,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":140926,"body":"А почему не работает? Какую ошибку выдаёт сервер? Приведите её, пожалуйста, в топике.\n\n> Ну и напишите с чем связаны такие замены.\n\nВ целом можно и не заменять, тут 5555 скорее выбран как порт, который с наименьшей вероятностью может быть уже занят. Главное чтобы Slim проект у вас заработал. Используйте тот порт который вам удобен.\n\n","topic_id":67187}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Микрофреймворки","entity_url":null,"active":true}}],"lesson":{"exercise":null,"units":[{"id":2151,"name":"theory","url":"/courses/php-overview-of-web-development/lessons/microframework/theory_unit"},{"id":7356,"name":"quiz","url":"/courses/php-overview-of-web-development/lessons/microframework/quiz_unit"}],"links":[],"ordered_units":[{"id":2151,"name":"theory","url":"/courses/php-overview-of-web-development/lessons/microframework/theory_unit"},{"id":7356,"name":"quiz","url":"/courses/php-overview-of-web-development/lessons/microframework/quiz_unit"}],"id":1036,"slug":"microframework","state":"approved","name":"Микрофреймворки","course_order":300,"goal":"Рассматриваем идею микрофреймворков","self_study":"Создайте php-проект (используя Composer) с кодом из описания фреймворка https://github.com/slimphp/Slim\n\n1. Выполните инициализацию проекта.\n2. Установите фреймворк как зависимость.\n3. Создайте файл `public/index.php`, куда добавьте пример из README (абзац — \"Hello World using AppFactory with PSR-7 auto-detection\").\n4. Установите пакеты (зависимости) по инструкции из README.\n5. Запустите проект, выполнив команду `php -S localhost:5555 -t public` в корне проекта.\n6. Откройте страницу _http://localhost:5555/hello/mike_, а затем _http://localhost:5555/hello/john_.\n","theory_video_provider":null,"theory_video_uid":null,"theory":"Большая часть веба построена по так называемой клиент-серверной модели. Клиент (например, браузер) делает запрос на сервер, сервер готовит ответ и отправляет его обратно. Причем сама обработка зависит, как правило, от того, какой был запрошен адрес и с каким методом http. Чаще всего используются post и get запросы. Ничего страшного, если сейчас вы не до конца понимаете, что значит «метод http». В соответствующем курсе они рассматриваются достаточно подробно.\n\nГрубо говоря, каждому url соответствует определенная функция-обработчик. Типичное веб-приложение можно представить как набор обработчиков, связанных с определенными урлами:\n\n```php\n<?php\n\n$handlers = [\n '/' => 'index',\n '/about' => 'about',\n '/users' => 'users'\n];\n\n// Где-то здесь проверка входящего урла и вызов обработчика, соответствующего имени в массиве $handlers\n```\n\nЕсли начать реализовывать эту идею на практике, то окажется что любой веб-сайт содержит в себе много общей логики, которая структурирует приложение:\n\n1. Принять запрос.\n2. Определить, какой обработчик должен выполниться.\n3. Выполнить обработчик и подготовить ответ.\n4. Вернуть ответ клиенту.\n\nТакую логику действительно выделяют и обзывают каркасом или, по-умному, **фреймворком**.\n\nФреймворки — центральная тема профессионального веба. Вот как выглядит код с использованием фреймворка:\n\n```php\n<?php\n\n// public/index.php\n\nrequire_once __DIR__ . '/../vendor/autoload.php';\n\nuse Slim\\Factory\\AppFactory;\n\n$app = AppFactory::create();\n$app->addErrorMiddleware(true, true, true);\n\n$app->get('/', function () {\n return 'Main Page';\n});\n\n$app->get('/about', function () {\n return 'About Page';\n});\n\n$app->run();\n```\n\nЕсли не обращать особое внимание на кучу незнакомого синтаксиса, можно увидеть общую структуру. Описываются обработчики для метода GET (часть `$app->get`) с адресами `/` и `/about`. На каждый адрес определяется функция-обработчик, которая возвращает строку.\n\nПример выше сделан с использованием микрофреймворка Slim. Отличие микрофреймворков от фреймворков в том, что все они (на всех языках) устроены подобным образом. Сам код на них простой и требует создания буквально одного файла. Микрофреймворки практически ничего не могут самостоятельно. Любая новая функциональность достигается сторонними библиотеками.\n\nС фреймворками ситуация другая. Как правило, они содержат внутри себя большое количество возможностей, необходимых в повседневной разработке. С ними сложнее стартануть, и базовая установка может содержать десятки файлов. Проще всего начать изучение с микрофреймворков и постепенно двигаться к полнофункциональным фреймворкам.\n\nПример, который мы видим, представляет собой полноценный веб-сайт. Да, он примитивный, но все же полноценный. И несмотря на небольшое количество кода и отсутствие какой-либо логики, в ход идут возможности PHP, которые ранее не изучались. К ним относятся аспекты как объектно-ориентированного кода, так и функционального. Причем, что первое, что второе — не просто новый синтаксис, а подходы, существенно влияющие на способ мышления и разработки.\n\nИменно по этой причине обучение фреймворку на первых порах создает больше проблем, чем приносит пользы. Подробно ни одна тема не раскроется и не будет отработана, все действия превратятся в повторение за учителем без особого понимания. Шаг влево или вправо от заученных конструкций приведет к полному ступору.\n\nВот лишь некоторые из понятий, которые присутствуют в данном коде:\n\n* Класс\n* Объект\n* Метод\n* Функции как объекты первого рода\n* Функции высшего порядка\n\nВозможно, чисто синтаксически это не очевидно, но в примере функции-обработчики не просто создаются, но и передаются в другие функции (конкретно в вызов `get`). Другими словами, определение функции выступает как выражение, а сами функции — данные, точно такие же, как и числа или строки. Именно с этой темы мы начнем наше погружение в язык в следующем курсе.\n"},"lessonMember":null,"courseMember":null,"course":{"start_lesson":{"exercise":null,"units":[{"id":2155,"name":"theory","url":"/courses/php-overview-of-web-development/lessons/intro/theory_unit"}],"links":[],"ordered_units":[{"id":2155,"name":"theory","url":"/courses/php-overview-of-web-development/lessons/intro/theory_unit"}],"id":1040,"slug":"intro","state":"approved","name":"Введение","course_order":100,"goal":"Знакомимся с целями и задачами курса","self_study":null,"theory_video_provider":null,"theory_video_uid":null,"theory":"Обучение PHP на Хекслете — процесс довольно длительный и непростой. Он включает в себя десятки курсов. Перед тем, как касаться непосредственно веб-программирования и соответствующего инструментария, необходимо научиться программировать в принципе. Причем знание синтаксиса языка не делает из вас программиста, также как знание правил шахмат не делает из вас шахматиста. Во время процесса обучения вас начнут посещать мысли «_зачем я это учу?_», «_как это поможет мне в работе?_», «_я хочу уже делать сайты, дайте мне нужные инструменты!_» и тому подобное. Даже если бы сразу начинать с веб-разработки, то вы бы просто не смогли понять практически ничего из-за огромного объема сопутствующих тем, в которых нужно разбираться. Получается парадокс: курс называется `Ключевые аспекты веб-разработки на PHP`, но изучать веб-разработку как таковую мы будем позже.\n\nМотивация в обучении важна, но она есть только тогда, когда мы понимаем, ради чего мы что-то делаем. Это основная причина создания курса, который вы проходите прямо сейчас. В нем мы поверхностно пройдемся по тому, как делается веб на PHP. Познакомимся со **встроенными возможностями PHP**, **фреймворками**, **http**, **шаблонизацией**, **базами данных**, **orm**, **тестами**, работе с **коллекциями**, **API** и многими другими вещами. Каждая из перечисленных выше тем требует от вас понимания некоторых фундаментальных вопросов, которые как раз и рассматриваются в будущих курсах. Другими словами, в этом курсе мы дадим обоснование всему дальнейшему обучению.\n\nВ некоторых уроках курса встречается блок \"**Что нужно выучить**\". В нем перечислены вещи, которые будут изучаться на Хекслете и которые нужны для понимания соответствующей темы. Этот блок не призыв к действию, он лишь показывает насколько глубока кроличья нора. Нельзя сразу начать с конца. Перед реальной разработкой нужно потратить некоторое время на изучение базовых концепций.\n\nСам курс наполнен огромным количеством новой информации, терминами, концепциями, синтаксисом. И у нас нет ни цели, ни возможности их полностью охватить и, более того, разобрать. Не стоит сильно переживать, если вы что-то совсем не понимаете. Закончив программу обучения («профессию»), вы не только поймете, но и сможете использовать все, о чем говорится в курсе.\n"},"id":158,"slug":"php-overview-of-web-development","challenges_count":0,"name":"Ключевые аспекты веб-разработки на PHP","allow_indexing":true,"state":"approved","course_state":"finished","pricing_type":"free","description":"На этом курсе вы изучите основные аспекты современной веб-разработки в PHP. Вы узнаете о сетевых протоколах и интерфейсах, базах данных и ORM, веб-фреймворках и концепции MVC. Знания из этого курса помогут определиться с дальнейшими областями изучения, дадут общую картину современного бекэнда и веб-разработки.","kind":"additional","updated_at":"2026-01-20T11:52:30.433Z","language":"php","duration_cache":13860,"skills":["Использовать в своем жаргоне такие страшные слова как MVC, HTTP, DNS, ORM","Создавать простейшие страницы с использованием PHP","Устанавливать и запускать приложение на микрофреймворке Slim","Реалистично оценивать объем знаний необходимых для профессиональной разработки"],"keywords":["HTTP","фреймворки","ORM","тестирование","коллекции","шаблонизация"],"lessons_count":13,"cover":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6ODc4MSwicHVyIjoiYmxvYl9pZCJ9fQ==--0eb7d51e9c327b0fdb2988aebc2e64bbd6fa05df/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJwbmciLCJyZXNpemVfdG9fZmlsbCI6WzYwMCw0MDBdfSwicHVyIjoidmFyaWF0aW9uIn19--6067466c2912ca31a17eddee04b8cf2a38c6ad17/image.png"},"recommendedLandings":[{"stack":{"id":2,"slug":"php","title":"PHP-разработчик","audience":"for_beginners","start_type":"weekly","pricing_model":"purchase","priority":"high","kind":"profession","state":"published","stack_state":"finished","order":60,"duration_in_months":10},"id":1,"slug":"php","title":"РНР-разработчик","subtitle":"Изучите PHP и Laravel для разработки и проектирования REST API","subtitle_for_lists":"Изучите PHP и Laravel для разработки и проектирования REST API","locale":"ru","current":true,"duration_in_months_text":"10 месяцев","stack_slug":"php","price_text":"от 5 650 ₽","duration_text":"10 месяцев","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzk5MiwicHVyIjoiYmxvYl9pZCJ9fQ==--e9d0f30948ea766a7e6bc3e3d56c192344d45fb8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programming-cuate%20(1).png"}],"lessonMemberUnit":null,"accessToLearnUnitExists":true,"accessToCourseExists":true},"url":"/courses/php-overview-of-web-development/lessons/microframework/theory_unit","version":"8f286f6358a90a7bef2263b3a6edf5a90a94fa42","encryptHistory":false,"clearHistory":false}"><style data-mantine-styles="true">:root, :host{--mantine-font-family: Arial, sans-serif;--mantine-font-family-headings: Arial, sans-serif;--mantine-heading-font-weight: normal;--mantine-radius-default: 0rem;--mantine-primary-color-filled: var(--mantine-color-indigo-filled);--mantine-primary-color-filled-hover: var(--mantine-color-indigo-filled-hover);--mantine-primary-color-light: var(--mantine-color-indigo-light);--mantine-primary-color-light-hover: var(--mantine-color-indigo-light-hover);--mantine-primary-color-light-color: var(--mantine-color-indigo-light-color);--mantine-spacing-xxl: calc(4rem * var(--mantine-scale));--mantine-font-size-xs: 12px;--mantine-font-size-sm: 14px;--mantine-font-size-md: 16px;--mantine-font-size-lg: clamp(16.0000px, calc(15.2727px + 0.2273vw), 18.0000px);--mantine-font-size-xl: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-display-3: clamp(32.0000px, calc(26.1818px + 1.8182vw), 48.0000px);--mantine-font-size-display-2: clamp(36.0000px, calc(25.8182px + 3.1818vw), 64.0000px);--mantine-font-size-display-1: clamp(40.0000px, calc(25.4545px + 4.5455vw), 80.0000px);--mantine-font-size-h1: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-font-size-h2: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-font-size-h3: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-font-size-h4: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-font-size-h5: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-font-size-h6: 1rem;--mantine-primary-color-0: var(--mantine-color-indigo-0);--mantine-primary-color-1: var(--mantine-color-indigo-1);--mantine-primary-color-2: var(--mantine-color-indigo-2);--mantine-primary-color-3: var(--mantine-color-indigo-3);--mantine-primary-color-4: var(--mantine-color-indigo-4);--mantine-primary-color-5: var(--mantine-color-indigo-5);--mantine-primary-color-6: var(--mantine-color-indigo-6);--mantine-primary-color-7: var(--mantine-color-indigo-7);--mantine-primary-color-8: var(--mantine-color-indigo-8);--mantine-primary-color-9: var(--mantine-color-indigo-9);--mantine-color-red-0: #ffeaea;--mantine-color-red-1: #fed4d4;--mantine-color-red-2: #f4a7a8;--mantine-color-red-3: #ec7878;--mantine-color-red-4: #e55050;--mantine-color-red-5: #e03131;--mantine-color-red-6: #e02829;--mantine-color-red-7: #c71a1c;--mantine-color-red-8: #b21218;--mantine-color-red-9: #9c0411;--mantine-color-violet-0: #fce9ff;--mantine-color-violet-1: #f1cfff;--mantine-color-violet-2: #e09bff;--mantine-color-violet-3: #d16fff;--mantine-color-violet-4: #be37fe;--mantine-color-violet-5: #b51afe;--mantine-color-violet-6: #b009ff;--mantine-color-violet-7: #9b00e4;--mantine-color-violet-8: #8a00cc;--mantine-color-violet-9: #7800b3;--mantine-color-indigo-0: #edecff;--mantine-color-indigo-1: #d6d5fe;--mantine-color-indigo-2: #aaa9f4;--mantine-color-indigo-3: #7b79eb;--mantine-color-indigo-4: #5451e4;--mantine-color-indigo-5: #3b37e0;--mantine-color-indigo-6: #2d2adf;--mantine-color-indigo-7: #1f1ec7;--mantine-color-indigo-8: #1819b2;--mantine-color-indigo-9: #0c149e;--mantine-color-cyan-0: #dffdff;--mantine-color-cyan-1: #caf5ff;--mantine-color-cyan-2: #99e8ff;--mantine-color-cyan-3: #64daff;--mantine-color-cyan-4: #3ccffe;--mantine-color-cyan-5: #24c8fe;--mantine-color-cyan-6: #00c2ff;--mantine-color-cyan-7: #00ade4;--mantine-color-cyan-8: #009acd;--mantine-color-cyan-9: #0085b5;--mantine-color-green-0: #e9fdec;--mantine-color-green-1: #d7f6dc;--mantine-color-green-2: #b0eab9;--mantine-color-green-3: #86df94;--mantine-color-green-4: #62d574;--mantine-color-green-5: #4ccf5f;--mantine-color-green-6: #3fcc54;--mantine-color-green-7: #2fb344;--mantine-color-green-8: #25a03b;--mantine-color-green-9: #138a2e;--mantine-color-yellow-0: #fff7e2;--mantine-color-yellow-1: #ffeecd;--mantine-color-yellow-2: #ffdc9c;--mantine-color-yellow-3: #ffc966;--mantine-color-yellow-4: #feb93a;--mantine-color-yellow-5: #feae1e;--mantine-color-yellow-6: #ffa90f;--mantine-color-yellow-8: #ca8200;--mantine-color-yellow-9: #af7000;--mantine-h1-font-size: clamp(28.0000px, calc(23.6364px + 1.3636vw), 40.0000px);--mantine-h1-font-weight: normal;--mantine-h2-font-size: clamp(24.0000px, calc(21.0909px + 0.9091vw), 32.0000px);--mantine-h2-font-weight: normal;--mantine-h3-font-size: clamp(20.0000px, calc(17.0909px + 0.9091vw), 28.0000px);--mantine-h3-font-weight: normal;--mantine-h4-font-size: clamp(16.0000px, calc(13.0909px + 0.9091vw), 24.0000px);--mantine-h4-font-weight: normal;--mantine-h5-font-size: clamp(16.0000px, calc(14.5455px + 0.4545vw), 20.0000px);--mantine-h5-font-weight: normal;--mantine-h6-font-size: 1rem;--mantine-h6-font-weight: normal;}
:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-dark-filled: var(--mantine-color-dark-5);--mantine-color-dark-filled-hover: var(--mantine-color-dark-6);--mantine-color-dark-light: rgba(105, 105, 105, 0.15);--mantine-color-dark-light-hover: rgba(105, 105, 105, 0.2);--mantine-color-dark-light-color: var(--mantine-color-dark-0);--mantine-color-dark-outline: var(--mantine-color-dark-1);--mantine-color-dark-outline-hover: rgba(184, 184, 184, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-5);--mantine-color-gray-filled-hover: var(--mantine-color-gray-6);--mantine-color-gray-light: rgba(222, 226, 230, 0.15);--mantine-color-gray-light-hover: rgba(222, 226, 230, 0.2);--mantine-color-gray-light-color: var(--mantine-color-gray-0);--mantine-color-gray-outline: var(--mantine-color-gray-1);--mantine-color-gray-outline-hover: rgba(241, 243, 245, 0.05);--mantine-color-red-filled: var(--mantine-color-red-5);--mantine-color-red-filled-hover: var(--mantine-color-red-6);--mantine-color-red-light: rgba(236, 120, 120, 0.15);--mantine-color-red-light-hover: rgba(236, 120, 120, 0.2);--mantine-color-red-light-color: var(--mantine-color-red-0);--mantine-color-red-outline: var(--mantine-color-red-1);--mantine-color-red-outline-hover: rgba(254, 212, 212, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-5);--mantine-color-pink-filled-hover: var(--mantine-color-pink-6);--mantine-color-pink-light: rgba(250, 162, 193, 0.15);--mantine-color-pink-light-hover: rgba(250, 162, 193, 0.2);--mantine-color-pink-light-color: var(--mantine-color-pink-0);--mantine-color-pink-outline: var(--mantine-color-pink-1);--mantine-color-pink-outline-hover: rgba(255, 222, 235, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-5);--mantine-color-grape-filled-hover: var(--mantine-color-grape-6);--mantine-color-grape-light: rgba(229, 153, 247, 0.15);--mantine-color-grape-light-hover: rgba(229, 153, 247, 0.2);--mantine-color-grape-light-color: var(--mantine-color-grape-0);--mantine-color-grape-outline: var(--mantine-color-grape-1);--mantine-color-grape-outline-hover: rgba(243, 217, 250, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-5);--mantine-color-violet-filled-hover: var(--mantine-color-violet-6);--mantine-color-violet-light: rgba(209, 111, 255, 0.15);--mantine-color-violet-light-hover: rgba(209, 111, 255, 0.2);--mantine-color-violet-light-color: var(--mantine-color-violet-0);--mantine-color-violet-outline: var(--mantine-color-violet-1);--mantine-color-violet-outline-hover: rgba(241, 207, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-5);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-6);--mantine-color-indigo-light: rgba(123, 121, 235, 0.15);--mantine-color-indigo-light-hover: rgba(123, 121, 235, 0.2);--mantine-color-indigo-light-color: var(--mantine-color-indigo-0);--mantine-color-indigo-outline: var(--mantine-color-indigo-1);--mantine-color-indigo-outline-hover: rgba(214, 213, 254, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-5);--mantine-color-blue-filled-hover: var(--mantine-color-blue-6);--mantine-color-blue-light: rgba(116, 192, 252, 0.15);--mantine-color-blue-light-hover: rgba(116, 192, 252, 0.2);--mantine-color-blue-light-color: var(--mantine-color-blue-0);--mantine-color-blue-outline: var(--mantine-color-blue-1);--mantine-color-blue-outline-hover: rgba(208, 235, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-5);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-6);--mantine-color-cyan-light: rgba(100, 218, 255, 0.15);--mantine-color-cyan-light-hover: rgba(100, 218, 255, 0.2);--mantine-color-cyan-light-color: var(--mantine-color-cyan-0);--mantine-color-cyan-outline: var(--mantine-color-cyan-1);--mantine-color-cyan-outline-hover: rgba(202, 245, 255, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-5);--mantine-color-teal-filled-hover: var(--mantine-color-teal-6);--mantine-color-teal-light: rgba(99, 230, 190, 0.15);--mantine-color-teal-light-hover: rgba(99, 230, 190, 0.2);--mantine-color-teal-light-color: var(--mantine-color-teal-0);--mantine-color-teal-outline: var(--mantine-color-teal-1);--mantine-color-teal-outline-hover: rgba(195, 250, 232, 0.05);--mantine-color-green-filled: var(--mantine-color-green-5);--mantine-color-green-filled-hover: var(--mantine-color-green-6);--mantine-color-green-light: rgba(134, 223, 148, 0.15);--mantine-color-green-light-hover: rgba(134, 223, 148, 0.2);--mantine-color-green-light-color: var(--mantine-color-green-0);--mantine-color-green-outline: var(--mantine-color-green-1);--mantine-color-green-outline-hover: rgba(215, 246, 220, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-5);--mantine-color-lime-filled-hover: var(--mantine-color-lime-6);--mantine-color-lime-light: rgba(192, 235, 117, 0.15);--mantine-color-lime-light-hover: rgba(192, 235, 117, 0.2);--mantine-color-lime-light-color: var(--mantine-color-lime-0);--mantine-color-lime-outline: var(--mantine-color-lime-1);--mantine-color-lime-outline-hover: rgba(233, 250, 200, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-5);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-6);--mantine-color-yellow-light: rgba(255, 201, 102, 0.15);--mantine-color-yellow-light-hover: rgba(255, 201, 102, 0.2);--mantine-color-yellow-light-color: var(--mantine-color-yellow-0);--mantine-color-yellow-outline: var(--mantine-color-yellow-1);--mantine-color-yellow-outline-hover: rgba(255, 238, 205, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-5);--mantine-color-orange-filled-hover: var(--mantine-color-orange-6);--mantine-color-orange-light: rgba(255, 192, 120, 0.15);--mantine-color-orange-light-hover: rgba(255, 192, 120, 0.2);--mantine-color-orange-light-color: var(--mantine-color-orange-0);--mantine-color-orange-outline: var(--mantine-color-orange-1);--mantine-color-orange-outline-hover: rgba(255, 232, 204, 0.05);--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-9) 0%, var(--mantine-color-cyan-7) 100%);--app-color-surface: #2e2e2e;}
:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-color-anchor: var(--mantine-color-text);--mantine-color-dimmed: #495057;--mantine-color-red-light: rgba(224, 40, 41, 0.1);--mantine-color-red-light-hover: rgba(224, 40, 41, 0.12);--mantine-color-red-outline-hover: rgba(224, 40, 41, 0.05);--mantine-color-violet-light: rgba(176, 9, 255, 0.1);--mantine-color-violet-light-hover: rgba(176, 9, 255, 0.12);--mantine-color-violet-outline-hover: rgba(176, 9, 255, 0.05);--mantine-color-indigo-light: rgba(45, 42, 223, 0.1);--mantine-color-indigo-light-hover: rgba(45, 42, 223, 0.12);--mantine-color-indigo-outline-hover: rgba(45, 42, 223, 0.05);--mantine-color-cyan-light: rgba(0, 194, 255, 0.1);--mantine-color-cyan-light-hover: rgba(0, 194, 255, 0.12);--mantine-color-cyan-outline-hover: rgba(0, 194, 255, 0.05);--mantine-color-green-light: rgba(63, 204, 84, 0.1);--mantine-color-green-light-hover: rgba(63, 204, 84, 0.12);--mantine-color-green-outline-hover: rgba(63, 204, 84, 0.05);--mantine-color-yellow-light: rgba(255, 169, 15, 0.1);--mantine-color-yellow-light-hover: rgba(255, 169, 15, 0.12);--mantine-color-yellow-outline-hover: rgba(255, 169, 15, 0.05);--app-color-surface: #f1f3f5;--app-cta-gradient: linear-gradient(90deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-5) 100%);}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><div style="position:absolute;top:0rem" class=""></div><div style="max-width:var(--container-size-xl);height:100%;min-height:0rem" class=""><style data-mantine-styles="inline">.__m__-_R_5ub_{--grid-gutter:0rem;}</style><div style="height:100%;min-height:0rem" class="m_410352e9 mantine-Grid-root __m__-_R_5ub_"><div class="m_dee7bd2f mantine-Grid-inner" style="height:100%"><style data-mantine-styles="inline">.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:91.66666666666667%;--col-max-width:91.66666666666667%;}@media(min-width: 48em){.__m__-_R_rdub_{--col-flex-grow:auto;--col-flex-basis:83.33333333333334%;--col-max-width:83.33333333333334%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem;display:flex" class="m_96bdd299 mantine-Grid-col __m__-_R_rdub_"><style data-mantine-styles="inline">.__m__-_R_6qrdub_{margin-top:0rem;padding-inline:var(--mantine-spacing-xs);width:100%;}@media(min-width: 48em){.__m__-_R_6qrdub_{margin-top:var(--mantine-spacing-xl);width:80%;}}@media(min-width: 62em){.__m__-_R_6qrdub_{padding-inline:var(--mantine-spacing-xl);}}</style><div style="margin-inline:auto;max-width:var(--mantine-breakpoint-xl)" class="__m__-_R_6qrdub_"><div style="color:var(--mantine-color-dimmed)" class="m_4451eb3a mantine-Center-root" data-inline="true"><div style="--ti-size:var(--ti-size-xs);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;margin-inline-end:calc(0.125rem * var(--mantine-scale));color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="xs"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-lock "><path d="M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-6"></path><path d="M11 16a1 1 0 1 0 2 0a1 1 0 0 0 -2 0"></path><path d="M8 11v-4a4 4 0 1 1 8 0v4"></path></svg></div><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Ключевые аспекты веб-разработки на PHP</p></div><h1 style="--title-fw:var(--mantine-h1-font-weight);--title-lh:var(--mantine-h1-line-height);--title-fz:var(--mantine-h1-font-size);margin-bottom:var(--mantine-spacing-xl)" class="m_8a5d1357 mantine-Title-root" data-order="1">Теория: Микрофреймворки</h1><script type="application/ld+json">{"@context":"https://schema.org","@type":"LearningResource","name":"Микрофреймворки","inLanguage":"ru","isPartOf":{"@type":"LearningResource","name":"Ключевые аспекты веб-разработки на PHP"},"isAccessibleForFree":"False","hasPart":{"@type":"WebPageElement","isAccessibleForFree":"False","cssSelector":".paywalled"}}</script><div class=""><div style="--alert-color:var(--mantine-color-indigo-light-color);margin-bottom:var(--mantine-spacing-lg);font-size:var(--mantine-font-size-lg)" class="m_66836ed3 mantine-Alert-root" id="mantine-_R_remqrdub_" role="alert" aria-describedby="mantine-_R_remqrdub_-body" aria-labelledby="mantine-_R_remqrdub_-title"><div class="m_a5d60502 mantine-Alert-wrapper"><div class="m_667f2a6a mantine-Alert-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-rocket "><path d="M4 13a8 8 0 0 1 7 7a6 6 0 0 0 3 -5a9 9 0 0 0 6 -8a3 3 0 0 0 -3 -3a9 9 0 0 0 -8 6a6 6 0 0 0 -5 3"></path><path d="M7 14a6 6 0 0 0 -3 6a6 6 0 0 0 6 -3"></path><path d="M14 9a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"></path></svg></div><div class="m_667c2793 mantine-Alert-body"><div class="m_6a03f287 mantine-Alert-title"><span id="mantine-_R_remqrdub_-title" class="m_698f4f23 mantine-Alert-label">Полный доступ к материалам</span></div><div id="mantine-_R_remqrdub_-body" class="m_7fa78076 mantine-Alert-message"><div style="--group-gap:var(--mantine-spacing-md);--group-align:center;--group-justify:space-between;--group-wrap:wrap" class="m_4081bf90 mantine-Group-root"><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Зарегистрируйтесь и получите доступ к этому и десяткам других курсов</p><a style="--button-height:var(--button-height-xs);--button-padding-x:var(--button-padding-x-xs);--button-fz:var(--mantine-font-size-xs);--button-bg:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-hover:linear-gradient(45deg, var(--mantine-color-blue-filled) 0%, var(--mantine-color-cyan-filled) 100%);--button-color:var(--mantine-color-white);--button-bd:none" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" data-variant="gradient" data-size="xs" href="/u/new"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Зарегистрироваться</span></span></a></div></div></div></div></div><div class="paywalled m_d08caa0 mantine-Typography-root"><p>Большая часть веба построена по так называемой клиент-серверной модели. Клиент (например, браузер) делает запрос на сервер, сервер готовит ответ и отправляет его обратно. Причем сама обработка зависит, как правило, от того, какой был запрошен адрес и с каким методом http. Чаще всего используются post и get запросы. Ничего страшного, если сейчас вы не до конца понимаете, что значит «метод http». В соответствующем курсе они рассматриваются достаточно подробно.</p>
<p>Грубо говоря, каждому url соответствует определенная функция-обработчик. Типичное веб-приложение можно представить как набор обработчиков, связанных с определенными урлами:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code"><?php
$handlers = [
'/' => 'index',
'/about' => 'about',
'/users' => 'users'
];
// Где-то здесь проверка входящего урла и вызов обработчика, соответствующего имени в массиве $handlers</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Если начать реализовывать эту идею на практике, то окажется что любой веб-сайт содержит в себе много общей логики, которая структурирует приложение:</p>
<ol>
<li>Принять запрос.</li>
<li>Определить, какой обработчик должен выполниться.</li>
<li>Выполнить обработчик и подготовить ответ.</li>
<li>Вернуть ответ клиенту.</li>
</ol>
<p>Такую логику действительно выделяют и обзывают каркасом или, по-умному, <strong>фреймворком</strong>.</p>
<p>Фреймворки — центральная тема профессионального веба. Вот как выглядит код с использованием фреймворка:</p>
<div style="margin-bottom:var(--mantine-spacing-lg)" class="m_e597c321 mantine-CodeHighlight-codeHighlight" dir="ltr"><div class="m_be7e9c9c mantine-CodeHighlight-controls"><button style="--ai-bg:transparent;--ai-hover:transparent;--ai-color:inherit;--ai-bd:none" class="mantine-focus-auto mantine-active m_d498bab7 mantine-CodeHighlight-control m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="none" type="button" aria-label="Copy code"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M8 8m0 2a2 2 0 0 1 2 -2h8a2 2 0 0 1 2 2v8a2 2 0 0 1 -2 2h-8a2 2 0 0 1 -2 -2z"></path><path d="M16 8v-2a2 2 0 0 0 -2 -2h-8a2 2 0 0 0 -2 2v8a2 2 0 0 0 2 2h2"></path></svg></span></button></div><div style="--scrollarea-scrollbar-size:calc(0.25rem * var(--mantine-scale));--sa-corner-width:0px;--sa-corner-height:0px" class="m_f744fd40 mantine-CodeHighlight-scrollarea m_d57069b5 mantine-ScrollArea-root" dir="ltr"><div style="overflow-x:hidden;overflow-y:hidden;overscroll-behavior-inline:none" class="m_c0783ff9 mantine-ScrollArea-viewport" data-scrollbars="xy"><div class="m_b1336c6 mantine-ScrollArea-content"><pre class="m_2c47c4fd mantine-CodeHighlight-pre" style="padding:0"><code class="m_5caae6d3 mantine-CodeHighlight-code"><?php
// public/index.php
require_once __DIR__ . '/../vendor/autoload.php';
use Slim\Factory\AppFactory;
$app = AppFactory::create();
$app->addErrorMiddleware(true, true, true);
$app->get('/', function () {
return 'Main Page';
});
$app->get('/about', function () {
return 'About Page';
});
$app->run();</code></pre></div></div></div><button class="mantine-focus-auto m_c9378bc2 mantine-CodeHighlight-showCodeButton m_87cf2631 mantine-UnstyledButton-root" data-hidden="true" type="button">Expand code</button></div>
<p>Если не обращать особое внимание на кучу незнакомого синтаксиса, можно увидеть общую структуру. Описываются обработчики для метода GET (часть <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">$app->get</code>) с адресами <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">/</code> и <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">/about</code>. На каждый адрес определяется функция-обработчик, которая возвращает строку.</p>
<p>Пример выше сделан с использованием микрофреймворка Slim. Отличие микрофреймворков от фреймворков в том, что все они (на всех языках) устроены подобным образом. Сам код на них простой и требует создания буквально одного файла. Микрофреймворки практически ничего не могут самостоятельно. Любая новая функциональность достигается сторонними библиотеками.</p>
<p>С фреймворками ситуация другая. Как правило, они содержат внутри себя большое количество возможностей, необходимых в повседневной разработке. С ними сложнее стартануть, и базовая установка может содержать десятки файлов. Проще всего начать изучение с микрофреймворков и постепенно двигаться к полнофункциональным фреймворкам.</p>
<p>Пример, который мы видим, представляет собой полноценный веб-сайт. Да, он примитивный, но все же полноценный. И несмотря на небольшое количество кода и отсутствие какой-либо логики, в ход идут возможности PHP, которые ранее не изучались. К ним относятся аспекты как объектно-ориентированного кода, так и функционального. Причем, что первое, что второе — не просто новый синтаксис, а подходы, существенно влияющие на способ мышления и разработки.</p>
<p>Именно по этой причине обучение фреймворку на первых порах создает больше проблем, чем приносит пользы. Подробно ни одна тема не раскроется и не будет отработана, все действия превратятся в повторение за учителем без особого понимания. Шаг влево или вправо от заученных конструкций приведет к полному ступору.</p>
<p>Вот лишь некоторые из понятий, которые присутствуют в данном коде:</p>
<ul>
<li>Класс</li>
<li>Объект</li>
<li>Метод</li>
<li>Функции как объекты первого рода</li>
<li>Функции высшего порядка</li>
</ul>
<p>Возможно, чисто синтаксически это не очевидно, но в примере функции-обработчики не просто создаются, но и передаются в другие функции (конкретно в вызов <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">get</code>). Другими словами, определение функции выступает как выражение, а сами функции — данные, точно такие же, как и числа или строки. Именно с этой темы мы начнем наше погружение в язык в следующем курсе.</p></div><div style="margin-block:var(--mantine-spacing-xl)" class=""><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md)" class="m_8a5d1357 mantine-Title-root" data-order="2">Рекомендуемые программы</h2><style data-mantine-styles="inline">.__m__-_R_2mremqrdub_{--carousel-slide-gap:var(--mantine-spacing-xs);--carousel-slide-size:70%;}@media(min-width: 36em){.__m__-_R_2mremqrdub_{--carousel-slide-gap:var(--mantine-spacing-xl);--carousel-slide-size:50%;}}</style><div style="--carousel-control-size:calc(2.5rem * var(--mantine-scale));--carousel-controls-offset:var(--mantine-spacing-sm);margin-bottom:var(--mantine-spacing-lg);padding-block:var(--mantine-spacing-sm);background:var(--app-color-surface)" class="m_17884d0f mantine-Carousel-root responsiveClassName" data-orientation="horizontal" data-include-gap-in-size="true"><div class="m_39bc3463 mantine-Carousel-controls" data-orientation="horizontal"><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="previous" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button><button class="mantine-focus-auto m_64f58e10 mantine-Carousel-control m_87cf2631 mantine-UnstyledButton-root" type="button" data-inactive="true" data-type="next" tabindex="-1"><svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform:rotate(-90deg);width:calc(1rem * var(--mantine-scale));height:calc(1rem * var(--mantine-scale));display:block"><path d="M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z" fill="currentColor" fill-rule="evenodd" clip-rule="evenodd"></path></svg></button></div><div class="m_a2dae653 mantine-Carousel-viewport" data-type="media"><div class="m_fcd81474 mantine-Carousel-container __m__-_R_2mremqrdub_" data-orientation="horizontal"><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/programs/php?promo_name=programs_list&promo_position=course&promo_creative=catalog_card&promo_type=card" target="_blank"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><div style="--group-gap:calc(0.25rem * var(--mantine-scale));--group-align:center;--group-justify:flex-start;--group-wrap:nowrap" class="m_4081bf90 mantine-Group-root"><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">10 месяцев</span><span class="mantine-focus-auto m_b6d8b162 mantine-Text-root">·</span><span style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">С нуля</span></div><p style="margin-bottom:var(--mantine-spacing-sm);font-size:var(--mantine-font-size-h5);font-weight:bold" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">РНР-разработчик</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите PHP и Laravel для разработки и проектирования REST API</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6Mzk5MiwicHVyIjoiYmxvYl9pZCJ9fQ==--e9d0f30948ea766a7e6bc3e3d56c192344d45fb8/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programming-cuate%20(1).png" alt="РНР-разработчик" loading="eager"/></div><div style="--group-gap:var(--mantine-spacing-md);--group-align:end;--group-justify:space-between;--group-wrap:wrap;margin-top:var(--mantine-spacing-xs)" class="m_4081bf90 mantine-Group-root"><p style="font-size:var(--mantine-font-size-xl)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">от 5 650 ₽</p><p style="font-size:var(--mantine-font-size-sm)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Посмотреть →</p></div></div></div></a></div></div><div class="m_d98df724 mantine-Carousel-slide" data-orientation="horizontal"><div tabindex="0" style="cursor:pointer;height:100%"><a style="text-decoration:none" class="mantine-focus-auto m_849cf0da m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses?promo_name=programs_list&promo_position=course&promo_creative=catalog_card&promo_type=card"><div style="height:100%" class="m_e615b15f mantine-Card-root m_1b7284a3 mantine-Paper-root" data-with-border="true"><h2 style="--title-fw:var(--mantine-h2-font-weight);--title-lh:var(--mantine-h2-line-height);--title-fz:var(--mantine-h2-font-size);margin-bottom:var(--mantine-spacing-md);font-size:var(--mantine-font-size-h3)" class="m_8a5d1357 mantine-Title-root" data-order="2" data-responsive="true">Каталог</h2><p style="margin-bottom:auto" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Полный список доступных курсов по разным направлениям</p><div style="margin-top:auto" class=""><div class="m_4451eb3a mantine-Center-root"><img style="opacity:0.8;width:70%" class="m_9e117634 mantine-Image-root mantine-visible-from-xs" src="/vite/assets/development-BVihs_d5.png" alt="Orientation"/></div></div></div></a></div></div></div></div></div></div></div></div></div><style data-mantine-styles="inline">.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:8.333333333333334%;--col-max-width:8.333333333333334%;}@media(min-width: 48em){.__m__-_R_1bdub_{--col-flex-grow:auto;--col-flex-basis:16.666666666666668%;--col-max-width:16.666666666666668%;}}</style><div style="min-width:0rem;height:100%;min-height:0rem" class="m_96bdd299 mantine-Grid-col __m__-_R_1bdub_"><div style="margin-inline:var(--mantine-spacing-xs)" class="mantine-visible-from-sm"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-lg);text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/php-overview-of-web-development/lessons/microframework/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label"><span style="margin-inline-end:var(--mantine-spacing-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Дальше</span>→</span></span></a><a style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Навигация по теме</span><span class="m_57492dcc mantine-NavLink-description">Теория</span></div><span class="m_690090b5 mantine-NavLink-section" data-position="right"></span></a><div style="margin-block:var(--mantine-spacing-lg)" class="m_3eebeb36 mantine-Divider-root" data-orientation="horizontal" role="separator"></div><div style="margin-block:var(--mantine-spacing-lg)" class=""><div style="justify-content:space-between;margin-bottom:calc(0.1875rem * var(--mantine-scale));color:var(--mantine-color-dimmed);font-size:var(--mantine-font-size-xs)" class="m_8bffd616 mantine-Flex-root __m__-_R_qimrbdub_"><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Завершено</p><p style="font-size:var(--mantine-font-size-xs)" class="mantine-focus-auto m_b6d8b162 mantine-Text-root">0 / 13</p></div><div style="--progress-size:var(--progress-size-sm)" class="m_db6d6462 mantine-Progress-root" data-size="sm"><div style="--progress-section-size:0%;--progress-section-color:var(--mantine-color-gray-filled)" class="m_2242eb65 mantine-Progress-section" role="progressbar" aria-valuemax="100" aria-valuemin="0" aria-valuenow="0" aria-valuetext="0%"></div></div></div><button style="padding-inline:0rem" class="mantine-focus-auto m_f0824112 mantine-NavLink-root m_87cf2631 mantine-UnstyledButton-root" type="button"><span class="m_690090b5 mantine-NavLink-section" data-position="left"><div style="--ti-size:var(--ti-size-sm);--ti-bg:transparent;--ti-color:var(--mantine-color-indigo-light-color);--ti-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;color:inherit" class="m_7341320d mantine-ThemeIcon-root" data-variant="transparent" data-size="sm"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></div></span><div class="m_f07af9d2 mantine-NavLink-body"><span class="m_1f6ac4c4 mantine-NavLink-label">Обсуждения (архив)</span><span class="m_57492dcc mantine-NavLink-description"></span></div></button><div style="--toc-bg:var(--mantine-color-blue-light);--toc-color:var(--mantine-color-blue-light-color);--toc-size:var(--mantine-font-size-sm);--toc-radius:var(--mantine-radius-sm);margin-top:var(--mantine-spacing-xl)" class="m_bcaa9990 mantine-TableOfContents-root" data-variant="light" data-size="sm"></div></div><div class="mantine-hidden-from-sm"><div style="--stack-gap:0rem;--stack-align:stretch;--stack-justify:flex-start" class="m_6d731127 mantine-Stack-root"><a style="--button-color:var(--mantine-color-white);margin-bottom:var(--mantine-spacing-xs);padding:0rem;text-decoration:none" class="mantine-focus-auto m_849cf0da mantine-focus-auto m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root m_b6d8b162 mantine-Text-root mantine-Anchor-root" data-underline="hover" href="/courses/php-overview-of-web-development/lessons/microframework/finish_unit?unit=theory" data-disabled="true" data-block="true" disabled=""><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">→</span></span></a><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" data-disabled="true" type="button" disabled=""><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-list-numbers "><path d="M11 6h9"></path><path d="M11 12h9"></path><path d="M12 18h8"></path><path d="M4 16a2 2 0 1 1 4 0c0 .591 -.5 1 -1 1.5l-3 2.5h4"></path><path d="M6 10v-6l-2 2"></path></svg></span></button><button style="--ai-size:var(--ai-size-sm);--ai-bg:transparent;--ai-hover:var(--mantine-color-indigo-light-hover);--ai-color:var(--mantine-color-indigo-light-color);--ai-bd:calc(0.0625rem * var(--mantine-scale)) solid transparent;padding-block:var(--mantine-spacing-lg);color:inherit;width:100%" class="mantine-focus-auto mantine-active m_8d3f4000 mantine-ActionIcon-root m_87cf2631 mantine-UnstyledButton-root" data-variant="subtle" data-size="sm" type="button"><span class="m_8d3afb97 mantine-ActionIcon-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round" class="tabler-icon tabler-icon-message "><path d="M8 9h8"></path><path d="M8 13h6"></path><path d="M18 4a3 3 0 0 1 3 3v8a3 3 0 0 1 -3 3h-5l-5 3v-3h-2a3 3 0 0 1 -3 -3v-8a3 3 0 0 1 3 -3h12"></path></svg></span></button></div></div></div></div></div></div></div>
</main>
<footer class="bg-dark fw-light text-light px-3 py-5">
<div class="row small">
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 mb-3">Хекслет</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/about">О нас</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/testimonials">Отзывы</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://b2b.hexlet.io" role="button">Корпоративное обучение</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/blog">Блог</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/qna">Вопросы и ответы</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/glossary">Глоссарий</a>
</li>
<li>
<span class="nav-link link-light py-1 ps-0 external-link" data-href="https://help.hexlet.io" data-target="_blank" role="button">Справка</span>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" target="_blank" rel="noopener noreferrer" href="/map">Карта сайта</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5 fw-normal mb-3">Направления</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_devops">DevOps
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_data_analytics">Аналитика
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_backend_development">Бэкенд
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_programming">Программирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_testing">Тестирование
</a></li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/courses_front_end_dev">Фронтенд
</a></li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Профессии</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/devops-engineer-from-scratch">DevOps-инженер с нуля</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/go">Go-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/java">Java-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python">Python-разработчик </a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/data-analytics">Аналитик данных</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/qa-engineer">Инженер по ручному тестированию</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php">РНР-разработчик</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/frontend">Фронтенд-разработчик</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-6 col-md-3">
<div class="h5">Навыки</div>
<ul class="list-unstyled">
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/python-django-developer">Django</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/docker">Docker</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/php-laravel-developer">Laravel</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/postman">Postman</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-react-developer">React</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/js-rest-api">REST API в Node.js</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/spring-boot">Spring Boot</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/programs/typescript">Typescript</a>
</li>
</ul>
</div>
</div>
<hr>
<div class="row">
<div class="col-12 col-sm-4 col-md-2">
<div class="fs-4">
<ul class="list-unstyled d-flex">
<li class="me-3">
<a aria-label="Telegram" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://t.me/hexlet_ru"><span class="bi bi-telegram"></span>
</a></li>
<li>
<a aria-label="Youtube" target="_blank" class="link-light" rel="noopener noreferrer nofollow" href="https://www.youtube.com/user/HexletUniversity"><span class="bi bi-youtube"></span>
</a></li>
</ul>
</div>
<div class="mb-2 d-flex flex-column">
<a class="link-light text-decoration-none" rel="nofollow" href="mailto:support@hexlet.io">support@hexlet.io</a>
<a class="link-light text-decoration-none py-2" target="_blank" href="https://t.me/hexlet_help_bot">t.me/hexlet_help_bot</a>
</div>
<ul class="list-unstyled d-flex">
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://hexlet.io/locale/switch?new_locale=en" data-target="_self" role="button"><span class="my-auto">EN</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 opacity-100 external-link" rel="nofollow" data-href="https://ru.hexlet.io/locale/switch?new_locale=ru" data-target="_self" role="button"><span class="my-auto">RU</span>
</span></li>
<li class="me-3">
<span class="link-light text-decoration-none opacity-50 x-font-size-18 external-link" rel="nofollow" data-href="https://kz.hexlet.io/locale/switch?new_locale=kz" data-target="_self" role="button"><span class="my-auto">KZ</span>
</span></li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<ul class="list-unstyled fs-4">
<li class="mb-3">
<a class="link-light text-decoration-none" href="tel:8%20800%20100%2022%2047">8 800 100 22 47</a>
<span class="d-block opacity-50 small">бесплатно по РФ</span>
</li>
<li>
<a class="link-light text-decoration-none" href="tel:%2B7%20495%20085%2021%2062">+7 495 085 21 62</a>
<span class="d-block opacity-50 small">бесплатно по Москве</span>
</li>
</ul>
</div>
<div class="col-12 col-sm-4 col-md-3">
<div class="small mb-3">Образовательные услуги оказываются на основании Л035-01298-77/01989008 от 14.03.2025</div>
<ul class="list-unstyled small">
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/legal">Правовая информация</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/offer">Оферта</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/license">Лицензия</a>
</li>
<li>
<a class="nav-link link-light py-1 ps-0" href="/pages/contacts">Контакты</a>
</li>
</ul>
</div>
<div class="col-12 col-sm-12 col-md-4 small">
<div class="mb-2">
<div>ООО «<a href="/" class="text-decoration-none link-light">Хекслет Рус</a>»</div>
<div>108813 г. Москва, вн.тер.г. поселение Московский,</div>
<div>г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3</div>
<div>ОГРН 1217300010476</div>
<div>ИНН 7325174845</div>
</div>
<hr>
<div>АНО ДПО «<a href="/" class="text-decoration-none link-light">Учебный центр «Хекслет</a>»</div>
<div>119331 г. Москва, вн. тер. г. муниципальный округ</div>
<div>Ломоносовский, пр-кт Вернадского, д. 29</div>
<div>ОГРН 1247700712390</div>
<div>ИНН 7736364948</div>
</div>
</div>
</footer>
<div id="root-assistant-offcanvas"></div>
<script src="/vite/assets/assistant-Bukl1lYy.js" crossorigin="anonymous" type="module"></script><link rel="modulepreload" href="/vite/assets/chunk-DsPFFUou.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/init-BrRXra1y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/ErrorFallbackBlock-naDSYSy9.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/MarkdownBlock-DbyKWoR_.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/gon-D3e4yh1x.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/mantine-CGMYrt2Y.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/shiki-V011pkdv.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/utils-DRqSHbQE.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/routes-CCH8ilKF.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-XR8Qr8kR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dist-GCHh59xr.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/Box-B5-OOzBf.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/notifications.store-C-3AFSMn.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useIsomorphicEffect-HJ6VK0D3.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/lib-KSp6QbZ0.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/axios-BEvgo0ym.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/classnames-l6ipYlLR.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/dayjs.min-BkKovM-s.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/debounce-jMQ_Cf4f.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/i18next-BlSq9s7B.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/client-U9M77rxp.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-dom-DaLxUz_h.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/useTranslation-Bx1Cdrkz.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/compiler-runtime-6XxiPFnt.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/jsx-runtime-CwjcCKJi.js" as="script" crossorigin="anonymous">
<link rel="modulepreload" href="/vite/assets/react-CkL4ZRHB.js" as="script" crossorigin="anonymous">
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v67327c56f0bb4ef8b305cae61679db8f1769101564043" integrity="sha512-rdcWY47ByXd76cbCFzznIcEaCN71jqkWBBqlwhF1SY7KubdLKZiEGeP7AyieKZlGP9hbY/MhGrwXzJC/HulNyg==" data-cf-beacon='{"version":"2024.11.0","token":"d11015b65d11429ea6b4a2ef37dd7e0b","server_timing":{"name":{"cfCacheStatus":true,"cfEdge":true,"cfExtPri":true,"cfL4":true,"cfOrigin":true,"cfSpeedBrain":true},"location_startswith":null}}' crossorigin="anonymous"></script>
</body>
</html>