Структура Yesod-проекта: обработчики

Приветствую!

Сегодня мы продолжаем изучать структура Yesod-проекта. Пришла пора взглянуть на содержимое каталога Handler.

Ресурсы

Вспомним корневой маршрут, задаваемый в файле config/routes:

/       HomeR       GET POST

Все GET- и POST-запросы, направленные к корневой странице нашего приложения, будут обработаны сущностью, называемой HomeR. И теперь пришла пора заглянуть в каталог Handler:

Home.hs

В этом каталоге расположены файлы, содержащие код наших обработчиков. Откроем файл Home.hs и взглянем на них:

module Handler.Home where

import Import

getHomeR :: Handler Html
getHomeR = do
    ...

postHomeR :: Handler Html
postHomeR = do
    ...

В этом файле есть ещё кое-что, но я специально убрал это, чтобы мы сфокусировались на главном. Итак, ресурс HomeR представлен двумя обработчиками: GET-запросы принимает функция getHomeR, а POST-запросы - функция postHomeR. Обратите внимание: имена этих функций образованы от имени ресурса HomeR путём приписывания к нему префиксов get и post (как вы помните, имя Haskell-функции всегда начинается с маленькой буквы). Впрочем, сейчас мы не станем рассматривать тела этих функций, это тема для отдельного разговора.

Обратите также внимание на имя модуля Handler.Home. В Yesod-проектах принято, что имя модуля, содержащего код обработчиков для ресурса, совпадает с именем этого ресурса, за вычетом буквы R. Таким образом, ресурсу HomeR соответствует модуль Handler.Home, а, скажем, ресурсу ContactsR будет соответствовать модуль Handler.Contacts.

Иерархия

Разумеется, файлы внутри каталога Handler могут располагаться в некой иерархии. В реальном проекте это значительно удобнее, нежели валить все файлы в одну кучу. Например, в моём проекте файлы, отвечающие за аутенификационные аспекты, расположены в отдельном подкаталоге, в частности:

Handler/
    Authentication/
        Error.hs
        VerificationLetter.hs

В этом случае модуль, отвечающий за обработку неудачной попытки залогиниться, называется Handler.Authentication.Error.

Ресурсы по умолчанию

В списке наших маршрутов присутствуют, в частности, вот эти два:

/favicon.ico    FaviconR    GET
/robots.txt     RobotsR     GET

Первый возвращает наш любимый favicon, второй возвращает заметки для поисковых роботов. Помните содержимое каталога config? Там уже лежат файлы favicon.ico и robots.txt, вот они и возвращаются.

Но вы спросите, а где же определены соответствующие обработчики? Ведь для ресурса HomeR есть файл Handler/Home.hs, однако файлов Handler/Favicon.hs и Handler/Robots.hs мы не видим. А всё очень просто: соответствующие обработчики уже определены внутри нашего проекта.

Дело в том, что Yesod делает за нас кое-какие рутинные операции. Согласитесь, файлы favicon.ico и robots.txt нужны в любом веб-приложении. Ну а раз они нужны, Yesod создаёт их за нас автоматически. Нам остаётся только лишь заменить config/favicon.ico и подредактировать, при необходимости, содержимое config/robots.txt.

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