Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

CRUD: Создание

Создание сущности, включает в себя два действия: отображение формы и обработка данных формы. За каждое из этих действий отвечает свой собственный маршрут. Вот несколько примеров:

Пользователь

  • GET /users/new
  • POST /users

Курс

  • GET /courses/new
  • POST /courses

Сотрудник компании (пример вложенного маршрута)

  • GET /companies/3/users/new
  • POST /companies/3/users

CRUD Создание

Отображение формы

Обработчик

<?php

$app->get('/schools/new', function ($request, $response) {
    $params = [
        'schoolData' => [],
        'errors' => []
    ];
    return $this->get('renderer')->render($response, 'schools/new.phtml', $params);
})->setName('newSchool');

Шаблон

<form action="/schools" method="post">
    <div>
        <label>
            Название *
            <input type="text" name="school[name]" value="<?= htmlspecialchars($schoolData['name'] ?? ''); ?>">
        </label>
        <?php if (isset($errors['name'])): ?>
            <div><?= $errors['name'] ?></div>
        <?php endif ?>
    </div>
    <input type="submit" value="Create">
</form>

Содержимое обработчика очень сильно зависит от того, какой используется инструментарий. В тех местах, где есть билдеры форм, в этом обработчике создаётся форма (как некоторый объект) и отправляется в шаблон. Билдер берет на себя огромное количество задач, он сам обрабатывает вывод ошибок, занимается валидацией и подготовкой данных. Особо умные билдеры знают про ту сущность, с которой они работают, и могут строить формы в полностью автоматическом режиме.

В нашем примере ничего такого нет, поэтому все действия делаются руками. Кроме непосредственно данных, в шаблон передаётся массив errors. Это нужно по той причине, что форма используется обоими обработчиками: одним только для отображения новой формы, другим для отображения формы в случае наличия ошибок.

Обработка данных формы

<?php

$router = $app->getRouteCollector()->getRouteParser();

$app->post('/schools', function ($request, $response) use ($router) {
    $repo = new App\SchoolRepository();
    // Извлекаем данные формы
    $schoolData = $request->getParsedBodyParam('school');

    $validator = new Validator();
    // Проверяем корректность данных
    $errors = $validator->validate($schoolData);

    if (count($errors) === 0) {
        // Если данные корректны, то сохраняем, добавляем флеш и выполняем редирект
        $repo->save($schoolData);
        $this->get('flash')->addMessage('success', 'School has been created');
        // Обратите внимание на использование именованного роутинга
        $url = $router->urlFor('schools');
        return $response->withRedirect($url);
    }

    $params = [
        'schoolData' => $schoolData,
        'errors' => $errors
    ];

    // Если возникли ошибки, то устанавливаем код ответа в 422 и рендерим форму с указанием ошибок
    $response = $response->withStatus(422);
    return $this->get('renderer')->render($response, 'schools/new.phtml', $params);
});

Своего шаблона у таких обработчиков не делают. Если данные оказались не валидны, то этот обработчик рисует форму обработчика new и отправляет её вместе с кодом ответа 422 (Unprocessable Entity). Если данные корректны, то выполняется основная логика обработчика – происходит сохранение школы в базу данных $repo->save($schoolData) и затем редирект на список школ с оповещением через флеш об успешном добавлении.

Самостоятельная работа

  1. Сделайте все поля формы создания пользователя обязательными.
  2. Реализуйте обработку введённых данных и рендеринг формы с выводом ошибок.

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят менторы из команды Хекслета или другие студенты.

Для полного доступа к курсу нужна профессиональная подписка

Профессиональная подписка откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, даст возможность обращаться за помощью к менторам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Нажимая кнопку «Зарегистрироваться», вы даёте своё согласие на обработку персональных данных в соответствии с «Политикой конфиденциальности» и соглашаетесь с «Условиями оказания услуг». Защита от спама reCAPTCHA «Конфиденциальность» и «Условия использования».