Posterous theme by Cory Watilo

Filed under: catalyst

HTML::FormHandler介绍

根据Catalyst的胖Model,瘦Controller原则,在controller里面应该使用最少的代码来保持整个逻辑的清爽。但对于任何一个web app来说,最复杂的逻辑之一就是表单的提交,验证表单,之后再根据需要从做相关的操作,查询数据库或者返回错误。而这些都是Controller的任务

如果在Controller里面hardcode这部分逻辑,整个代码会变得冗长而丑陋,HTML::FormHandler就是为了简化表单的处理而编写的模块。HTML::FormHandler使用Moose作为底层的OO库,代码实现比较优雅和干净。

一个典型的表单定义如下:

HTML::FormHandler主要分为这么几个部分

  • HTML::FormHandler::Field::*

Field主要用来定义表单单元的类型,对某一种类型,会有相应的验证方法和属性,比如定义一个Text类型单元

has_field 'name'  => (Type => 'Text', maxlength => 30, minlength =>6);
  • HTML::FormHandler::Widget::*

Widget用来生成Field的HTML代码,查看源代码,每一个widget都有个render方法,用来创建wdiget的HTML code,这里有两个特殊的widget。HTML::FormHandler::Widget::Wrapper::*用来添加包裹每个表单单元的HTML, 比如添加的是div还是table.还有一个是Widget::Form,定义

…..
部分如何生成

  • HTML::FormHandler:Moose

使用Moose定义的语法糖,比如has_field

  • HTML::FormHandler::Model::*

与数据库交互的模块,值得注意的是FormHandler没有添加任何数据库操作的代码,而只是使用Moose Role定义了数据库操作所需要的方法。

to be continued…

The reason I won't even use HTML::FormFu and HTML::FormHandler

I built a Catalyst based web application some days ago, and because it was my first Catalyst application, I built it from scratch, I used few high level Plugins, I wrote the web logic all in the Controller, especially “Form-handler' logic.

And then I read some Catalyst document, realized Controller should be thin and I have a lot of plugins available which can make my code clean. So I’d like to pick one to Handler my forms.

First, I have all those Forms already defined in my templates, so I don’t need a module that will generate form for me, also I think let the module generate a form for you automatically is not very good idea. Form is the kind of thing which needs customization, a lot of customization. This eliminate HTML::FormFu, from whose documentation, I can not found a way to reuse my templates.

HTML::FromHandler looks better,I can quickly find the information it is possible to reuse my template from the document, but still it’s not perfect, I have to explicitly new a form class inside the action, I think what I want is the code like this

sub add :Path(/add) :Form('add') {
        ### now we have a form object already some where, in stash for example
        ### do what ever we can
        $form->validate_and_update

  }

Maybe I can write a ActionRole for my purpose, I still need some time to try that.

web开发

C360_2011-04-24_13-26-43


干了好些年SA类似的工作之后,由于各方面的原因, 最近我把大部分精力都放在web开发上面去了。
作为一个门外汉,直接使用比较成熟的开发框架比较容易上手,Perl社区里应用比较广泛的web开发framework是Catalyst,此外后起之秀还有DancerMojo。Catalyst和后两者有着截然不同的风格,catalyst注重社区代码的重用,使用了Moose这样的重量级模块,因此依赖关系相当复杂,据称安装Catalyst是一件令人头疼的事情,但根据我的经验来看,cpan和cpanm都可以很顺利的完成这项工作。而Dancer和Mojo,前者仅仅依赖少量几个模块,而后者号称只需要perl5.8.7以上版本就可以安装和运行,但这两个模块都在很大程度上重造了一些轮子。这两个框架还在开发当中,使用成熟的catalyst是比较理智的选择。

入手做web开发才发现要学的东西实在太多了,就Catalyst来说,如果不搭配上DBIx::Class那简直是暴殄天物,DBIx::Class号称是所有语言中最好用的ORM,当然我没有用过其他语言中的没有发言权。感觉与Catalyst以及相关模块,就像Vim一样,学习曲线陡峭,但如果你掌握了它,就会觉得很难离开他们了。

此外javascript也是web开发中不可缺少的一环,初接触javascript感觉这个语言设计相当奇怪,比如没有block作用域,奇技淫巧一般的面向对象实现方法(在这点上和perl很像),于是买了上图那本书作为参考。

经过一个多月的自学,我终于成功的把jquery和一些ajax的技术运用到了我的一个小作品上面,这个作品大大方便了我的工作,老板貌似对这个成果也很满意,毕竟在工作中主动创新的人实在不多(至少就本部门而言)。

我得尽快成为一个比较合格的perl web开发人员,为成为一个自由职业者添加底气。