自研php的仿java的ssh框架

簡介

前段時間寫javaweb,發現ssh框架裏的s標籤很好用,但java代碼寫起來太慢了,入口和配置文件都過於繁瑣,而且s標籤只有固定的那幾種。於是想用php模擬一下javaweb的ssh框架,順便加些輪子比如文本編輯器,驗證碼,防xss攻擊等進去,減少代碼量而又不失可讀性。

版權

遼寧工程技術大學新起點工作室版權所有,項目地址:https://github.com/similing4/php-ssh 轉載請註明版權與出處!

框架流程

本框架入口文件爲index.php,調用過程如圖:
image

使用方法

調用mod:

index.php?mod=Mod名稱
Mod文件格式:放在Mod文件夾下,文件名要求大寫並能表名Mod功能

<?php
  /*    作者:       XXX
  *     創作時間:   XXXX.XX.XX
  *     Mod名:     名稱
  */
  if(!isset($indexMod))//防止其他文件調用。
    die();
  Controller::doAction("Action名","Action方法名",要傳給Action的唯一參數);
  ...多個Action爲一個Mod提供服務
  Controller::showView("加載View中指定名稱的view");//如果Controller指定了就不用
?>

調用Action

Controller::doAction(“Action類名”,”Action方法名”,封裝後的參數);
Controller.php?action=Action類名&method=Action方法名
注:調用Action限定只在mod或URL中調用,您可以將URL調用關閉,關閉方法:將Controller.php中

  if(isset($_GET['action'])&&isset($_GET['method'])){
    Controller::init();
    Controller::doAction($_GET['action'],$_GET['method']);
  }

段註釋掉
Action文件格式:Action是一個靜態類,類名要求規則與Mod相同。不過Action要求放在Action文件夾下且Action名與類名要求一致:

  <?php
    //Action/Action名.php
    class Action名{
      public static function 方法名($param){
        if(Filter::攔截器方法名(攔截器參數))//調用Filter.php內的方法判斷是否執行Service
          Controller::doService("Service名","Service方法名",要傳給Service的唯一參數);
        ...多個Service爲一個Action提供服務
        return 1;//返回1表示根據Mod決定前臺文件,返回其它值則根據Controller的$action屬性決定跳轉到的Mod。
      }
    }
  ?>

調用Service

Controller::doService(“Service類名”,”Service方法名”,封裝後的參數);
注:調用Service限定只在Action中調用
Service文件格式:Service同Action一樣也是一個靜態類,類名要求規則與Action相同。不過Service要求放在Service文件夾下:

  <?php
    //Service/Service名.php
    class Service名{
      public static function 方法名($param){
        /*
          可對$GLOBALS變量操作,最後前臺可以通過s標籤獲取$GLOBALS內的內容
          可引入Dao文件夾下的自定義的任何DaoObj類,類命名方式與Action一致,不過這裏的類可以是動態類或靜態類。
          調用方法:import("Dao.類名");,詳見DB類解釋
          可以在本類內任意方法內對業務邏輯進行處理。
        */
        return 1;//返回內容給Action使用
      }
    }
  ?>

DB類

本類主要用於調用數據庫。
在Dao文件夾中創建任意DaoObj類,命名要求與Action相同(同Java,類名需與文件名一致),方便在Service中import(“Dao.”.類名);調用。
調用方法:

    import("Dao.類名");
    $變量=new 類名();
    $變量返回=$變量->方法名();
    $變量->close();

DaoObj定義類結構如下:

    <?php
        class 類名{
            private $db;
            function __construct(){
                  $this->db=new DB();
            }
            function close(){
                  $this->db->close();
            }
            function 方法名(參數列表){//正常定義普通方法
                  $返回值=$this->db->DB類的方法(參數);
                  //各種處理
                  return $返回值;
            }
        }
    ?>

DB類使用方法如下

DB類設置

屬性:
host=localhost; name=”數據庫用戶”;
pass=; table=”數據庫名”;
$ut=’utf8’;

query($sql);

參數:
sqlsql this->db->fetch_array()的參數,否則返回是否成功。
提示:
除該方法需對參數進行防注入處理外其餘增刪改查方法已對單引號替換,不需要防注入。

fetch_array($query);

參數:
query this->db->query($sql)的返回值
返回值:
如果查詢結果爲空或全部查完了返回false,否則返回查詢的一行數據。
使用方法:

    $sql="select * from users";
    $query=$this->db->query($sql);
    while($row=$this->db->fetch_array($query)){
    //...這裏寫處理
    }

select_arr(name, req = array(),$like=false);

參數:
name req 條件數組
$like 條件是否用like
返回值:
返回查詢結果數組。
使用方法:

    $result=$this->db->select_arr("users");
    foreach($result as $row){
        //這裏寫處理,$row爲每一行的數據,如$row['username']爲改行username列的值。
        //注意,$row中除了有列名爲主鍵的之外還有數組下標爲主鍵的值,因此需要處理後纔可以json_encode
    }

select_first(name, req);

參數:
name req 條件數組
返回值:
返回查詢結果的第一條,沒有則返回false。
使用方法:

    $result=$this->db->select_first("users",array(
        "uid"=>1
    ));//查詢uid爲1的記錄
    if($result)
        ;//有查詢結果的情況

update(table, list,$tiao);

參數:
table list 要更改的值
$tiao 條件數組
返回值:
query結果
使用方法:

    $this->db->update("users",array(
        "password"=>md5("admin")
    ),array(
        "uid"=>1,
        "username"=>"admin"
    ));//更新uid爲1且username爲admin的用戶的password列爲md5("admin");

fn_del(table, c);

參數:
table c 條件數組
返回值:
query結果
使用方法:

    $this->db->fn_del("users",array(
        "uid"=>1
    ));//刪除uid爲1的用戶

fn_insert(table, name,$arr);

參數:
table name 插入數據列名(可以根據該參數進行排序,如果沒有可以填寫”“,需要則按數組順序填寫元素,如array(“uid”,”username”))
$arr 插入行的數據
返回值:
query結果
使用方法:

    $this->db->fn_insert("users","",array(
        "null",
        "admin",
        "adminp"
    ));//插入一個第一列自增的第二列爲admin,第三列爲adminp的行,數據庫語句內的null在數組裏用字符串null表示。

affected_rows();

返回值:影響行數

insert_id();

返回值:AUTO_INCREASE列插入的id

View中的S標籤

簡介:

View內放置的是前臺的網頁內容,所有資源應放置在res文件夾下供view調用。view輸出在index.php入口文件下,因此相對路徑就是入口文件所在位置。
View中可以嵌入

    <?php
        if(!isset($indexMod))
            die();
    ?>

主要是爲了防止非法訪問問題。

S標籤簡介

我們提供了以下標籤內容:

    <s:iterator value="arr">
    </s:iterator>
    <s:property type="item" value="username"/>
    <s:property value="username"/>
    <s:if test="f">
    <s:else />
    </s:if>

另外您可以自定義s標籤,詳見plugins下的S類。
解析類詳見kernel下的ParseS類。

功能介紹

s:iterator 標籤

屬性:
value 對應全局變量GLOBALSphpArrayvalue=user.uid GLOBALS[‘user’][‘uid’];
您也可獲取session中的內容,獲取方法:value=”session.username”

s:property 標籤

屬性:
value 同s:iterator的value,不過要求獲取的值是php的字符串或數字等可直接輸出的類型。
範例:value=”user.uid” 對應 $GLOBALS[‘user’][‘uid’];
type 指定爲item時,必須與s:iterator搭配,表示該iterator中的循環元素。
範例:

    <s:iterator value="users">
        a
        <s:property type="item" value="user.uid" />
        b
        <s:property type="item" value="user.username" />
        c
    </s:iterator>

對應php語句爲

    foreach($GLOBALS['users'] as $item){
        echo "a";
        echo $item['user']['uid'];
        echo "b";
        echo $item['user']['username'];
        echo "c";
    }

如果需要對屬性進行遍歷則需要如下寫法:

    <s:iterator value="pro">
        <s:iterator value="#sheng">
            <s:property value="#sheng" />=><s:property value="" />
        </s:iterator>
    </s:iterator>

對應php語句爲

    foreach($GLOBALS['pro'] as $sheng=>$shi){
        echo $sheng;
        echo "=>";
        echo $shi;//當property的value爲空時其值爲爲當前遍歷key=>value裏的value。
    }

s:if 標籤

屬性:
test 調用Test.php中Test類的靜態方法,其它屬性值作爲參數傳入(不能在屬性中嵌入s標籤),當前運行狀態可以通過kernel.HookParse類獲取
範例:

    <s:if test="test" v="a">
        <s:property value="user.username" />
    <s:else />
        <s:property value="user.password" />
    </s:if>

等價於:

    if(Test::test(array("test"=>"test","v"=>"a")))
        echo $GLOBALS['user']['username'];
    else
        echo $GLOBALS['user']['password'];

s:css 標籤

屬性:
src css文件的名字
範例:

    <s:css src="m.index" />

等價於

    <link href="assests/css/m/index.css"  rel="stylesheet" type="text/css" />

s:js 標籤

屬性:
src js文件的名字
範例:

    <s:js src="m.index" />

等價於

    <script src="assests/m/index.js"  type="text/javascript" />

s:img 標籤

屬性:
src img文件的帶後綴名字(可以加其他參數)
範例:

    <s:img src="m.logo.png" width="100%"/>

等價於

    <img src="assests/images/m/logo.png" width="100%" />

自定義標籤

S類

簡介

S類爲自定義s標籤插件類。當遇到不認識的s標籤時,parse解釋器會調用S插件內的以參數命名的方法執行其功能。每要輸出一條數據時,index都會調用onText或onParamText兩個參數中的一個。如果是普通文本則調用onText否則是s標籤生成的就調用另一個。
image

S類方法命名

<s:g a="b">XXX</s:g>

這段代碼用S類攔截需要定義兩個標籤:

public static function g($param){//<s:g>時執行的內容,$param是屬性鍵值對的array
    $a=$param["a"];
    //...
    return "輸出內容";
}
public static function _g(){//</s:g>時執行的內容
    //...
    return "輸出內容";
}

如果需要對內部的內容進行控制,則需要在onText內對文本進行處理。您可以通過設置靜態變量標誌判斷該text是不是標籤內的內容。如果需要對內容內的標籤進行處理,請使用kernel.HookParse類

預定義的s標籤

我們已經預寫了一些s標籤,如:
s:checkcode標籤用於顯示驗證碼
驗證碼類:Service.model.ValidateCode
服務:Service.CheckCodeService
需要驗證驗證碼可以使用Controller::doService(“CheckCodeService”,”checkCode”,驗證碼);方法。返回真僞值表示驗證碼是否正確。
s:jquery、s:tether、s:bootstrap、s:ueditor標籤用於引用各前端js與css文件
詳情請見主頁範例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章