<!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 15:15:58 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="ESxcEVWORToXKKQ9DyHLwQHRRLBwCd3HGQY1bM8TJZX-_Zcmp_DoWqFrgKUDLju2wdhpGng-I2Wk5q84nRTC-w";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>Просмотр (CRUD) | PHP: Laravel</title>
<meta name="description" content="Просмотр (CRUD) / PHP: Laravel: Учимся выводить конкретную сущность и обрабатывать ошибку 404">
<link rel="canonical" href="https://ru.hexlet.io/courses/php-laravel/lessons/show/theory_unit">
<meta name="robots" content="noarchive">
<meta property="og:title" content="Просмотр (CRUD)">
<meta property="og:title" content="PHP: Laravel">
<meta property="og:description" content="Просмотр (CRUD) / PHP: Laravel: Учимся выводить конкретную сущность и обрабатывать ошибку 404">
<meta property="og:url" content="https://ru.hexlet.io/courses/php-laravel/lessons/show/theory_unit">
<meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="0nKwyNXM37oWD_hdPGS1SvPESYvmVaUqsCw6M-l-_Uo9o3v_J7Jy2qBM3MUwa0U9M81kIe5iW4gNzKBnu3kaJA" />
<script src="/vite/assets/inertia-INZxX8jp.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-nkZBEvfU.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-6pOtQ3OW.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="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzcyMSwicHVyIjoiYmxvYl9pZCJ9fQ==--b4d9b4d245e88f43c7f861ac11e675846937c317/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programmer-bro.png"/><link rel="preload" as="image" href="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NTIxNSwicHVyIjoiYmxvYl9pZCJ9fQ==--ee06f514098550b5ac7eebce6227b1543399a37c/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.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-26T15:15:58.007Z","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":"ndBFxGMdCTJQwz3w5CkSIsIFHbzAMtK6cDFSSJSi6KRyAY7zkWOkUuaAGWjoJuJVAgwwFsgFLBjN0cgcxqUPyg","topics":[{"id":33091,"title":"Вопрос по вот этому заданию\n> Сделайте имя статьи в списке статей ссылкой на конкретную статью.\n\nМы говорим просто о том чтобы выводить имя как ссылку или нужно что-то другое? То есть просто что-то вот такого типа?\n```\n<h2><a href=\"/articles/{{$article->id}}\">{{$article->name}}</a></h2>\n```","plain_title":"Вопрос по вот этому заданию Сделайте имя статьи в списке статей ссылкой на конкретную статью. Мы говорим просто о том чтобы выводить имя как ссылку или нужно что-то другое? То есть просто что-то вот такого типа? <h2><a href=\"/articles/{{$article->id}}\">{{$article->name}}</a></h2> ","creator":{"public_name":"Денис Потехин","id":239601,"is_tutor":false},"comments":[{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":71982,"body":"Да именно так. Только на этом этапе подразумевается что все ссылки делаются через роутинг, а не проставляются руками.","topic_id":33091}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Просмотр (CRUD)","entity_url":null,"active":true}},{"id":51411,"title":"Здравствуйте!\n\nНекоторые комментарии и вопросы по упражнению:\n\n1. В условиях сказано, что Проверка коллекции на пустоту: `$category->articles->isEmpty()`\nВозможно, что удобнее и нагляднее применять метод `isNotEmpty()`\n\n\n\nВозможно, я недопонял материал относительно механизмов работы методов, связующих сущности на основе `hasMany()` и `belongsTo()`, размещенных в модели сущности. В учительском решении это, например, `$category→articles` в `resources/views/article_category/show.blade.php`, [в моем решении](https://ru.hexlet.io/code_reviews/329740?submission_id=463159) это `$articleCategory->articles()->get()` в `app/Http/Controller/ArticleCategoryController.php`.\n\nНемного выбивает то, что, несмотря на одинаковое имя, эти методы могут быть указаны без скобок. А если указать со скобками, то на выходе получим объект, и программа упадет с ошибками. \nПрочитав в обсуждении ответы на вопросы по данной теме и доку по ссылке, понял, что в одном случае мы ведем речь о методах, а в другом - о динамических свойствах.\n\n\nИсходя из этого, два следующих вопроса:\n\n2. Правильно ли я понимаю, что, используя такой метод со скобками - `$category→articles()` мы получим объект с вложенными объектами статей, а в случае использования метода без скобок,то есть динамического свойства - `$category→articles`, мы получим массив строковых значений (если в основе метода `hasMany()`), или строковое значение (если в основе метода `belongsTo()`)? В обоих ли случаях происходит обращение к базе данных?\n\n3. В случае, если происходит обращение к базе данных каждый раз при вызове подобных динамических свойств, как `$category→articles`, то почему мы делаем это в шаблоне, а не в контроллере?\n\nВозможно это больше вопрос по теме [PHP: Eloquent (ORM) / Связи](https://ru.hexlet.io/courses/php-orm-eloquent/lessons/relations/theory_unit), но как-то возник он именно при решении текущего упражнения.\n\n\nСпасибо.","plain_title":"Здравствуйте! Некоторые комментарии и вопросы по упражнению: В условиях сказано, что Проверка коллекции на пустоту: $category->articles->isEmpty() Возможно, что удобнее и нагляднее применять метод isNotEmpty() Возможно, я недопонял материал относительно механизмов работы методов, связующих сущности на основе hasMany() и belongsTo(), размещенных в модели сущности. В учительском решении это, например, $category→articles в resources/views/article_category/show.blade.php, в моем решении (https://ru.hexlet.io/code_reviews/329740?submission_id=463159) это $articleCategory->articles()->get() в app/Http/Controller/ArticleCategoryController.php. Немного выбивает то, что, несмотря на одинаковое имя, эти методы могут быть указаны без скобок. А если указать со скобками, то на выходе получим объект, и программа упадет с ошибками. Прочитав в обсуждении ответы на вопросы по данной теме и доку по ссылке, понял, что в одном случае мы ведем речь о методах, а в другом - о динамических свойствах. Исходя из этого, два следующих вопроса: Правильно ли я понимаю, что, используя такой метод со скобками - $category→articles() мы получим объект с вложенными объектами статей, а в случае использования метода без скобок,то есть динамического свойства - $category→articles, мы получим массив строковых значений (если в основе метода hasMany()), или строковое значение (если в основе метода belongsTo())? В обоих ли случаях происходит обращение к базе данных? В случае, если происходит обращение к базе данных каждый раз при вызове подобных динамических свойств, как $category→articles, то почему мы делаем это в шаблоне, а не в контроллере? Возможно это больше вопрос по теме PHP: Eloquent (ORM) / Связи (https://ru.hexlet.io/courses/php-orm-eloquent/lessons/relations/theory_unit), но как-то возник он именно при решении текущего упражнения. Спасибо. ","creator":{"public_name":"Николай Калашников","id":198605,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":109970,"body":"Зависит от проекта. Тут смотрите какая штука. Такой метод загрузки применятся тогда, когда нужно избежать проблемы n + 1, но в этом должна быть потребность. Если еще не читали, то рекомендую книгу [Продуманная оптимизация](http://optimization.guide/), там рассказывается когда вообще нужно задумываться об оптимизации. Эта проблема как раз относится к оптимизации приложения под высокую нагрузку, нужно знать, что такие методы в Laravel существуют, но на данном этапе это больше факультативная тема. В этом курсе она не рассматривается.","topic_id":51411},{"creator":{"public_name":"Николай Калашников","id":198605,"is_tutor":false},"id":109954,"body":"Роман, благодарю Вас за ответ!\nА насколько часто в реальной практической разработке на Laravel используются все эти виды `Eager Loading`?\n- Eager Loading Multiple Relationships\n- Nested Eager Loading\n- Lazy Eager Loading\n- Constraining Eager Loads\n\nПолучается, что при каждом использовании в шаблоне динамического свойства `$book→author`, если мы работаем с коллекцией `$books` через `foreach`, мы получаем множество лишних запросов к БД: на каждый элемент коллекции по 1 дополнительному запросу.\nПолучается, что для всех динамических свойств, базирующихся на связи `belongsTo` и при этом точно использующихся в шаблоне мы по умолчанию должны в контроллере прописывать запись типа \n```\n$books = App\\Book::with('author')→get()\n``` \nили же в шаблоне перед использованием динамических свойств прописывать:\n```\nif ($someCondition) {\n $books->load('author', 'publisher');\n}\n```\nВсе правильно?","topic_id":51411},{"creator":{"public_name":"Николай Калашников","id":198605,"is_tutor":false},"id":109971,"body":"Спасибо, Роман! Книгу бегло просматривал. Это, в принципе, я и хотел узнать, что данные ухищрения применяются только при оптимизации под высокую нагрузку.","topic_id":51411},{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":109933,"body":"Приветствую!\n\n1. Спасибо, Николай! Добавил `isNotEmpty()` в шаблон. Можете выполнить сброс, чтобы увидеть изменения.\n2. Да, в случае использования метода `articles()` мы получим экземпляр Eloquent. В случае с динамическим свойством `articles` в итоге получается экземпляр Collections, если в выборке будет несколько значений или же строка в случае одного значения. Если выполнить `$category->articles()->get()`, то результат будет аналогичный. Динамические свойства загружают данные в момент когда к ним производится доступ, то есть загружаются лениво (lazy loading). Об этой проблеме и о том, как она решается, если это необходимо, можно почитать тут [Relationship Methods Vs. Dynamic Properties](https://laravel.su/docs/5.7/eloquent-relationships#relationship-methods-vs-dynamic-properties) и тут [Eager Loading](https://laravel.su/docs/5.7/eloquent-relationships#eager-loading). Статьи по версии 5.7, тем не менее методы, о которых там рассказывается актуальны по сей день. Вот, например, ссылка на API — [method_with](https://laravel.com/api/8.x/Illuminate/Database/Eloquent/Model.html#method_with)\n3. Это общепринятый подход. Так поступают во всех фреймворках, не только в Laravel на PHP, но и в других языках.\n","topic_id":51411}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Просмотр (CRUD)","entity_url":null,"active":true}},{"id":49713,"title":"Здравствуйте, при клике на любую статью появляется ошибка: Undefined offset: 1. Подскажите, что не так. https://ru.hexlet.io/code_reviews/343906","plain_title":"Здравствуйте, при клике на любую статью появляется ошибка: Undefined offset: 1. Подскажите, что не так. ","creator":{"public_name":"Мария","id":297489,"is_tutor":false},"comments":[{"creator":{"public_name":"Мария","id":297489,"is_tutor":false},"id":106656,"body":"**Роман Ашиков**, Спасибо, поправила)","topic_id":49713},{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":106588,"body":"Приветствую, Мария!\n\nЧтобы ответить на этот вопрос нужно заняться отладкой и проверить, что происходит в соответствующем шаблоне и обработчике. У нас возникает проблема при переходе к просмотру отдельной статьи. Соответственно нужно искать проблему в _article/show.blade.php_. Обратите внимание на то, нужен ли нам тут цикл `foreach`? По условиям задачи нужно добавить только ссылку на категорию. \n\nА также проверьте, `category()` это точно метод `$article`?","topic_id":49713}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Просмотр (CRUD)","entity_url":null,"active":true}},{"id":31235,"title":"Здравствуйте! Подскажите как можно сделать ссылку на каждую статью (3 задание) через именованный маршрут и route? Как в эту конструкцию route('articles.show') подставить id статьи? ","plain_title":"Здравствуйте! Подскажите как можно сделать ссылку на каждую статью (3 задание) через именованный маршрут и route? Как в эту конструкцию route('articles.show') подставить id статьи? ","creator":{"public_name":"Андрей Захватошин","id":183403,"is_tutor":false},"comments":[{"creator":{"public_name":"Андрей Захватошин","id":183403,"is_tutor":false},"id":67888,"body":"Вот так? $url = route('routeName', ['id' => 1]);","topic_id":31235},{"creator":{"public_name":"Evgen Guba","id":232968,"is_tutor":false},"id":69443,"body":"**Kirill Mokevnin**,а как в tinker получить доступ к переменной `$article`?","topic_id":31235},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":67953,"body":"Попробуйте. Прямо предлагаю зайти в tinker и там подергать эту функцию. Полюбите репл :D","topic_id":31235},{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":67884,"body":"В [документации](https://laravel.com/docs/5.8/helpers#method-route) есть пример с передачей параметров, вы ее видели?","topic_id":31235},{"creator":{"public_name":"Максим Латухин","id":209427,"is_tutor":false},"id":102672,"body":"честно говоря, может это только я тупил, но из документации я не понял, как надо использовать в коде шаблона: $url = route('routeName', ['id' => 1]);.\nСтало ясно, когда я увидел пример записи: <a href=\"{{ route('articles.show') }}\">{{ $article->name }}</a>","topic_id":31235}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Просмотр (CRUD)","entity_url":null,"active":true}},{"id":48665,"title":"> @foreach($category->articles as $article)\n\nНе пойму, откуда в категории взялись вдруг статьи?\n\n```\nApp\\ArticleCategory {#3062\n id: 1,\n name: \"Deserunt rem earum eius sit animi.\",\n description: \"Dolores praesentium in et ...\",\n state: \"created\",\n created_at: \"2020-10-22 19:46:00\",\n updated_at: \"2020-10-22 19:46:00\",\n }\n>>> \n```","plain_title":"@foreach($category->articles as $article) Не пойму, откуда в категории взялись вдруг статьи? App\\ArticleCategory {#3062 id: 1, name: \"Deserunt rem earum eius sit animi.\", description: \"Dolores praesentium in et ...\", state: \"created\", createdat: \"2020-10-22 19:46:00\", updatedat: \"2020-10-22 19:46:00\", } ","creator":{"public_name":"Pavel Se","id":75108,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":104479,"body":"Приветствую, Павел!\n\nЭто тестовые данные, которые добавлены в базу для удобства отладки в Web-доступе. Можно увидеть как реализовано наполнение БД этими данными в каталоге database/migrations. В частности, в файле с именем populate_data.php.","topic_id":48665}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Просмотр (CRUD)","entity_url":null,"active":true}},{"id":33032,"title":"`ArticleCategoryController` отсутствует, необходимо его создавать?","plain_title":"ArticleCategoryController отсутствует, необходимо его создавать? ","creator":{"public_name":"Nikolai Gagarinov","id":104929,"is_tutor":true},"comments":[{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":71953,"body":"Пофиксил!","topic_id":33032}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Просмотр (CRUD)","entity_url":null,"active":true}},{"id":59197,"title":"Задание жутко сбивает с толку. Вроде бы написано, что нужно сделать в конкретном файле, но по сути половина задания относится уже к другому файлу (например, сказано реализовать что-то в контроллере, а в решении это реализовано во вью). Или так специально сделано?","plain_title":"Задание жутко сбивает с толку. Вроде бы написано, что нужно сделать в конкретном файле, но по сути половина задания относится уже к другому файлу (например, сказано реализовать что-то в контроллере, а в решении это реализовано во вью. Или так специально сделано? ","creator":{"public_name":"","id":381412,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":125140,"body":"Спасибо, что обратили внимание! Я подкорректировал условия задачи. Теперь должно быть понятней, что в итоге нужно сделать в конкретных файлах. Чтобы обновить упражнение, выполните сброс.","topic_id":59197}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Просмотр (CRUD)","entity_url":null,"active":true}},{"id":50334,"title":"Не могу понять, как ваш контроллер получает список статей, при том что любая информация о статьях в таблице категорий отсутствует:\n\n```\n/usr/src/app$ make console\nphp artisan tinker\nPsy Shell v0.10.4 (PHP 7.4.3 — cli) by Justin Hileman\n>>> DB::getSchemaBuilder()->getColumnListing('article_categories')\n=> [\n \"id\",\n \"name\",\n \"description\",\n \"state\",\n \"created_at\",\n \"updated_at\",\n ]\n>>> \n```\n\nМой код в ревью конечно длиннее\nhttps://ru.hexlet.io/code_reviews/351261?submission_id=445218\n\n\n","plain_title":"Не могу понять, как ваш контроллер получает список статей, если любая информация о статьях в таблице категорий отсутсвует. Мой код в ревью конечно длиннее https://ru.hexlet.io/codereviews/351261?submissionid=445218 Делаю и получаю /usr/src/app$ make console php artisan tinker Psy Shell v0.10.4 (PHP 7.4.3 — cli) by Justin Hileman DB::getSchemaBuilder()->getColumnListing('articlecategories') => [ \"id\", \"name\", \"description\", \"state\", \"createdat\", \"updated_at\", ] ","creator":{"public_name":"Konstantin Zharinov","id":181349,"is_tutor":false},"comments":[{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":107858,"body":"Приветствую, Константин!\n\nВ коде, который вы приводите, используется метод `getColumnListing()`, который возвращает массив имён полей таблицы, но не данные которые в ней содержутся. Попробуйте сделать так:\n\n $categories = DB::table('article_categories')->get();\n\nЕсли использовать модели, аналогичный результат мы получим таким образом:\n\n $categories = App\\Models\\ArticleCategory::all();\n\nНаполнение базы данных происходит через миграции с использованием фабрик. Как это происходит можно посмотреть в файле: *database/migrations/2020_03_21_140208_populate_data.php*","topic_id":50334},{"creator":{"public_name":"Roman Ashikov","id":226258,"is_tutor":true},"id":108019,"body":"Дело тут не в возврате из контроллера, а в динамических свойствах, которые предоставляет Eloquent. Мы можем получить доступ к статьям связанным с нашей категорией через свойство `articles` экземпляра модели `ArticleCategory`.\n\nВзгляните в документацию — https://laravel.com/docs/8.x/eloquent-relationships#one-to-many Чуть ниже примера с определением отношения объясняется этот момент.","topic_id":50334},{"creator":{"public_name":"Konstantin Zharinov","id":181349,"is_tutor":false},"id":107990,"body":"**Роман Ашиков**, чуда не произошло, вообще непонятно, откуда в возврате из контроллера появляются статьи:\n\n```\n>>> $category = App\\Models\\ArticleCategory::findOrFail(1)\n=> App\\Models\\ArticleCategory {#3303\n id: 1,\n name: \"Optio ut eos nobis occaecati aperiam.\",\n description: \"Et esse reprehenderit velit et ex magni. Animi assumenda modi animi dolores animi sit. Possimus quasi minima numquam explicabo.\",\n state: \"created\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n }\n>>> \n```\n\n```\n/usr/src/app$ make console\nphp artisan tinker\nPsy Shell v0.10.4 (PHP 7.4.3 — cli) by Justin Hileman\n>>> $categories = DB::table('article_categories')->get();\n=> Illuminate\\Support\\Collection {#3270\n all: [\n {#3268\n +\"id\": 1,\n +\"name\": \"Optio ut eos nobis occaecati aperiam.\",\n +\"description\": \"Et esse reprehenderit velit et ex magni. Animi assumenda modi animi dolores animi sit. Possimus quasi minima numquam explicabo.\",\n +\"state\": \"created\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3266\n +\"id\": 2,\n +\"name\": \"Deleniti excepturi exercitationem rerum voluptatem voluptatem consequatur.\",\n +\"description\": \"Sed est nisi nam ratione non quis incidunt. Adipisci et quo culpa aspernatur facere ut. Iusto omnis amet ea cupiditate ut.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3275\n +\"id\": 3,\n +\"name\": \"Ducimus et accusantium aperiam quas.\",\n +\"description\": \"Beatae non aut quia. Omnis rerum nostrum corporis sit. Perspiciatis est aut necessitatibus. Ab ut ut optio fugiat voluptates quibusdam et.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3277\n +\"id\": 4,\n +\"name\": \"Voluptatibus illo aut est officia neque ratione.\",\n +\"description\": \"Magnam aut adipisci sit necessitatibus odio. Consequuntur earum sed quisquam sed qui.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3278\n +\"id\": 5,\n +\"name\": \"Molestiae amet eum laudantium unde omnis.\",\n +\"description\": \"Aspernatur neque ut est porro. Magnam maiores accusantium eaque ducimus. Tempore ut dolore similique reiciendis ad consequatur harum nam. Modi dolorum quo veritatis ipsum error voluptatem vitae.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3279\n +\"id\": 6,\n +\"name\": \"Facere cupiditate eos velit et rerum adipisci ut.\",\n +\"description\": \"Esse expedita illum consectetur culpa sequi fuga ut. Officiis maiores culpa possimus numquam quae.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3280\n +\"id\": 7,\n +\"name\": \"Labore quis quo ipsum ad.\",\n +\"description\": \"Reprehenderit nemo eius tempore optio sed impedit corrupti id. Qui reiciendis animi et sequi. Est officiis tempore quia eum ut non atque. Voluptatem tempore nemo facilis et voluptatem.\",\n +\"state\": \"created\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3281\n +\"id\": 8,\n +\"name\": \"Enim est nulla qui voluptas et beatae.\",\n +\"description\": \"Illo dolorem dolorem facilis doloremque nulla nostrum optio. Officiis error quia esse iste et quos quidem. Alias soluta assumenda nihil nam veritatis ad et.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3282\n +\"id\": 9,\n +\"name\": \"Et odio expedita perspiciatis tenetur magnam commodi fugit iure.\",\n +\"description\": \"Sunt qui aut quia voluptatem. Et labore qui harum sit occaecati. Repellendus et a minus quisquam aut numquam.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3283\n +\"id\": 10,\n +\"name\": \"Quis aperiam qui vero aut sit eum.\",\n +\"description\": \"Doloribus fugiat sed aut sit vero. Odit laborum nostrum quibusdam esse in. Dolorem dolorem odio cum ut. Laborum impedit dolorem et assumenda eos aspernatur.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3284\n +\"id\": 11,\n +\"name\": \"Culpa exercitationem quod quia.\",\n +\"description\": \"Nihil aliquid perspiciatis harum quos accusamus. Nam est esse aliquam aut. Enim consequatur quasi rerum laboriosam.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3285\n +\"id\": 12,\n +\"name\": \"Alias possimus delectus a dolorem.\",\n +\"description\": \"Rerum nostrum maiores ex nihil doloremque. Consequuntur possimus doloremque praesentium rerum nostrum nostrum dolores. Ut atque recusandae quod iure.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3286\n +\"id\": 13,\n +\"name\": \"Enim ex aut placeat exercitationem.\",\n +\"description\": \"Quisquam aut magnam quaerat sed et nostrum blanditiis ipsam. Commodi officia magnam earum aut ducimus. Ullam cupiditate inventore voluptas sed corporis. Ea dicta quia voluptates hic odio sit.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3287\n +\"id\": 14,\n +\"name\": \"Nesciunt quidem non est nam.\",\n +\"description\": \"Qui rem quia voluptatibus repudiandae fuga. Maiores pariatur et ipsam nostrum totam optio qui nam. Quos vel numquam est quia magni accusantium reiciendis omnis.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3288\n +\"id\": 15,\n +\"name\": \"Non veritatis pariatur dolor numquam impedit.\",\n +\"description\": \"Sint repellendus non consequatur repellendus eius. Et officiis dolorum perferendis enim odio velit. Sunt et soluta ut asperiores voluptates. Et sint accusantium maiores.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3289\n +\"id\": 16,\n +\"name\": \"Quia quasi dolor error vitae iusto.\",\n +\"description\": \"Animi harum est ut inventore. Et molestias architecto molestiae illum est. Et molestias ut dolor non beatae. Beatae et exercitationem omnis ipsam.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3290\n +\"id\": 17,\n +\"name\": \"Molestiae eos non numquam odit et est.\",\n +\"description\": \"Et molestiae assumenda qui. Qui enim est excepturi repellat in amet. Enim et quia praesentium dolorum. Consequatur illum dolores quam. Odio nihil voluptas assumenda expedita aspernatur aut.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3291\n +\"id\": 18,\n +\"name\": \"Non eum et voluptas.\",\n +\"description\": \"Tenetur saepe error odit deserunt. Natus officia asperiores ipsa. Reprehenderit est consequatur debitis similique impedit architecto. Qui mollitia sint est nam tempore necessitatibus dicta.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3292\n +\"id\": 19,\n +\"name\": \"Incidunt illo et id qui molestiae consequatur qui.\",\n +\"description\": \"Pariatur est porro quam molestias. Sequi laborum hic ut asperiores. Et itaque nemo sequi illo. Error quae asperiores voluptatem error.\",\n +\"state\": \"created\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3293\n +\"id\": 20,\n +\"name\": \"Nemo sequi error quisquam aspernatur iure vero soluta.\",\n +\"description\": \"Laboriosam mollitia molestiae architecto aut. Quia vel fugiat est fugit assumenda. Sunt explicabo iusto ut illum beatae. Et magni vero magni repudiandae cupiditate.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3294\n +\"id\": 21,\n +\"name\": \"Pariatur laudantium aperiam pariatur voluptate.\",\n +\"description\": \"Ad explicabo at sed. Et assumenda recusandae necessitatibus libero aut eum. Et rem sit quibusdam non. Iste soluta exercitationem quisquam dignissimos soluta. Ex dignissimos rerum quod id aliquid est.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3295\n +\"id\": 22,\n +\"name\": \"Ex vel rem ea voluptas nam quia.\",\n +\"description\": \"Recusandae quis nostrum rerum tempore. Quasi et deleniti explicabo laborum et sed voluptatem. Praesentium et eos natus voluptatem maiores.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3296\n +\"id\": 23,\n +\"name\": \"Magni soluta et placeat occaecati rerum blanditiis nobis.\",\n +\"description\": \"Excepturi in et veritatis doloremque. Et ut et culpa necessitatibus error et autem. Alias dolorem qui autem omnis explicabo cumque repudiandae.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3297\n +\"id\": 24,\n +\"name\": \"Soluta autem id corporis porro libero sed nulla.\",\n +\"description\": \"Quae nesciunt repudiandae enim et est qui. Quo hic esse repellat est non fugit. Est dolorem tempora vero tempore qui voluptas. Aliquid nostrum ut iusto ipsum quis error nihil.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3298\n +\"id\": 25,\n +\"name\": \"Voluptatem pariatur consequatur a pariatur.\",\n +\"description\": \"Et voluptate eius iste deserunt. At impedit iure cupiditate. Qui tempora ipsa harum possimus.\",\n +\"state\": \"created\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3299\n +\"id\": 26,\n +\"name\": \"Optio repellendus dolores itaque vitae necessitatibus tempore.\",\n +\"description\": \"Ratione delectus fugiat et sunt sit excepturi. Quia itaque eaque aut expedita possimus. Provident ea et vel cum dolore et.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3300\n +\"id\": 27,\n +\"name\": \"Non quis aut est vel laudantium maxime.\",\n +\"description\": \"Ipsam dignissimos hic possimus harum. Soluta laudantium qui labore rem odit consequatur corporis. In cumque officia eum a voluptatem. Porro ut earum commodi doloribus.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3301\n +\"id\": 28,\n +\"name\": \"Hic natus quibusdam recusandae dolores.\",\n +\"description\": \"Eveniet voluptates ut placeat voluptas. Qui voluptatibus qui doloribus sit laudantium aperiam. In voluptates dolores quibusdam neque facere accusamus explicabo.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3302\n +\"id\": 29,\n +\"name\": \"Voluptas numquam rem rerum quisquam illo modi.\",\n +\"description\": \"Minus ut et quaerat vitae recusandae molestiae. Amet eos totam ea consequatur id cumque. Et omnis facere est et vero nam. Minus recusandae sint ut omnis voluptatibus aut.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n {#3303\n +\"id\": 30,\n +\"name\": \"Quis doloribus est et aperiam.\",\n +\"description\": \"Voluptas et culpa non. Modi a velit iste repellat aut. Molestias similique dolorum cumque ut ducimus.\",\n +\"state\": \"published\",\n +\"created_at\": \"2020-12-15 06:16:58\",\n +\"updated_at\": \"2020-12-15 06:16:58\",\n },\n ],\n }\n\n```\n\n\n```\n>>> $categories = App\\Models\\ArticleCategory::all();\n=> Illuminate\\Database\\Eloquent\\Collection {#4257\n all: [\n App\\Models\\ArticleCategory {#4258\n id: 1,\n name: \"Optio ut eos nobis occaecati aperiam.\",\n description: \"Et esse reprehenderit velit et ex magni. Animi assumenda modi animi dolores animi sit. Possimus quasi minima numquam explicabo.\",\n state: \"created\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4259\n id: 2,\n name: \"Deleniti excepturi exercitationem rerum voluptatem voluptatem consequatur.\",\n description: \"Sed est nisi nam ratione non quis incidunt. Adipisci et quo culpa aspernatur facere ut. Iusto omnis amet ea cupiditate ut.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4260\n id: 3,\n name: \"Ducimus et accusantium aperiam quas.\",\n description: \"Beatae non aut quia. Omnis rerum nostrum corporis sit. Perspiciatis est aut necessitatibus. Ab ut ut optio fugiat voluptates quibusdam et.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4261\n id: 4,\n name: \"Voluptatibus illo aut est officia neque ratione.\",\n description: \"Magnam aut adipisci sit necessitatibus odio. Consequuntur earum sed quisquam sed qui.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4262\n id: 5,\n name: \"Molestiae amet eum laudantium unde omnis.\",\n description: \"Aspernatur neque ut est porro. Magnam maiores accusantium eaque ducimus. Tempore ut dolore similique reiciendis ad consequatur harum nam. Modi dolorum quo veritatis ipsum error voluptatem vitae.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4263\n id: 6,\n name: \"Facere cupiditate eos velit et rerum adipisci ut.\",\n description: \"Esse expedita illum consectetur culpa sequi fuga ut. Officiis maiores culpa possimus numquam quae.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4264\n id: 7,\n name: \"Labore quis quo ipsum ad.\",\n description: \"Reprehenderit nemo eius tempore optio sed impedit corrupti id. Qui reiciendis animi et sequi. Est officiis tempore quia eum ut non atque. Voluptatem tempore nemo facilis et voluptatem.\",\n state: \"created\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4265\n id: 8,\n name: \"Enim est nulla qui voluptas et beatae.\",\n description: \"Illo dolorem dolorem facilis doloremque nulla nostrum optio. Officiis error quia esse iste et quos quidem. Alias soluta assumenda nihil nam veritatis ad et.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4266\n id: 9,\n name: \"Et odio expedita perspiciatis tenetur magnam commodi fugit iure.\",\n description: \"Sunt qui aut quia voluptatem. Et labore qui harum sit occaecati. Repellendus et a minus quisquam aut numquam.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4267\n id: 10,\n name: \"Quis aperiam qui vero aut sit eum.\",\n description: \"Doloribus fugiat sed aut sit vero. Odit laborum nostrum quibusdam esse in. Dolorem dolorem odio cum ut. Laborum impedit dolorem et assumenda eos aspernatur.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4268\n id: 11,\n name: \"Culpa exercitationem quod quia.\",\n description: \"Nihil aliquid perspiciatis harum quos accusamus. Nam est esse aliquam aut. Enim consequatur quasi rerum laboriosam.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4269\n id: 12,\n name: \"Alias possimus delectus a dolorem.\",\n description: \"Rerum nostrum maiores ex nihil doloremque. Consequuntur possimus doloremque praesentium rerum nostrum nostrum dolores. Ut atque recusandae quod iure.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4270\n id: 13,\n name: \"Enim ex aut placeat exercitationem.\",\n description: \"Quisquam aut magnam quaerat sed et nostrum blanditiis ipsam. Commodi officia magnam earum aut ducimus. Ullam cupiditate inventore voluptas sed corporis. Ea dicta quia voluptates hic odio sit.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4271\n id: 14,\n name: \"Nesciunt quidem non est nam.\",\n description: \"Qui rem quia voluptatibus repudiandae fuga. Maiores pariatur et ipsam nostrum totam optio qui nam. Quos vel numquam est quia magni accusantium reiciendis omnis.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4272\n id: 15,\n name: \"Non veritatis pariatur dolor numquam impedit.\",\n description: \"Sint repellendus non consequatur repellendus eius. Et officiis dolorum perferendis enim odio velit. Sunt et soluta ut asperiores voluptates. Et sint accusantium maiores.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4273\n id: 16,\n name: \"Quia quasi dolor error vitae iusto.\",\n description: \"Animi harum est ut inventore. Et molestias architecto molestiae illum est. Et molestias ut dolor non beatae. Beatae et exercitationem omnis ipsam.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4274\n id: 17,\n name: \"Molestiae eos non numquam odit et est.\",\n description: \"Et molestiae assumenda qui. Qui enim est excepturi repellat in amet. Enim et quia praesentium dolorum. Consequatur illum dolores quam. Odio nihil voluptas assumenda expedita aspernatur aut.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4275\n id: 18,\n name: \"Non eum et voluptas.\",\n description: \"Tenetur saepe error odit deserunt. Natus officia asperiores ipsa. Reprehenderit est consequatur debitis similique impedit architecto. Qui mollitia sint est nam tempore necessitatibus dicta.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4276\n id: 19,\n name: \"Incidunt illo et id qui molestiae consequatur qui.\",\n description: \"Pariatur est porro quam molestias. Sequi laborum hic ut asperiores. Et itaque nemo sequi illo. Error quae asperiores voluptatem error.\",\n state: \"created\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4277\n id: 20,\n name: \"Nemo sequi error quisquam aspernatur iure vero soluta.\",\n description: \"Laboriosam mollitia molestiae architecto aut. Quia vel fugiat est fugit assumenda. Sunt explicabo iusto ut illum beatae. Et magni vero magni repudiandae cupiditate.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4278\n id: 21,\n name: \"Pariatur laudantium aperiam pariatur voluptate.\",\n description: \"Ad explicabo at sed. Et assumenda recusandae necessitatibus libero aut eum. Et rem sit quibusdam non. Iste soluta exercitationem quisquam dignissimos soluta. Ex dignissimos rerum quod id aliquid est.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4279\n id: 22,\n name: \"Ex vel rem ea voluptas nam quia.\",\n description: \"Recusandae quis nostrum rerum tempore. Quasi et deleniti explicabo laborum et sed voluptatem. Praesentium et eos natus voluptatem maiores.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4280\n id: 23,\n name: \"Magni soluta et placeat occaecati rerum blanditiis nobis.\",\n description: \"Excepturi in et veritatis doloremque. Et ut et culpa necessitatibus error et autem. Alias dolorem qui autem omnis explicabo cumque repudiandae.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4281\n id: 24,\n name: \"Soluta autem id corporis porro libero sed nulla.\",\n description: \"Quae nesciunt repudiandae enim et est qui. Quo hic esse repellat est non fugit. Est dolorem tempora vero tempore qui voluptas. Aliquid nostrum ut iusto ipsum quis error nihil.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4282\n id: 25,\n name: \"Voluptatem pariatur consequatur a pariatur.\",\n description: \"Et voluptate eius iste deserunt. At impedit iure cupiditate. Qui tempora ipsa harum possimus.\",\n state: \"created\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4283\n id: 26,\n name: \"Optio repellendus dolores itaque vitae necessitatibus tempore.\",\n description: \"Ratione delectus fugiat et sunt sit excepturi. Quia itaque eaque aut expedita possimus. Provident ea et vel cum dolore et.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4284\n id: 27,\n name: \"Non quis aut est vel laudantium maxime.\",\n description: \"Ipsam dignissimos hic possimus harum. Soluta laudantium qui labore rem odit consequatur corporis. In cumque officia eum a voluptatem. Porro ut earum commodi doloribus.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4285\n id: 28,\n name: \"Hic natus quibusdam recusandae dolores.\",\n description: \"Eveniet voluptates ut placeat voluptas. Qui voluptatibus qui doloribus sit laudantium aperiam. In voluptates dolores quibusdam neque facere accusamus explicabo.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4286\n id: 29,\n name: \"Voluptas numquam rem rerum quisquam illo modi.\",\n description: \"Minus ut et quaerat vitae recusandae molestiae. Amet eos totam ea consequatur id cumque. Et omnis facere est et vero nam. Minus recusandae sint ut omnis voluptatibus aut.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n App\\Models\\ArticleCategory {#4287\n id: 30,\n name: \"Quis doloribus est et aperiam.\",\n description: \"Voluptas et culpa non. Modi a velit iste repellat aut. Molestias similique dolorum cumque ut ducimus.\",\n state: \"published\",\n created_at: \"2020-12-15 06:16:58\",\n updated_at: \"2020-12-15 06:16:58\",\n },\n ],\n }\n>>> \n\n```","topic_id":50334}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Просмотр (CRUD)","entity_url":null,"active":true}},{"id":30430,"title":">Параметр id определенный в маршруте, приходит в обработчик как аргумент. Его имя может быть любым, **Laravel на него не опирается**.\n\nВроде и понятно, но звучит как-то не по русски. Может написать, что в качестве параметра может использоваться любой атрибут (свойство, поле), обладающий свойством уникальности, при этом имя параметра в определении метода никак не связано с названием передаваемого атрибута?","plain_title":"Параметр id определенный в маршруте, приходит в обработчик как аргумент. Его имя может быть любым, Laravel на него не опирается. Вроде и понятно, но звучит как-то не по русски. Может написать, что в качестве параметра может использоваться любой атрибут (свойство, поле), обладающий свойством уникальности, при этом имя параметра в определении метода никак не связано с названием передаваемого атрибута? ","creator":{"public_name":"Валерий Турбанов","id":230983,"is_tutor":false},"comments":[{"creator":{"public_name":"Kirill Mokevnin","id":1,"is_tutor":false},"id":66052,"body":"Поправил, спасибо!","topic_id":30430}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Просмотр (CRUD)","entity_url":null,"active":true}},{"id":39860,"title":"Здравствуйте, у меня вопрос: как именно работает хелпер `route()`, дело в том, что в зависимости от контекста ссылка формируется корректно или некорректно.\nНапример вызов `route('article_categories.show', ['id' => '$article->catgory_id'])` всегда ведет себя ожидаемо (в документации именно такой вызов), передает `id` в аргумент маршрута, в решении преподавателя есть вызов, который получает вторым аргументом элемент коллекции `route('article_categories.show', $article)`, иногда такой вызов не передает `id` в маршрут. Где я затупил?","plain_title":"Здравствуйте, у меня вопрос: как именно работает хелпер route(), дело в том, что в зависимости от контекста ссылка формируется корректно или некорректно. Напримервызов route('article_categories.show', ['id' => '$article->catgory_id']) всегда ведет себя ожидаемо, передает id в аргумент маршрута, в решении преподавателя есть вызов, который получает вторым аргументом элемент коллекции route('article_categories.show', $article), иногда такой вызов не передает id в маршрут. Где я затупил? ","creator":{"public_name":"Олег Холык","id":159098,"is_tutor":false},"comments":[{"creator":{"public_name":"Юрий Бачевский","id":63379,"is_tutor":false},"id":107274,"body":"**Станислав Дзисяк**, а можете подсказать почему должно работать так и так?\nДля меня совсем не очевидно что можно просто объект передать?!\nВ доках показан пример с массивом https://laravel.com/docs/8.x/helpers#method-route и только.\n\nМожет я плохо понял какую-то из предыдущих тем? Объясните пожалуйста.","topic_id":39860},{"creator":{"public_name":"Виталий Кудрявцев","id":128341,"is_tutor":false},"id":108519,"body":"**Станислав Дзисяк**,присоединяюсь к вопросу. Не понятно почему можно передать в route целиком объект, а не только его id. Magic...","topic_id":39860},{"creator":{"public_name":"Артур Крючок","id":253055,"is_tutor":false},"id":108522,"body":"С аналогичным вопросом про id, и к тому же название категории в статье я выводил как {{ $article->category->name }} в решении учителя просто {{ $article->category }}\n\nОткуда Lara знает какое значение из модели категории нужно показать здесь?","topic_id":39860},{"creator":{"public_name":"Олег Холык","id":159098,"is_tutor":false},"id":87406,"body":"**Станислав Дзисяк**, \nфайл views/article/show.blade.php (из блока \"Просмотр (CRUD)\"\n```\n@section('content')\n <h1>{{$article->name}}</h1>\n {{-- BEGIN (write your solution here) --}}\n // передает\n // <a href=\"{{ route('article_categories.show', ['id' => '$article->category_id']) }}\">{{ $article->category }}</a>\n \n // не передает (решение преподавателя) тест не проходит\n <a href=\"{{ route('article_categories.show', $article->category) }}\">{{ $article->category }}</a>\n {{-- END --}}\n <div>{{$article->body}}</div>\n@endsection\n```","topic_id":39860},{"creator":{"public_name":"Stanislav Dzisiak","id":212236,"is_tutor":true},"id":87401,"body":"Приветствую, Олег!\n\n> иногда такой вызов не передает id в маршрут. \n\nА можете привести пример, когда id не передаётся.","topic_id":39860},{"creator":{"public_name":"Stanislav Dzisiak","id":212236,"is_tutor":true},"id":87531,"body":"Приветствую, Олег!\n\nВообще-то должно и так и так работать. Отправьте на ревью нерабочее решение, а в сообщение вложите на него ссылку. Я посмотрю и помогу разобраться с вашим вопросом.","topic_id":39860},{"creator":{"public_name":"Nikolay","id":231693,"is_tutor":false},"id":115648,"body":"Вопрос так и остался без ответа :(","topic_id":39860}],"communitable":{"parent_entity_name":null,"parent_entity_url":null,"entity_name":"Просмотр (CRUD)","entity_url":null,"active":true}}],"lesson":{"exercise":{"id":980,"slug":"php_laravel_show_exercise","name":null,"state":"active","kind":"exercise","language":"php","locale":"ru","has_web_view":true,"has_test_view":false,"reviewable":true,"readme":"В этом упражнении нужное реализовать страницу категории, на которой выводится список статей этой категории.\n\n## routes/web.php\n\nРеализуйте маршрут _article_categories/{id}_ и свяжите его с _show_ экшеном контроллера _ArticleCategoryController_. Сделайте маршрут именованным.\n\n## app/Http/Controllers/ArticleCategoryController.php\n\n* Создайте экшен _show_.\n* Извлеките из базы текущую запрошенную категорию и передайте её в шаблон.\n\n## resources/views/article_category/show.blade.php\n\n* Подключите макет.\n* Выведите имя и описание категории.\n* Выведите список названий статей категории в виде `<ol>` списка. Если статей в категории нет, то тег `<ol>` не должен отображаться. Каждое название – ссылка на саму статью (маршрут подсмотрите в файле роутов).\n\n## resources/views/article/show.blade.php\n\nДобавьте ссылку на категорию статьи рядом с именем статьи.\n\n### Подсказки\n\n* Проверка коллекции на пустоту: `$category->articles->isEmpty()`\n* Список статей категории можно получить так: `$category->articles`\n","prepared_readme":"В этом упражнении нужное реализовать страницу категории, на которой выводится список статей этой категории.\n\n## routes/web.php\n\nРеализуйте маршрут _article_categories/{id}_ и свяжите его с _show_ экшеном контроллера _ArticleCategoryController_. Сделайте маршрут именованным.\n\n## app/Http/Controllers/ArticleCategoryController.php\n\n* Создайте экшен _show_.\n* Извлеките из базы текущую запрошенную категорию и передайте её в шаблон.\n\n## resources/views/article_category/show.blade.php\n\n* Подключите макет.\n* Выведите имя и описание категории.\n* Выведите список названий статей категории в виде `<ol>` списка. Если статей в категории нет, то тег `<ol>` не должен отображаться. Каждое название – ссылка на саму статью (маршрут подсмотрите в файле роутов).\n\n## resources/views/article/show.blade.php\n\nДобавьте ссылку на категорию статьи рядом с именем статьи.\n\n### Подсказки\n\n* Проверка коллекции на пустоту: `$category->articles->isEmpty()`\n* Список статей категории можно получить так: `$category->articles`\n","has_solution":true,"entity_name":"Просмотр (CRUD)"},"units":[{"id":3123,"name":"theory","url":"/courses/php-laravel/lessons/show/theory_unit"},{"id":3391,"name":"quiz","url":"/courses/php-laravel/lessons/show/quiz_unit"},{"id":3388,"name":"exercise","url":"/courses/php-laravel/lessons/show/exercise_unit"}],"links":[],"ordered_units":[{"id":3123,"name":"theory","url":"/courses/php-laravel/lessons/show/theory_unit"},{"id":3391,"name":"quiz","url":"/courses/php-laravel/lessons/show/quiz_unit"},{"id":3388,"name":"exercise","url":"/courses/php-laravel/lessons/show/exercise_unit"}],"id":1476,"slug":"show","state":"approved","name":"Просмотр (CRUD)","course_order":255,"goal":"Учимся выводить конкретную сущность и обрабатывать ошибку 404","self_study":"1. Выполните все шаги из теории.\n1. Убедитесь что при запросе страницы _/articles/<идентификатор>_ у вас выводится конкретная статья.\n1. Сделайте имя статьи в списке статей ссылкой на конкретную статью.\n","theory_video_provider":null,"theory_video_uid":null,"theory":"После того как список готов, можно переходить к просмотру каждого элемента. Как обычно начинаем с маршрутизации:\n\n```php\n<?php\nuse App\\Http\\Controllers\\ArticleController;\n\n# id – параметр, который зависит от ��онкретной статьи\n# Фигурные скобки нужны для описания параметров маршрута\nRoute::get('articles/{id}', [ArticleController::class, 'show'])\n ->name('articles.show');\n```\n\nВ этом месте у маршрута появляется динамическая часть, идентификатор статьи. Подобный маршрут обрабатывает все страницы, имеющие вид `/articles/<идентификатор статьи>`, примеры:\n\n /articles/1\n /articles/100\n /articles/what-is-js\n\nЭтот идентификатор используется в обработчике, для выборки из базы нужной статьи.\n\n```php\n<?php\n\nnamespace App\\Http\\Controllers;\n\nuse App\\Models\\Article;\n\nclass ArticleController extends Controller\n{\n // ... другие обработчики\n\n public function show($id)\n {\n $article = Article::findOrFail($id);\n return view('article.show', compact('article'));\n }\n}\n```\n\nПараметр _id_, определенный в маршруте, приходит в обработчик в виде аргумента. Имя этого аргумента может быть любым, для Laravel имеет значение только порядок. Если параметров в маршруте больше одного, то они передадутся в обработчик в том же порядке, в котором они определены в маршруте:\n\n```php\n<?php\n\nRoute::get('articles/{articleId}/comments/{id}', function ($articleId, $id) {\n // ...\n})->names('articles.comments.show');\n```\n\nЗатем происходит выборка статьи из базы данных. Для нее используется метод `findOrFail`, а не `find`. Почему? Дело в том, что в большинстве случаев просмотр конкретной сущности должен вернуть ошибку 404, если самой сущности не существует. Метод `find` никак не помогает обработать эту ситуацию, он возвращает `null`. Дальше программисту придется делать проверку на существование и самому формировать правильный HTTP-ответ. Но так как задача очень частая, то разработчики Laravel решили ее внутри фреймворка. С одной стороны они добавили метод `findOrFail`, который выбрасывает исключение в случае отсутствия записи. С другой, добавили специальную обработку данных исключений на уровне обработки запросов.\n\nИ последний шаг, передача статьи в шаблон. Здесь ничего нового.\n\nШаблон:\n\n```php\n@extends('layouts.app')\n\n@section('content')\n <h1>{{$article->name}}</h1>\n <div>{{$article->body}}</div>\n@endsection\n```\n"},"lessonMember":null,"courseMember":null,"course":{"start_lesson":{"exercise":null,"units":[{"id":3049,"name":"theory","url":"/courses/php-laravel/lessons/about/theory_unit"}],"links":[{"id":422723,"name":"Homestead (Разработка на Laravel под Windows)","url":"https://laravel.com/docs/homestead"}],"ordered_units":[{"id":3049,"name":"theory","url":"/courses/php-laravel/lessons/about/theory_unit"}],"id":1437,"slug":"about","state":"approved","name":"О курсе","course_order":1,"goal":"Знакомимся с целями и задачами курса","self_study":null,"theory_video_provider":null,"theory_video_uid":null,"theory":"Laravel – популярный веб-фреймворк на PHP, предназначенный для быстрой разработки сайтов. Он сочетает в себе большие возможности сложных фреймворков и простоту написания кода с минимумом конфигурирования.\n\nВ этом курсе шаг за шагом создается проект под названием _hexlet-laravel-blog_. Это простой блог, в который можно добавлять статьи и оставлять комментарии.\n\nВо время создания мы рассмотрим следующие темы:\n\n* Ресурсная (REST-like) маршрутизация. Создание CRUD, валидация данных.\n* Шаблонизатор Blade. Макеты\n* Управление приложением из командной строки. Tinker.\n* Интеграционное тестирование, фабрики.\n* ORM. Создание сущностей. Связи.\n\nПрактика этого курса выполняется в среде Хекслета, но для полноценного погружения крайне рекомендуется повторять все действия на своем компьютере. Для этого убедитесь что в вашей системе установлен PHP (>= 8.1) и [Composer](https://getcomposer.org/).\n\nКроме практики в нашей среде, почти каждый урок содержит самостоятельную работу, которую нужно выполнять у себя на компьютере. Эти задания зависят друг от друга. Каждая новая самостоятельная работа базируется на том, что было сделано в предыдущих уроках.\n"},"id":183,"slug":"php-laravel","challenges_count":3,"name":"PHP: Laravel","allow_indexing":true,"state":"approved","course_state":"finished","pricing_type":"paid","description":"На этом курсе вы познакомитесь с веб-фреймворком Laravel. Вы узнаете о роутинге, контроллерах, шаблонизации и CRUD. В итоге поймете, как использовать систему лейаутов и шаблонов и конфигурировать фреймворк через переменные окружения. Знания из этого курса пригодятся, чтобы быстро разрабатывать сайты на Laravel.","kind":"basic","updated_at":"2026-01-20T11:38:38.174Z","language":"php","duration_cache":68580,"skills":["Создавать сайты с помощью Laravel","Использовать систему лейаутов и шаблонов","Взаимодействовать с базой данных через ORM","Конфигурировать фреймворк через переменные окружения"],"keywords":["ORM","шаблонизация (blade)","роутинг","контроллеры","CRUD","artisan","миграции"],"lessons_count":17,"cover":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NTk1OSwicHVyIjoiYmxvYl9pZCJ9fQ==--5524e60afe4756dec9f8864e518104ab7e27b5ec/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"},{"stack":{"id":22,"slug":"php-laravel-development","title":"Laravel","audience":"for_programmers","start_type":"anytime","pricing_model":"subscription","priority":"medium","kind":"track","state":"published","stack_state":"finished","order":250,"duration_in_months":1},"id":32,"slug":"php-laravel-developer","title":"Laravel","subtitle":"Laravel — Навык создания веб-приложений с помощью Laravel, необходимый для старта карьеры PHP-разработчика","subtitle_for_lists":"Изучите фреймворк Laravel для создания веб-приложений","locale":"ru","current":true,"duration_in_months_text":"1 месяц","stack_slug":"php-laravel-development","price_text":"от 3 900 ₽","duration_text":"1 месяц","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6MzcyMSwicHVyIjoiYmxvYl9pZCJ9fQ==--b4d9b4d245e88f43c7f861ac11e675846937c317/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programmer-bro.png"},{"stack":{"id":468,"slug":"middle-php","title":"Middle-php разработчик","audience":"for_programmers","start_type":"weekly","pricing_model":"purchase","priority":"high","kind":"profession","state":"published","stack_state":"not_finished","order":2003,"duration_in_months":5},"id":596,"slug":"middle-php","title":"Middle-php разработчик","subtitle":"Освоите продвинутую работу с БД и серверной логикой","subtitle_for_lists":"Освоите продвинутую работу с БД и серверной логикой","locale":"ru","current":true,"duration_in_months_text":"5 месяцев","stack_slug":"middle-php","price_text":"от 4 050 ₽","duration_text":"5 месяцев","cover_list_variant":"https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NTIxNSwicHVyIjoiYmxvYl9pZCJ9fQ==--ee06f514098550b5ac7eebce6227b1543399a37c/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png"}],"lessonMemberUnit":null,"accessToLearnUnitExists":false,"accessToCourseExists":false},"url":"/courses/php-laravel/lessons/show/theory_unit","version":"0b0c6d4ebbd40fd58630a0dd89cc25544ccdf24e","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: Laravel</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">Теория: Просмотр (CRUD)</h1><script type="application/ld+json">{"@context":"https://schema.org","@type":"LearningResource","name":"Просмотр (CRUD)","inLanguage":"ru","isPartOf":{"@type":"LearningResource","name":"PHP: Laravel"},"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>После того как список готов, можно переходить к просмотру каждого элемента. Как обычно начинаем с маршрутизации:</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
use App\Http\Controllers\ArticleController;
# id – параметр, который зависит от ��онкретной статьи
# Фигурные скобки нужны для описания параметров маршрута
Route::get('articles/{id}', [ArticleController::class, 'show'])
->name('articles.show');</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>В этом месте у маршрута появляется динамическая часть, идентификатор статьи. Подобный маршрут обрабатывает все страницы, имеющие вид <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">/articles/<идентификатор статьи></code>, примеры:</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">/articles/1
/articles/100
/articles/what-is-js</code>
<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
namespace App\Http\Controllers;
use App\Models\Article;
class ArticleController extends Controller
{
// ... другие обработчики
public function show($id)
{
$article = Article::findOrFail($id);
return view('article.show', compact('article'));
}
}</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>Параметр <em>id</em>, определенный в маршруте, приходит в обработчик в виде аргумента. Имя этого аргумента может быть любым, для Laravel имеет значение только порядок. Если параметров в маршруте больше одного, то они передадутся в обработчик в том же порядке, в котором они определены в маршруте:</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
Route::get('articles/{articleId}/comments/{id}', function ($articleId, $id) {
// ...
})->names('articles.comments.show');</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>Затем происходит выборка статьи из базы данных. Для нее используется метод <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">findOrFail</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">find</code>. Почему? Дело в том, что в большинстве случаев просмотр конкретной сущности должен вернуть ошибку 404, если самой сущности не существует. Метод <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">find</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">null</code>. Дальше программисту придется делать проверку на существование и самому формировать правильный HTTP-ответ. Но так как задача очень частая, то разработчики Laravel решили ее внутри фреймворка. С одной стороны они добавили метод <code style="margin-bottom:var(--mantine-spacing-lg)" class="m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight m_e597c321 mantine-CodeHighlight-codeHighlight m_dfe9c588 mantine-InlineCodeHighlight-inlineCodeHighlight">findOrFail</code>, который выбрасывает исключение в случае отсутствия записи. С другой, добавили специальную обработку данных исключений на уровне обработки запросов.</p>
<p>И последний шаг, передача статьи в шаблон. Здесь ничего нового.</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">@extends('layouts.app')
@section('content')
<h1>{{$article->name}}</h1>
<div>{{$article->body}}</div>
@endsection</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></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="/programs/php-laravel-developer?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">1 месяц</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">Laravel</p><p class="mantine-focus-auto m_b6d8b162 mantine-Text-root">Изучите фреймворк Laravel для создания веб-приложений</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/eyJfcmFpbHMiOnsiZGF0YSI6MzcyMSwicHVyIjoiYmxvYl9pZCJ9fQ==--b4d9b4d245e88f43c7f861ac11e675846937c317/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Programmer-bro.png" alt="Laravel" 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">от 3 900 ₽</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="/programs/middle-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">5 месяцев</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">Middle-php разработчик</p><p 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="https://hexlet.io/rails/active_storage/representations/proxy/eyJfcmFpbHMiOnsiZGF0YSI6NTIxNSwicHVyIjoiYmxvYl9pZCJ9fQ==--ee06f514098550b5ac7eebce6227b1543399a37c/eyJfcmFpbHMiOnsiZGF0YSI6eyJmb3JtYXQiOiJ3ZWJwIiwicmVzaXplX3RvX2xpbWl0IjpbNDAwLDQwMF0sInNhdmVyIjp7InF1YWxpdHkiOjg1fX0sInB1ciI6InZhcmlhdGlvbiJ9fQ==--5b6f46dacd1af664f27558553a58076185091823/Hand%20coding-rafiki.png" alt="Middle-php разработчик" 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">от 4 050 ₽</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-laravel/lessons/show/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 / 17</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-laravel/lessons/show/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-CdBlNCiQ.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-nkZBEvfU.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>