2011-02-19 2 views
2

인사말,임의 트리 구조를위한 Catalyst 디스패처

저는 Catalyst를 처음 사용하고 일부 디스패치 논리를 구현하려고합니다.

내 데이터베이스에는 각각 고유 한 url_part 필드가있는 항목 테이블이 있으며 모든 항목에는 같은 테이블에 부모가있어 트리 구조로되어 있습니다. bazfoo의 하위 인 bar의 하위 인 경우 루트 URL의 하위 인 /foo/bar/baz을이 개체에 매핑해야합니다. 트리는 깊이가 될 수 있으며 사용자는 분기 또는 리프의 모든 노드에 액세스 할 수 있어야합니다.

나는 체인 된 발송자에 대한 문서를 조사하고 있지만 이것이 내가 원하는 것을 할 수 있는지 확실하지 않습니다. 연결된 디스패처의 각 단계에는 PathPart 속성에 대해 정의 된 이름이 있어야하지만 내 URL은 데이터베이스 구조에 의해서만 결정되기를 바랍니다.

기존 Catalyst 디스패처로 쉽게 구현할 수 있습니까? 아니면 내 디스패치 클래스를 작성해야합니까?

감사합니다. :)

ETA :

내가 인수의 임의의 수를 잡기 위해 빈 Args 속성을 사용할 수 있다고 생각

. 다음은 성공적으로 루트 아래의 모든 요청을 잡을 것이 무엇을 달성하는 가장 좋은 방법입니다 그러나, 나도 몰라,

sub default :Path :Args() { 
    my ($self, $c) = @_; 

    my $path = $c->request->path; 

    $c->response->status(200); 
    $c->response->body("Your path is $path"); 
} 

거기에서 내가 수동으로 경로를 분석하고 내가 원하는 것을 얻을 수 I 후.

+0

P. 대화 형 도움말을 보려면 irc.perl.org의 #catalyst를 방문하십시오. – hobbs

답변

0

다양한 옵션을 가지고 놀고 나면 받아 들일 수있는 해결책에 도달했다고 생각합니다. 불행히도 :Chained으로 재귀 파견을 할 수 없었습니다 (처리기 자체를 체인 처리하려고하면 Catalyst가 불평합니다.나는 내가 원하는 어떤

foo 
foo/bar 
foo/bar/baz 

을 얻을 GET/foo/bar/baz에 할 경우

sub default : CaptureArgs(10) PathInfo('') { 
    my ($self, $c, @args) = @_; 

    foreach my $i(0 .. $#args) { 
     my $sub_path = join '/', @args[ 0 .. $i ]; 

     if (my $ent = $self->_lookup_entity($c, $sub_path)) { 
      push @{ $c->stash->{ent_chain} }, $ent; 
      next; 
     } 

     $c->detach('error_not_found'); 
    } 

    my $chain = join "\n", map { $_->entity_id } @{ $c->stash->{ent_chain} }; 
    $c->response->content_type('text/plain'); 
    $c->response->body($chain); 
} 

:

)

그래서 나는이 같은 큰 CaptureArgs와 함께 하나의 핸들러를 사용하여 끝났다. URL의 일부가 DB에있는 객체와 일치하지 않으면 404가 표시됩니다.

내 응용 프로그램에는 문제가 없지만 10 단계의 깊이는 없을 것입니다. 임의의 깊이 트리를 지원할 수있는보다 일반적인 솔루션입니다.

2

귀하의 데이터 구조에 따라 달라지며 귀하의 질문에서 완전히 명확하지 않습니다.

특정 수준의 항목에 해당하는 수준의 고정 된 수 (또는 최소한 수준 수의 범위)가있는 경우 연결은 원하는대로 할 수 있습니다 - 유효합니다 (그리고 완전히 공통적입니다)는 :CaptureArgs(1) PathPart('')으로 연결 작업을 수행하여 경로에 /*/ 세그먼트를 생성합니다. 즉 특정 고정 문자열을 표시하지 않고 경로의 한 세그먼트를 거꾸로 만듭니다.

그러한 것이 없다면 (예 : 당신은 무작위 수의 레벨을 무작위로 쫓아 다니고 있습니다. 가변적 인 :Args 액션은 아마도 당신이 원하는 것과 정확히 같을 것이고, 그것을 사용하는 데있어서 더러운 것이 없습니다. 하지만 $c->req->path 자신을 해독 할 필요가 없습니다. 왼쪽 구간 경로 세그먼트를 $c->req->args에서 가져 오거나 간단히 my ($self, $c, @args) = @_;을 수행 할 수 있습니다. 은 새로운 DispatchType을 작성하지만 그만한 가치가있는 것은 아닙니다.

+0

감사합니다. hobbs. 그것은 실제로 임의적으로 깊은 나무입니다. 지금은 가변적 인': Args' 형식을 사용하고'@ _'에서 경로 배열을 가져 오는 중입니다. 나는 PathPart ('')도 꽤 유용 할 것 같지 않다는 것을 알지 못했다. 좀 더 놀아 볼게. :) – friedo