2012-09-28 4 views
3

안녕을 선언촉매 : 내가 컨트롤러에서 동일한 코드를 repeate 싶지 않아, 그래서 내가 주 MyApp를 패키지의 하위 생성하는 방법 글로벌 서브 루틴

sub do_stuff { 
    my $input = shift; 

    do something 
} 

을하지만 내가 그것을 사용하려면 컨트롤러 MyApp::Controller::Foo

sub test : Chained('base') Args(0) { 
    my ($self, $c) = @_; 

    my $test = do_stuff($c->request->params->{s}); 

    do something more 
} 

난 다음 얻을 오류 :

Caught exception in MyApp::Controller::Foo->test "Undefined subroutine &MyApp::Controller::Foo::do_stuff called at /home/student/workspace/MyApp/script/../lib/MyApp/Controller/Foo.pm line 24, line 1000."

어떻게 모든 촉매제 컨트롤러에서 global을 사용할 서브 루틴/함수를 만들 수 있습니까 ???

답변

4

원칙적으로 메인 MyApp에서 사용 된 모든 모듈에서 이미 사용할 수 있습니다.

주 패키지에서 정의 된 경우 해당 네임 스페이스 (main 또는 MyApp 네임 스페이스)에서 해당 패키지를 호출하거나 현재 패키지 네임 스페이스로 가져와야합니다.

정의 된 위치에 따라 해당 방법 중 하나를 사용하십시오.

my $test = main::do_stuff($c->request->params->{s}); 
my $test = MyApp::do_stuff($c->request->params->{s}); 

다른 대안은 각 패키지의 네임 스페이스로 가져 오는 것입니다.

package MyApp::Controller::Foo; 
if (defined &MyApp::do_stuff) { 
    *do_stuff = *MyApp::do_stuff; 
} 

defined을 사용하면 서브 루틴이 있는지 확인할 수 있습니다. 다른 주에


은, 어쩌면이 do_stuff 하위 더 나은 Exporter이있는 다른 모듈의 내부에 배치됩니다. 필요한 모든 컨트롤러 또는 다른 모듈에서 사용할 수 있으며, Exporter는이를 네임 스페이스로 직접 가져옵니다.

+0

고마워요, 지금은 작동합니다. – theguest

+0

@ theguest 좋아요. :) SO에 오신 것을 환영합니다. 귀하의 문제를 해결 한 경우 투표 아래의 체크 표시를 클릭하여 답변을 수락하십시오. 위쪽 화살표를 클릭하여 좋은 응답에 투표 할 수도 있습니다. 도움이 필요하면 [faq # howtoask]를 보라. – simbabque

1

당신이 촉매 대부분의 방법에 전달 ($c가)

MyApp::do_stuff($c, $c->request->params->{s}); 

를 호출 당신이

$c->do_stuff($c->request->params->{s}) 

를 말하는 경우가 동일하므로, 이미 형 MyApp의 목적은 컨텍스트 객체 전역 서브 루틴이이 컨텍스트 객체를 사용할 것으로 예상되면 메소드 (즉, 첫 번째 인수가 항상 패키지의 인스턴스 인 패키지의 서브 루틴)로 작성하는 것이 좋습니다.

# to be called like $c->do_stuff("s") to do something with form input "s" 
sub do_stuff { 
    my ($c, $param) = @_; 

    ... do something with $c->request->param($param) ... 
} 
관련 문제