Обычно я могу получить поведение, которое я желаю, просто случайно используя разные перестановки этих двух параметров, но я все еще не могу сказать, что я точно знаю, что они делают. Есть ли конкретный пример, демонстрирующий разницу?
Какая разница между: 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.