使用YII 做开发的总结

1719 查看

这两天用YII开发了用户管理的功能,以前虽然也用YII框架开发过一些功能,但是总感觉对YII的使用还不是很熟练。
这次真正动手之前,先复习了一遍 yii-guide-1.1.14.pdf 这本书,上次看的时候太过于粗略了,这次仔仔细细的阅读了一遍。
说一下最直观的感受
1 对于表单字段的校验,简化了开发工作量
记得以前写表单验证,一般都是下面这样的代码

   if (!isset($_GET["token"]){
         echo "缺少参数 token"
         return ;
   }
   $token = $_GET["token"];
   if (length(token) < 8 || length(token) > 20){
         echo "token 的长度应该介于 8 到20个字符";
   }

在YII框架中,会精简为下面这样的代码:

   return array(
        array("token","required"),
        array("token", "length","max"=>20, "min"=>8, "message"=>"token 的长度应该介于 8 到20个字符")
   )

当有很多参数需要验证的时候,会节省大量的验证代码

2 对于数据库操作的简化
YII框架提供了两种操作数据库的方式,
一个叫YII DAO, 一个叫YII AR
YII DAO ,比较适用于编写SQL操作数据库的场景,构造合适的SQL语句,然后交给底层的DAO帮你执行
AR 这种方式,使用的是ORM模型,对于对象的操作一般使用 object.save(), object.delete(), object.find();
这样的方式,AR 还提供了像是 beforeSave(), afterSave()这样的事件处理机制,可以在对象保存的时候统一做一些事情,比如更新某个记录的更新时间,创建时间

AR 另外提供了关联表的操作,可以方便的对关联表中的对象进行获取等等的操作,使用的是lazy load的方式,不会拖慢查询效率。只有在明确访问关联表的属性的时候,才去执行查询。
AR 也提供了命名查询的方式,比如需要获取最近一个月内发布的10 篇文章,如果经常性的用到这个查询,可以使用命名查询的方式来写。
例如:

  class Article extends CArtiveRecord{
    public function scope(){
        return array(
           "recentlyPublished" => array(
              "condition" => " to_days(now())-to_days(create_time) < 30 ", //设定条件,创建时间在30天之内
              "limit"  => 3
            )
        );
    }  
  }

然后在使用的时候就可以使用 Article::model()->recentlyPublished()->find(); 来执行查询

3 其他

  • YII框架支持扩展,今天找了一个 Yii email的扩展,用来发送激活邮件
  • 对于密码的支持,从YII 1.1.14版本开始,增加了对密码的支持,提供了一个帮助类,用来生成和校验密码
  • 对于验证码的支持,内置了生成和验证验证码的组件,在demo中有现成的代码可以参考
  • 对于国际化的支持,虽然这个不是硬需求,但是今天还是体验了一下,通过 yiic message命令可以自动生成国际化的翻译文件,当然,里面的内容需要自己填写。在最开始的时候有这样一个框架,后续万一有国际化的需求的话,也可以支持。
    其他像是缓存组件,主题这样的功能,现在还没有用到,但是看YII框架都考虑到了,真正要写出一个这样的框架还是很有难度的。