Создание сущности, включает в себя два действия: отображение формы и обработка данных формы. За каждое из этих действий отвечает свой собственный маршрут. Вот несколько примеров:
Пользователь
/users/new
/users
Курс
/courses/new
/courses
Сотрудник компании (пример вложенного маршрута)
/companies/3/users/new
/companies/3/users
Обработчик
<?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)
и затем редирект на список школ с оповещением через флеш об успешном добавлении.
Сделайте все поля формы создания пользователя обязательными
Реализуйте обработку введённых данных и рендеринг формы с выводом ошибок
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт