Catalyst и его Chained

Что такое атрибут Chained в Catalyst. Что такое атрибуты Path, CaptureArgs и Args. Использование атрибутов Local, Global, Private.

Атрибуты методов контроллеров - это способ связать определенный метод-обработчик с конкретным запросом, по определенному адресу. Именно благодаря атрибутам, Catalyst понимает, какой метод будет обрабатывать запрос к странице http://localhost:3000/page/2 . Более того, атрибуты позволяют создать целую цепочку методов, которые будут последовательно обрабатывать запрос.

Ниже будет рассмотрено использование основных атрибутов методов Catalyst. Данная публикация носит практический характер: много примеров, мало текста.

Все приведенные примеры были проверены на основе специально созданного контроллера Chain.pm и шаблона chain.tt . При этом, содержимое методов оставалось практически неизменным (для чистоты экспериментов), изменялись только атрибуты. Именно поэтому, в большинстве примеров содержимое методов не приводится, только их объявления.

/lib/MyApp/Controller/Chain.pm:

/root/src/chain.tt:

Вызывается по адресу http://localhost:3000/chain

 

Args

Атрибут Args позволяет передавать Catalyst-приложению аргументы как составную часть URL. Можно передавать один или несколько аргументов, либо запретить передачу аргументов вообще.

Args(0) - аргументы не разрешены, Args - без указания числа - разрешит неограниченное число аргументов. Args(1) - т.е. Args с указанным числом, разрешит заданное количество аргументов в URL.

Принятые значения аргументов можно извлечь из @_ .

Пример 1:

Данный обработчик будет привязан к адресу
http://localhost:3000/chain

Попытки вызвать страницу
http://localhost:3000/chain/67
будут завершены ошибкой "Page not found".

Пример 2:

Правильный вызов:
http://localhost:3000/chain/67

Не правильный вызов:
http://localhost:3000/chain
http://localhost:3000/chain/67/56

Пример 3:

Правильный вызов:
http://localhost:3000/chain/67/56
http://localhost:3000/chain/67
http://localhost:3000/chain
http://localhost:3000/chain/rr/36

Если передаваемый аргумент не является завершающей частью URL, для указания количества передаваемых аргументов используется атрибут CaptureArgs .

 

Path

Атрибут :Path привязывает текущий метод в качестве обработчика к заданному URL.

Пример 1:

Правильный вызов:
http://localhost:3000/chain/login

Не правильный вызов:
http://localhost:3000/chain
закончится ошибкой "Page not found"

Пример 2:

Правильный вызов:
http://localhost:3000/login

Не правильный вызов:
http://localhost:3000/chain/login

Пример 3:

Правильный вызов:
http://localhost:3000/login/name

Не правильный вызов:
http://localhost:3000/login
http://localhost:3000/chain
http://localhost:3000/chain/login

 

Local

Атрибут :Local - это тоже самое, что :Path('action_name') .

Пример:

Правильный вызов:
http://localhost:3000/chain/clear_all

Не правильный вызов:
http://localhost:3000/clear_all
http://localhost:3000/chain

 

Global

Атрибут Global это аналог атрибута :Path('/action_name').

Пример:

Правильный вызов:
http://localhost:3000/clear_all

Не правильный вызов:
http://localhost:3000/chain/clear_all

Считается, что атрибут Global сейчас уже почти не используется, в основном его можно встретить в очень старых Catalyst-приложениях. Вместо Global, для достижения аналогичных результатов используют атрибуты Chained и Path.

 

Private

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

Атрибут :Private эксклюзивен. Атрибуты :Path или :Chained в его присутствии не действительны. Вызвать метод, в заголовке которого указано :Private, можно с помощью

или

Пример:

не смотря на указанные :Global и :Args(0) , обращение по адресу http://localhost:3000/clear_all вернет ошибку - "Страница не найдена"

 

PathPart

Атрибут используется при создании цепочек методов для обработки запроса. Привязывает текущий обработчик к некоторой части URL. Если атрибут указан без аргументов, то в качестве значения будет использоваться имя метода.

Записи

и

считаются идентичными по смыслу.

 

CaptureArgs

Атрибут CaptureArgs задает количество аргументов, которые передаются как часть URL-строки. Работает так же, как Args, но используется в тех случаях, когда отлавливаемый аргумент не последний элемент в URL-строке.

Например:
http://localhost:3000/page/{page_id}/rev/{rev_id}
Для обработки {rev_id} может использоваться Args, а для отлова {page_id} - CaptureArgs.

 

Chained

Атрибут Chained позволяет создавать цепочки методов для обработки запросов. Благодаря Chained и PathPart, можно организовать обработку сложных, составных URL, которые содержат множество элементов и атрибутов.

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

Пример 1:

Правильный вызов:
http://localhost:3000/user/98/edit

Не правильный вызов:
http://localhost:3000/user/98/edit/33
http://localhost:3000/user/98

Обработка запроса с URL "http://localhost:3000/user/98/edit" осуществляется цепочкой методов. Сначала будет вызван метод index, потом, после завершения его работы, вызывается edit.

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

Пример 2:

Правильный вызов:
http://localhost:3000/user/98/edit
http://localhost:3000/user/98

Не правильный вызов:
http://localhost:3000/user
http://localhost:3000/user/67/edit/promo
http://localhost:3000/user/67/view

 

Специальные методы в Catalyst

Catalyst совершенно по-особому обрабатывает методы с именами index, auto, begin, end и default. Эти методы вызываются в ключевых точках обработки поступившего запроса.

Стоит быть внимательным, придумывая имена для методов. Я это хорошо запомнила, после того, как для удобства назвала главный обработчик - index, а потом около часа разбиралась, почему метод не работает.

  • default :Path - этот метод вызывается, когда не найдено ни одного подходящего обработчика для запроса. Переопределив его, можно использовать для вывода главной страницы, отображения сообщения об ошибке 404, и т.п.

    В этом случае, при обращении к странице http://localhost:3000/chain/ или http://localhost:3000/chain/89/ , вместо стандартной ошибки "Страница не найдена", клиент увидит сообщение об ошибке 404.

  • index :Path :Args(0) - index очень похож на default . Удобен для создания какой-то единой страницы раздела.

    Вызывается - http://localhost:3000/chain

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

    Обратимся по адресу http://localhost:3000/chain. В логах сервера можно увидеть, что end был вызван:

  • auto :Private - Еще один метод. Вызывается после метода begin.

 

Полезные ссылки по теме "Catalyst и атрибуты для action"

Прелести Цепочек (chain) в фреймворке Catalyst

search.cpan.org: Catalyst::Manual::Intro

search.cpan.org: Catalyst::DispatchType::Chained

Catalyst и его Chained: 1 комментарий

  1. TheAthlete

    Здравствуйте!
    Спасибо за статью! Очень понятно и доступно про цепочки.

Комментарии запрещены.