Какая разница между: Args и: CaptureArgs в Catalyst?

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

Ответ 1

:CaptureArgs(N) соответствует, если осталось не менее N аргументов. Он используется для неконцевых обработчиков цепочек.

:Args(N) соответствует только если осталось ровно N аргументов.

Например,

sub catalog : Chained : CaptureArgs(1) {
    my ( $self, $c, $arg ) = @_;
    ...
}

sub item : Chained('catalog') : Args(2) {
    my ( $self, $c, $arg1, $arg2 ) = @_;
    ...
}

совпадения

/catalog/*/item/*/*

Ответ 2

CaptureArgs используется в цепных методах в Catalyst.

Args обозначает конец цепного метода.

Для ex:

sub base_method : Chained('/') :PathPart("account")  :CaptureArgs(0)
{

}
sub after_base : Chained('base_method') :PathPart("org") :CaptureArgs(2)
{

}
sub base_end : Chained('after_base') :PathPart("edit")  :Args(1)
{

}

Вышеуказанные методы соответствуют /account/org/*/*/edit/*.

Здесь base_end - конечный метод цепи. Для обозначения конца цепного действия используется Args. Если используется CaptureArgs, это означает, что цепочка все еще продолжается.

Args также используется в других методах катализатора для указания аргументов метода.

Также из cpan Catalyst:: DispatchType:: Chained:

The endpoint of the chain specifies how many arguments it
 gets through the Args attribute. :Args(0) would be none at all,
 :Args without an integer would be unlimited. The path parts that 
aren't endpoints are using CaptureArgs to specify how many parameters
 they expect to receive.