如何寫一個自己的渣渣PHP框架(4)

weixin_34185364發表於2017-03-28

已經建立了 IndexController 並且這個時候也可以根據不同的 url 來訪問不同控制器的不同方法...

現在加一個控制器的基類,Controller 在/data/momoma/core下建立一個目錄 controller 並且在該目錄下建立一個類 BaseController.php

<?php
/**
 * Created by PhpStorm.
 * User: momoma
 * Date: 2017/3/8
 * Time: 下午4:22
 */
namespace core\controller;

class BaseController {

    /**
     * 控制器 重定向
     * @param string  $url   跳轉的URL路徑
     * @param int     $time  多少秒後跳轉
     */
    public function redirect($url, $time = 0) {
        if (!headers_sent()) {
            if ($time === 0) header("Location: ".$url);
            header("refresh:" . $time . ";url=" .$url. "");
        } else {
            exit("<meta http-equiv='Refresh' content='" . $time . ";URL=" .$url. "'>");
        }
    }

    /**
     *  資料基礎驗證-是否是Email 驗證:xxx@qq.com
     *  Controller中使用方法:$this->is_email($value)
     *  @param  string $value 需要驗證的值
     *  @return bool
     */
    public function is_email($value) {
        return preg_match('/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/', trim($value));
    }
}

這個基類可以做什麼?

你所有的業務層上的 controller 所要繼承的功能都可以寫,你也可以在 /data/momoma/core/controller/ 這個目錄裡建立若干類,依次繼承。功能比如 redirect,is_email 驗證 email 當然你可以寫很多的東西,或者接收引數並且過濾:

  /**
   * 獲取引數 如果是GET $type == 'G'
   * @param $value
   * @param $type
   * @return string
   */
  public function getParams($value,$type) {
      if($type == 'G') {
          return $this->filter_str($_GET[$value]);
      } elseif($type == 'P') {
          return $this->filter_str($_POST[$value]);
      }
  }

  /**
   * 安全過濾類-字串過濾 過濾特殊有危害字元
   *  Controller中使用方法:$this->controller->filter_str($value)
   * @param  string $value 需要過濾的值
   * @return string
   */
  public function filter_str($value) {
      $value = str_replace(array("\0","%00","\r"), '', $value);
      $value = preg_replace(array('/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]/','/&(?!(#[0-9]+|[a-z]+);)/is'), array('', '&amp;'), $value);
      $value = str_replace(array("%3C",'<'), '&lt;', $value);
      $value = str_replace(array("%3E",'>'), '&gt;', $value);
      $value = str_replace(array('"',"'","\t",'  '), array('&quot;','&#39;','    ','&nbsp;&nbsp;'), $value);
      return $value;
  }

然後你的業務層的控制器,比如你上次建立的檔案 IndexController 或者你將來要建立的各種 ArticleController AdminController 等等。

你就可以這樣使用,首先繼承 BaseController

/**
 * Index控制器
 * User: momoma
 * Date: 2017/1/23
 * Time: 下午3:44
 */
namespace controller;
use core\controller\BaseController;

class IndexController extends BaseController {

    public function run(){
        echo "我是 Index 制器的 run 方法";

        // 接收引數
        $username = $this->getParams('name','G');
        $password = $this->getParams('pwd','P');
        $email = $this->getParams('email','P');

        // 驗證郵箱
        if (!$this->is_email($email)){
            echo "郵箱格式不正確";
        }
        // 重定向
        $this->redirect('/index.php?c=demo');
    }

    public function demo(){
        echo "我是 Index 制器的 demo 方法";
    }
}

控制器的基類完成了,然後就可以寫view層了...

下一篇寫...

相關文章