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

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

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

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

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

CRUD

Несмотря на огромное число разнообразных сайтов, практически всю веб разработку можно свести к CRUD операциям. CRUD широко распространенный термин, означающий 4 стандартные операции над любой сущностью (ресурсом): создание, чтение, обновление и удаление. Например, в случае с пользователем можно составить такое соответствие:

Create

  • Регистрация

Read

  • Просмотр профиля пользователями сайта
  • Просмотр пользователя в административном интерфейсе

Update

  • Обновление личных данных
  • Смена емейла
  • Смена пароля

Delete

  • Удаление

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

Хозяйке на заметку. Иногда в качестве шутки веб-разработчиков называют крудошлепами, а фронтенд-разработчиков формошлепами :D

Создание полного круда включает в себя следующие действия:

  • Создание сущности в коде (как правило, класса)
  • Добавление таблицы в базу
  • Написание тестов на обработчики
  • Добавление обработчиков
  • Добавление шаблонов

Новички тратят на создание такого круда не один день. У опытного разработчика, в прокаченном фреймворке, этот процесс занимает максимум часы. Slim, как и другие микрофреймворки, не предоставляет никаких средств автоматизации, поэтому придется многое делать руками. В целях обучения это оправданно, но в промышленной разработке, то что может быть автоматизировано, должно быть автоматизировано.

Ниже мы пройдемся по всему процессу создания круда пользователя за исключением работы с базой данных и тестов. Начнем с роутинга. Полный круд пользователя включает минимум 7 маршрутов. Их может быть больше, так как любое из действий может повторяться не один раз.

Метод Маршрут Шаблон Описание
GET /users users/index.phtml Список пользователей
GET /users/{id} users/show.phtml Профиль пользователя
GET /users/new users/new.phtml Форма создания нового пользователя
POST /users Создание нового пользователя
GET /users/{id}/edit users/edit.phtml Форма редактирования пользователя
PATCH/PUT /users/{id} Обновление пользователя
DELETE /users/{id} Удаление пользователя

Такое соглашение изначально появилось в Rails и затем было адаптировано во многих фреймворках на языках отличных от Ruby.

В этом уроке мы разберем первые два маршрута (просмотр списка и конкретного ресурса), а остальные в следующих уроках.

Список (index)

Вывод списка чего-нибудь мы уже делали не раз. Повторим для закрепления. Общий алгоритм действий такого обработчика всегда проходит по одному сценарию и не зависит от языка программирования:

  1. Извлекаем список из хранилища (базы данных). Обычно с учетом пейджинга.
  2. Передаем данные в шаблон
  3. Выводим данные в шаблоне используя цикл

CRUD Список

Обычно в этот список добавляют различные действия, которые можно выполнять над сущностями, например, редактирование, удаление или просмотр.

Обработчик

<?php

$app->get('/schools', function ($request, $response) {
    $repository = new App\SchoolRepository();
    $schools = $repository->all();
    $params = ['schools' => $schools];
    return $this->get('renderer')->render($response, "schools/index.phtml", $params);
})->setName('schools');

Шаблон

<table>
  <?php foreach ($schools as $school): ?>
    <tr>
      <td>
          <?= $school['id'] ?>
      </td>
      <td>
          <a href="/schools/<?= $school['id'] ?>"><?= $school['name'] ?></a>
      </td>
    </tr>
  <?php endforeach ?>
</table>

Отображение (show)

Страница конкретной сущности. Например на Хекслете к таким страницам относятся: профиль пользователя, страница курса, страница профессии, страница урока и многие другие. Как и в случае со списком, порядок действий для отображения всегда один и тот же:

  1. Из адреса извлекается идентификатор сущности
  2. Выполняется поиск сущности в хранилище
  3. Она передается в шаблон
  4. В шаблоне рисуется красивый вывод

Обработчик

<?php

$app->get('/schools/{id}', function ($request, $response, array $args) {
    $id = $args['id'];
    $repository = new App\SchoolRepository();
    $school = $repository->find($id);

    $params = [
        'school' => $school
    ];

    return $this->get('renderer')->render($response, 'school/show.phtml', $params);
})->setName('school');

Шаблон

<?php foreach ($school as $key => $value): ?>
  <div>
      <?= $key ?>: <?= $value ?>
  </div>
<?php endforeach ?>

А если сущность была удалена или ее вообще не существовало, как тогда должен вести себя сайт? С точки зрения HTTP такой адрес должен вернуть HTTP код 404. Сделать это можно явно, вернув соответствующий ответ.

<?php

$app->get('/schools/{id}', function ($request, $response, array $args) use ($repo) {
    $id =  $args['id'];
    $school = $repo->find($id);

    if (!$school) {
        return $response->write('Page not found')
            ->withStatus(404);
    }
})->setName('school');

Но обычно механизм обработки таких ошибок построен через исключения. С ними мы познакомимся в следующих курсах.

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

  1. Приведите маршруты и их имена в соответствии с указанной выше схемой.
  2. Переделайте получение пользователей так, чтобы данные о пользователях брались из файла. Не забудьте предотвратить XSS.

Дополнительные материалы

  1. RESTFull Routing
  2. Scaffolding

<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 «Конфиденциальность» и «Условия использования».