Нам также нужен способ определить, какой шаблон должна использовать конечная точка. Мы можем использовать еще одну невероятно мощную функцию Athena - возможность определять/использовать пользовательские аннотации. Эта функция обеспечивает огромную гибкость, поскольку возможности ее использования практически безграничны. Вы могли бы определить
Чтобы создать эту пользовательскую аннотацию, мы используем макрос configuration_annotation
как часть компонента Athena::Config
. Этот макрос принимает в качестве первого аргумента имя аннотации, а затем переменное количество полей, которые также могут содержать значения по умолчанию, очень похоже на
ACF.configuration_annotation Blog::Annotations::Template, name
: String
Вскоре мы вернемся к использованию этой аннотации, но сначала нам нужно разобраться с другими пунктами нашего списка дел. Прежде всего, настройте согласование содержимого. Добавьте следующий код в файл
def ATH::Config::ContentNegotiation.conРисунок :
ATH::Config::ContentNegotiation?
new(
Rule.new(path: /^\/article\/\d+$/, priorities: ["json",
"html"],
methods: ["GET"], fallback_format: "json"),
Rule.new(priorities: ["json"], fallback_format: "json")
)
end
Подобно тому, как мы настроили прослушиватель CORS, мы можем сделать то же самое для функции согласования контента. Однако в этом случае он настраивается путем предоставления ряда экземпляров правил, которые позволяют точно настроить согласование.
Аргумент path
принимает
Аргументы
Наше второе правило не содержит пути, поэтому оно применяется ко всем маршрутам и поддерживает только JSON. Мы также устанавливаем значение fallback_format
для JSON таким образом, что JSON все равно будет возвращен, даже если заголовок accept
этого не разрешает. Резервный формат также может быть установлен на nil
, чтобы попробовать следующее правило, или false, чтобы вызвать ATH::Exceptions::NotAcceptable
, если нет обслуживаемого формата.
См. https://athenaframework.org/Framework/Config/ContentNegotiation/Rule/ для получения дополнительной информации о том, как можно настроить правила согласования.
Теперь, когда мы это настроили, мы можем перейти к настройке нашей сущности статьи, чтобы предоставить некоторые ее данные Crinja. Это так же просто, как добавить include Crinja::Object::Auto
внутри класса, а затем добавить аннотацию @[Crinja::Attributes]
к самому классу сущности.
Далее мы можем
{{ data.title }}
{{ data.body }}
Updated at: {{ data.updated_at }}
Мы
Наконец, нам нужно создать экземпляр ATH::View::FormatHandlerInterface
, который будет обрабатывать процесс подключения всего, чтобы возвращаемое значение действия контроллера отображалось через Crinja и возвращалось клиенту. Создайте
@[ADI::Register]
class HTMLFormatHandler