2012-09-10 18 views
1

我想在perl舞者做一個簡單的表單驗證,但我想知道什麼是驗證簡單參數的最佳方法(例如,字段不能爲空,電子郵件的有效性,最小長度一個字段)中的舞者/ Perl裏沒有任何額外的插件或CPAN模塊簡單的表單驗證在舞者/ perl

這裏是到目前爲止的代碼

post '/register' => sub { 

my $db = connect_db(); 
my $sql = 'insert into users (username, email, password, motivation) values (?, ?, ? ,?)'; 
my $sth = $db->prepare($sql) or die $db->errstr; 
$sth->execute(params->{'username'}, params->{'email'},params->{'password'}, params->{'motivation'}) or die $sth->errstr; 

set_flash('Hey you signed up !'); 
redirect '/thanks'; 
}; 

我沒有谷歌,我發現幾種方法使用狀CPAN模塊,以做驗證: :Foo但是沒有那個怎麼辦?

回答

2

我不確定你爲什麼要明確避免使用插件或CPAN模塊 - 你想出的任何解決方案都可能與插件和/或CPAN模塊做同樣的事情,除非它是新代碼將不會像成熟和測試一樣。

我最近開始使用Dancer來開發一個簡單的應用程序,我將描述如何使用CPAN模塊解決此問題。你當然可以選擇忽略它。

我將用戶添加路由處理程序是這樣的:

post '/user/add' => { 
    my $args = valid_input('/user/add') 
     or return template('user/add'); 
    my $user = User->new({ 
     username => $args->{username}, 
     # ... 
    }); 
    user->insert; # you'll probably want some error handling here 
    set_flash('User added'); 
    redirect '/user'; 
}; 

valid_input功能是我爲我的應用程序,它使用來自CPAN的Data::Form::Validator模塊創建一個幫手。 '/usr/add'參數是要使用的驗證配置文件的名稱 - 爲了簡單起見,我決定保留與路由名稱相同的名稱。

由於文檔非常好,我不會因此致電Data::Form::Validator的詳細信息。我將提到的是,在驗證失敗時,valid_input幫手賣場走的驗證錯誤消息在警告框中顯示並保存提交的參數事件:

my $q = params(); # need to force scalar context to get a hashref; 
fill_in_form($q); # save submitted parameters 

我有一個before_template_render掛鉤,使保存了可用於模板的驗證錯誤消息(它們實際上在views/layouts/main.tt中呈現)。

我也有一個after_template_render掛鉤,它將保存的提交的參數,並使用HTML::FillInForm模塊將它們放回到呈現的HTML表單中。

因爲我在地方基礎設施,路由處理程序與所有字段預先填入顯示在編輯形式的現有用戶記錄很簡單:

get '/user/:id' => sub { 
    if(my $user = User->find(param('id'))) { 
     fill_in_form($user); 
     return template 'user/edit', { id => $user->id }; 
    } 
    not_found "User not found"; 
}; 

User->find()User是另一個我的應用程序特定的幫助函數。它使用Dancer::Plugin::DBIC模塊爲我的user表返回結果集對象。

我會說我不一定是Data :: Form :: Validator的忠實粉絲。我已經能夠實現我想要的一切,但有時它似乎需要比我想要的更多的工作。

+0

謝謝你的回覆。那麼爲什麼我想避免使用cpan模塊的原因是,在Ruby中,每場需要一行代碼,例如電子郵件驗證if self.email =='' 錯誤<<'電子郵件不能爲空' elsif!(email!=〜/ \ A \ Z | \ A([^ @ \ s] +)@((?: [-a-z0-9] + \。)+ [az] {2,})\ Z/i) 錯誤<<'電子郵件必須具有有效格式'是否真的*在Perl中,例如另一個模板,cpan模塊+單獨的文件來定義驗證標準?我只是想確保我不會錯過像Ruby中那樣簡單的事情......謝謝 – devnull

+0

如果你真的認爲在Ruby中這很容易,那麼你可以用完全相同的方式在Perl中完成。在Perl中,您可能會說'add_error('message here')',而不是定義'add_error'輔助函數來將消息推送到全局數組。最終這就是Data :: Form :: Validator正在做的事情,但是以一種更加結構化和可重用的方式(例如:它有一個電子郵件地址的規則,所以你不需要一個正則表達式)。同樣在我看來,它簡化了讓一個幫助者返回一整套有效輸入或根本沒有任何東西的邏輯。 –

+0

授予,非常感謝。如果我沒有太多要求,並希望其他未來觀衆的利益,你可以通過使用data :: validator(如用戶名,電子郵件,密碼,動機)的樣本驗證來優化您的回覆,假設用戶名檢查應該存在,請發送電子郵件至sytnax和現有的密碼相匹配的2個字段和動機有一定的長度?我認爲這將是有益的!如果太多問我明白 – devnull