2012-09-12 23 views
5

मैं Mojolicious::Guides::Growing का अनुभाग पढ़ रहा हूं जहां यह आपको एक "अच्छी तरह व्यवस्थित" सीपीएन-अपलोड करने योग्य एप्लिकेशन में एक Mojolicious :: लाइट कैसे विकसित करने के लिए बताता है। सबसे पहले, यह आपको एम :: एल ऐप को लॉन्च स्क्रिप्ट और एक एप्लिकेशन क्लास में विभाजित करने के लिए कहता है।क्यों mojolicious में अलग रूटिंग और नियंत्रक कार्रवाई?

package MyApp; 
use Mojo::Base 'Mojolicious'; 

use MyUsers; 

sub startup { 
    my $self = shift; 

    # ...auth stuff omitted... 

    my $r = $self->routes; 
    $r->any('/' => sub { 
    my $self = shift; 

    my $user = $self->param('user') || ''; 
    my $pass = $self->param('pass') || ''; 
    return $self->render unless $self->users->check($user, $pass); 

    $self->session(user => $user); 
    $self->flash(message => 'Thanks for logging in.'); 
    $self->redirect_to('protected'); 
    } => 'index'); 

    $r->get('/protected' => sub { 
    my $self = shift; 
    return $self->redirect_to('index') unless $self->session('user'); 
    }); 

    $r->get('/logout' => sub { 
    my $self = shift; 
    $self->session(expires => 1); 
    $self->redirect_to('index'); 
    }); 
} 

1; 

यह मुझे समझ में आता है।

package MyApp::Login; 
use Mojo::Base 'Mojolicious::Controller'; 

sub index { 
    my $self = shift; 

    my $user = $self->param('user') || ''; 
    my $pass = $self->param('pass') || ''; 
    return $self->render unless $self->users->check($user, $pass); 

    $self->session(user => $user); 
    $self->flash(message => 'Thanks for logging in.'); 
    $self->redirect_to('protected'); 
} 

sub protected { 
    my $self = shift; 
    return $self->redirect_to('index') unless $self->session('user'); 
} 

sub logout { 
    my $self = shift; 
    $self->session(expires => 1); 
    $self->redirect_to('index'); 
} 

1; 

package MyApp; 
use Mojo::Base 'Mojolicious'; 

use MyUsers; 

sub startup { 
    my $self = shift; 

    # ...auth stuff omitted... 

    my $r = $self->routes; 
    $r->any('/')->to('login#index')->name('index'); 
    $r->get('/protected')->to('login#protected')->name('protected'); 
    $r->get('/logout')->to('login#logout')->name('logout'); 
} 

1; 

मैं नहीं दिख रहा है यही कारण है कि इस: लेकिन फिर यह कहना है कि इस आवेदन वर्ग आगे कार्यों के साथ एक नियंत्रक वर्ग में पुनर्संशोधित जा सकता है और आवेदन वर्ग ही रूटिंग जानकारी को कम किया जा सकता पर चला जाता है "हाइब्रिड" संस्करण से बेहतर है जहां मार्ग और क्रियाएं मिलती हैं, क्योंकि अब नियंत्रक में redirect_to() के साथ कार्रवाइयों के बीच रीडायरेक्ट करने के लिए, आपको एक अलग फ़ाइल में रूटिंग जानकारी को देखना होगा, और यदि आप चाहते हैं एक यूआरएल बदलें, आपको इसे एक की बजाय दो अलग-अलग फाइलों में करना होगा। यह:

$r->get('/protected' => sub { 
    my $self = shift; 
    return $self->redirect_to('index') unless $self->session('user'); 
    }); 

बदल जाता है में:

sub protected { 
    my $self = shift; 
    return $self->redirect_to('index') unless $self->session('user'); 
} 

$r->get('/protected')->to('login#protected')->name('protected'); 

कौन सा शब्द है "सुरक्षित" 4 बार दो अलग अलग फ़ाइलों में (हालांकि मैं अभी तक यकीन है कि क्या नाम ("संरक्षित") करता है नहीं कर रहा हूँ) ।

जब मैं वेब विकास की बात करता हूं, तो मैं एक पूर्ण नौसिखिया हूं।

उत्तर

8

यह बेहतर नहीं है; बल्कि, यह अलग है।

जैसे ही आप एक डेवलपर से आगे बढ़ते हैं, एक फ़ाइल में आपका ऐप रखने से अब लाभ नहीं होता है; आप एक दूसरे के पैर की उंगलियों पर कदम उठाने के लिए खत्म हो जाएगा। यहां तक ​​कि यदि आप एकमात्र देव हैं, तो 1000+ लाइनों की फ़ाइलों में स्थानों का ट्रैक रखना कभी आसान नहीं होता है। इसके अलावा, एक फ़ाइल को देखने में सक्षम होना और एक नज़र में अपने सभी मार्गों को निर्धारित करना काफी उपयोगी है जब आपके पास केवल कुछ मार्गों से अधिक है, 100+ का उल्लेख न करें।

इसके अलावा, जब रूट बदलता है तो आपको नियंत्रक कार्रवाई में रीडायरेक्ट यूआरएल को बदलने की ज़रूरत नहीं है। यदि आप नामित मार्गों का उपयोग कर रहे हैं तो Mojolicious आपके लिए काम करेगा।

+2

ओह्ह्ह्ह, मुझे एहसास नहीं हुआ कि redirect_to ('foo') ने 'foo' को पथ '/ foo' के बजाय नाम के रूप में व्याख्या किया है, और यह कि एम :: एल get/post/any/etc स्वचालित रूप से कार्य करता है बनाए गए नाम यह सब अब समझ में आता है, धन्यवाद। – user1481