ThinkPHP3.1新特性之Action參數綁定

ThinkPHP3.1版的Action參數綁定功能提供了URL變量和操作方法的參數綁定支持,這一功能可以使得你的操作方法定義和參數獲取更加清晰,也便于跨模塊調用操作方法。這一新特性對以往的操作方法使用沒有任何影響,你也可以用新的方式來改造以往的操作方法定義。

Action參數綁定的原理是把URL中的參數(不包括分組、模塊和操作地址)和控制器的操作方法中的參數進行綁定。例如,我們給Blog模塊定義了兩個操作方法read和archive方法,由于read操作需要指定一個id參數,archive方法需要指定年份(year)和月份(month)兩個參數。


    class BlogAction extends Action{
      public function read($id){
        echo 'id='.$id;
        $Blog = M('Blog');
        $Blog->find($id);
      }
      public function archive($year='2012',$month='01'){
        echo 'year='.$year.'&month;='.$month;
        $Blog = M('Blog');
        $year  =  $year;
        $month =  $month;
        $begin_time = strtotime($year . $month . "01");
        $end_time = strtotime("+1 month", $begin_time);
        $map['create_time'] = array(array('gt',$begin_time),array('lt',$end_time));
        $map['status'] =  1;
        $list = $Blog->where($map)->select();
      }
     }

URL的訪問地址分別是:


    http://serverName/index.php/Blog/read/id/5
    http://serverName/index.php/Blog/archive/year/2012/month/03

兩個URL地址中的id參數和year和month參數會自動和read操作方法以及archive操作方法的同名參數綁定。
輸出的結果依次是:


    id=5
    year=2012&month;=03

Action參數綁定的參數必須和URL中傳入的參數名稱一致,但是參數順序不需要一致。也就是說


    http://serverName/index.php/Blog/archive/month/03/year/2012

和上面的訪問結果是一致的,URL中的參數順序和操作方法中的參數順序都可以隨意調整,關鍵是確保參數名稱一致即可。
如果用戶訪問的URL地址是(至于為什么會這么訪問暫且不提):


    http://serverName/index.php/Blog/read/

那么會拋出下面的異常提示:

參數錯誤:id

報錯的原因很簡單,因為在執行read操作方法的時候,id參數是必須傳入參數的,但是方法無法從URL地址中獲取正確的id參數信息。由于我們不能相信用戶的任何輸入,因此建議你給read方法的id參數添加默認值,例如:


     public function read($id=0){
        echo 'id='.$id;
        $Blog = M('Blog');
        $Blog->find($id);
      }

這樣,當我們訪問


    http://serverName/index.php/Blog/read/

的時候 就會輸出


    id=0

當我們訪問


    http://serverName/index.php/Blog/archive/

的時候,輸出:


    year=2012&month;=01

所屬標簽

無標簽

25选5玩法中奖