仿Laravel寫了一個輕量級的框架

kwin發表於2020-12-25

github.com/kwinH/YrPHP
仿Laravel寫了一個輕量級的框架,供大家一起學習,邀請大家一起參與開發。

yrPHP運用大量的單例及工廠模式,確保用最少的資源做最多的事,採用了composer自動載入,無需手動載入類庫檔案,還整合了快取技術及頁面靜態化技術,確保執行速度及響應速度

通過 Composer Create-Project

composer create-project kwin/yrphp yrphp

Git安裝

YrPHP拆分為多個倉庫,主要包括:

之所以設計為應用和核心倉庫分離,是為了支援Composer單獨更新核心框架。

應用專案:github.com/kwinH/YrPHP
核心框架:github.com/kwinH/YrPHP-Core

首先克隆下載應用專案倉庫

git clone https://github.com/kwinH/YrPHP blog

然後切換到blog目錄下面,再克隆核心框架倉庫:

git clone https://github.com/kwinH/YrPHP-Core YrPHP

測試

php -S localhost:8000 -t blog

在瀏覽器中輸入地址:

http://localhost:8000

會自動生成以下目錄結構

至此,YrPHP已經安裝成功。

www WEB部署目錄(或者子目錄)

├─index.php       入口檔案
├─README.md       README檔案
├─App     應用目錄
├─public          資原始檔目錄
└─YrPHP           框架目錄
│  ├─Common      核心公共函式目錄
│  ├─Config      核心配置目錄
│  ├─Lang        核心語言包目錄
│  ├─Libs        框架類庫目錄
│  ├─resource    核心資原始檔目錄

index.php

    <?php
    //是否開啟除錯模式,預設不開啟
    define('DEBUG',true);
    //定義專案目錄
    define("APP", 'App');
    //框架入口檔案
    include 'App.php';

注意:APP的定義必須是當前目錄下的檔名,不需要標明路徑
系統會在第一次呼叫時 自動生成專案目錄結構

www WEB部署目錄(或者子目錄)

├─index.php       入口檔案

├─App     應用目錄
│  ├─Controls    預設控制器目錄
│  ├─Models      預設模型目錄
│  ├─views      預設檢視目錄
│  ├─Common      自定義公共函式目錄
│  ├─Config      自定義配置目錄
│  ├─Lang        自定義語言包目錄
│  ├─Libs        自定義類庫目錄
│  ├─Runtime    快取目錄
.
.
.

系統核心常量

常量 描述
ROOT_PATH 專案根路徑絕對路徑
BASE_PATH 框架目錄絕對路徑
APP_PATH 使用者專案目錄絕對路徑
CORE_PATH 框架核心類庫目錄絕對路徑
LIBS_PATH 框架整合常用類庫目錄絕對路徑
APP_MODE 應用模式
DEBUG 是否開啟除錯模式 (預設false)

路由

基本路由

你可以在 Config/routes.php 檔案中定義應用程式的大多數路由,最基本的YrPHP 路由僅接受 URI 和一個閉包

Route::get('/', function () {
    return 'Hello World';
});

Route::post('foo/bar', function () {
    return 'Hello World';
});

Route::put('foo/bar', function () {
    //
});

Route::delete('foo/bar', function () {
    //
});

為多重動作註冊路由

有時候你可能需要註冊一個可響應多個 HTTP 動作的路由。這時可通過 Routematch 方法來實現:

Route::match(['get', 'post'], '/', function () {
    return 'Hello World';
});

或者,你甚至可以通過 any 方法來使用註冊路由並響應所有的 HTTP 動作:

Route::any('foo', function () {
    return 'Hello World';
});

基礎路由引數

有時候你可能需要從 URI 中獲取一些引數。例如,從 URL 獲取使用者的 ID。這時可通過自定義路由引數來獲取:

Route::get('user/{id}', function ($id) {
    return 'User '.$id;
});

你可以依照路由需要,定義任意數量的路由引數:

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});

路由的引數都會被放在「大括號」內。當執行路由時,引數會通過路由閉包來傳遞。

可選的路由引數

有時候你需要指定路由引數的預設值,可以在引數名稱後面加上 ='value' 來實現:

//return "kwin"
Route::get('user/{name=kwin}', function ($name) {
    return $name;
});

正規表示式限制引數

你可以使用 pattern 引數來限制路由引數格式。pattern 引數為一個陣列,以名稱為key,以定義引數應該如何被限制的正規表示式為value:

Route::get('user/{name}', [
      'pattern'=>['name'=>'[A-Za-z]+']
    'uses'=>function ($name) {
    //
}
]);

Route::get('user/{id}', [
      'pattern'=>['id'=>'[0-9]+']
    'uses'=>function ($id) {
    //
}
]);

Route::get('user/{id}/{name}', [
      'pattern'=>['id'=>'[0-9]+', 'name' => '[a-z]+']]
    'uses'=>function ($id, $name) {
    //
}
]);

全侷限制

如果你希望路由引數可以總是遵循正規表示式,則可以使用 pattern 方法。

模式一旦被定義,便會自動應用到所有後續使用該引數名稱的路由上:

Route::pattern('id', '[0-9]+');
Route::get('user/{id}', function ($id) {
    // Only called if {id} is numeric.
});

命名路由

命名路由讓你可以更方便的為特定路由生成 URL 或進行重定向。你可以使用 as 陣列鍵指定名稱到路由上:

Route::get('user/profile', [
  'as' => 'profile', 
  'uses' => function () {
    //
}
]);

還可以指定路由名稱到控制器動作:

Route::get('user/profile', [
    'as' => 'profile',
    'uses' => 'UserController@showProfile'
]);

路由群組和命名路由

如果你使用了 [路由群組],那麼你可以在路由群組的屬性陣列中指定一個 as 關鍵字,這將允許你為路由群組中的所有路由設定相同的字首名稱:

Route::group(['as' => 'admin::'], function () {
    Route::get('dashboard', [
    'as' => 'dashboard', 
    'uses' => function () {
        // 路由名稱為「admin::dashboard」
    }]);
});

對命名路由生成 URLs

一旦你在指定的路由中分配了名稱,則可通過 route 函式來使用路由名稱生成 URLs 或重定位:

$url = Route::url('profile');

如果路由定義了引數,那麼你可以把引數作為第二個引數傳遞給 route 方法。指定的引數將自動加入到 URL 中:

Route::get('user/{id}/profile', [
  'as' => 'profile', 
  'uses' =>function ($id) {
    //
}
]);

$url = Route::rul('profile', ['id' => 1]);

路由群組

路由群組允許你共用路由屬性,例如:中介軟體、名稱空間,你可以利用路由群組統一為多個路由設定共同屬性,而不需在每個路由上都設定一次。共用屬性被指定為陣列格式,當作 Route::group 方法的第一個引數。

為了瞭解更多路由群組的相關內容,我們可通過幾個常用樣例來熟悉這些特性。

中介軟體

指定中介軟體到所有群組內的路由中,則可以在群組屬性陣列裡使用 middleware 引數。中介軟體將會依照列表內指定的順序執行:

Route::group(['middleware' => 'auth'], function () {
    Route::get('/', function ()    {
        // 使用 Auth 中介軟體
    });

    Route::get('user/profile', function () {
        // 使用 Auth 中介軟體
    });
});

名稱空間

另一個常見的例子是,指定相同的 PHP 名稱空間給控制器群組。可以使用 namespace 引數來指定群組內所有控制器的名稱空間:

Route::group(['namespace' => 'Admin'], function()
{
    // 控制器在「App\Controllers\Admin」名稱空間

    Route::group(['namespace' => 'User'], function()
    {
        // 控制器在「App\Controllers\Admin\User」名稱空間
    });
});

請記住,預設你不用指定完整的App\Controllers 名稱空間字首就能註冊控制器路由。所以,我們只需要指定在基底 App\Controllers根名稱空間之後的部分名稱空間。

路由字首

通過路由群組陣列屬性中的 prefix,在路由群組內為每個路由指定的 URI 加上字首。例如,你可能想要在路由群組中將所有的路由 URIs 加上字首 admin

Route::group(['prefix' => 'admin'], function () {
    Route::get('users', function ()    {
        // 符合「/admin/users」URL
    });
});

你也可以使用 prefix 引數去指定路由群組中共用的引數:

Route::group(['prefix' => 'accounts/{account_id}'], function () {
    Route::get('detail', function ($account_id)    {
        // 符合 accounts/{account_id}/detail URL
    });
});

RESTful 資源控制器

Route::resource('photos', 'PhotosController');

這一條路由宣告會建立多個路由,用來處理各式各樣和相片資源相關的的 RESTful 行為。同樣地,生成的控制器有著各種和這些行為繫結的方法,包含要處理的 URI 及方法對應的註釋。

由資源控制器處理的行為

動詞 路徑 行為(方法) 路由名稱
GET /photos index photos.index
GET /photos/create create photos.create
POST /photos save photos.save
GET /photos/{photo} show photos.show
GET /photos/{photo}/edit edit photos.edit
PUT/PATCH /photos/{photo} update photos.update
DELETE /photos/{photo} delete photos.delete

部分資源路由

宣告資源路由時,你可以指定讓此路由僅處理一部分的行為:

Route::resource('photos', 'PhotosController',
                ['only' => ['index', 'show']]);

Route::resource('photos', 'PhotosController',
                ['except' => ['create', 'store', 'update', 'destroy']]);

命名資源路由

所有的資源控制器行為預設都有路由名稱;不過你可以在選項中傳遞一個 names 陣列來重寫這些名稱:

Route::resource('photos', 'PhotosController',
                ['names' => ['create' => 'photo.build']]);

巢狀資源

有時你可能會需要定義「巢狀」資源路由。例如,相片資源可能會附帶多個「評論」。要「巢狀」此資源控制器,可在路由宣告中使用「點」記號:

Route::resource('photos.comments', 'PhotoCommentController');

此路由會註冊一個「巢狀」資源,可通過類似的 URL 來訪問它:photos/{photos}/comments/{comments}

<?php

namespace App\Controllers;

use YrPHP\Controller;

class PhotoCommentController extends Controller
{
    /**
     * 顯示指定相片的評論。
     *
     * @param  int  $photoId
     * @param  int  $commentId
     * @return Response
     */
    public function show($photoId, $commentId)
    {
        //
    }
}

附加資源控制器

如果想在資源控制器中預設的資源路由之外加入其它額外路由,則應該在呼叫 Route::resource 之前 定義這些路由。否則,由 resource 方法定義的路由可能會不小心覆蓋你附加的路由:

Route::get('photos/popular', 'PhotosController@method');

Route::resource('photos', 'PhotosController');

隱式控制器

YrPHP讓你能夠輕易地通過定義單個路由來處理控制器類中的各種行為。首先,使用 Route::controller 方法來定義路由。controller 方法接受兩個引數。第一個引數是控制器所處理的基本 URI,第二個是控制器的類名稱:

Route::controller('users', 'UserController');

接下來,只要在控制器中加入方法。方法的名稱應由它們所響應的 HTTP 動詞作為開頭,緊跟著首字母大寫的 URI 所組成:

<?php

namespace App\Controllers;

use YrPHP\Controller;

class UserController extends Controller
{
    /**
     * 響應對 GET /users 的請求
     * 響應對 GET /users/index 的請求(PS:當有引數時必須帶上`/index`)
     */
    public function getIndex()
    {
        //
    }


    /**
     * 響應對 GET /users/info/1 的請求
     *          GET /users/info 預設$id為1
     */
    public function getInfo($id=1)
    {
        //
    }

    /**
     * 響應對 POST /users/info 的請求
     */
    public function postInfo()
    {
        //
    }

     /**
     * 響應對 put /users/info/1 的請求
     */
    public function putInfo($id)
    {
        //
    }

     /**
     * 響應對 patch /users/info/1 的請求
     */
    public function patchInfo($id)
    {
        //
    }

     /**
     * 響應對 DETELE /users/info/1 的請求
     */
    public function deleteInfo($id)
    {
        //
    }

     /**
     * 響應對 GET /users/info 的請求
     * 響應對 GET /users/info/1 的請求
     * 響應對 POST /users/info/1 的請求
     * 響應對 put /users/info/1 的請求
     * 響應對 patch /users/info/1 的請求
     * 響應對 delete /users/info/1 的請求
     */
    public function anyInfo($id=null)
    {
        //
    }
}

正如你在上述例子中所看到的,index 方法會響應控制器所處理的根 URI,在這個例子中是 users

YrPHP的Route會從上至下解析,直到找到方法就不會繼續解析其他方法,所以要注意方法的順序。

分派路由名稱

如果你想要 命名 控制器中的某些路由,你可以在 controller 方法中傳入一個名稱陣列作為第三個引數:

Route::controller('users', 'UserController', [
    'getShow' => 'user.show',
]);

路由快取

若你的應用程式完全通過控制器使用路由,你可以利用 YrPHP的路由快取。使用路由快取可以大幅降低註冊全部路由所需的時間。在某些情況下,你的路由註冊甚至可以快上一百倍!要生成路由快取,只要執行 route cache 此 Artisan 命令:

php artisan route cache

這就可以了!現在你的快取路由檔案將被用來代替 Config/routes.php 這一檔案。請記得,若你新增了任何新的路由,就必須生成新的路由快取。因此你可能希望只在你的專案部署時才執行 route cache 這一命令。

要移除快取路由檔案而不生成新的快取,請使用 route clear 命令:

php artisan route clear

URI

####獲得URL

getUrl($url,$indexPage);//如果引數為空 則返回現在所在所在的根目錄如http://example.com/index.php/news/index/id
則返回 http://example.com/
否則返回拼接後的URL
/**
* @param string $url URL表示式,格式:'[模組/控制器/操作#錨點@域名]?引數1=值1&引數2=值2...'
* @param bool|true $indexPage 如果是REWRITE重寫模式 可以不必理會 否則預設顯示index.php
* @return string
*/

預設情況下,index.php 檔案將被包含在你的 URL 中:
example.com/index.php/news/article/my_article

你可以很容易的通過 .htaccess 檔案來設定一些簡單的規則刪除它。下面是一個例子,使用“negative”方法將非指定內容進行重定向:

RewriteEngine on

 RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule .* index.php

在上面的例子中,可以實現任何非 index.php、images 和 robots.txt 的 HTTP 請求都被指向 index.php。

新增 URL 字尾

通過設定 config/config.php 檔案,你可以為 yrphp 生成的 URL 新增一個指定的檔案字尾。舉例來說,如果 URL 是這樣的:

example.com/index.php/products/view/shoes

你可以隨意新增一個字尾,例如 .html,使其顯示為:

example.com/index.php/products/view/shoes.html

你只需修改config/config.php 檔案中

$config['urlSuffix'] = '.html';

實現程式碼提示、跟蹤和自動補全

$ php artisan ide-help generate

引數必須是3個及以上,artisan是入口檔案,ide-help是config/commands.php中類的key值(也可以說是類別名),也可以是控制器名(多目錄用/分開)。generate是方法名,其他引數都做為呼叫的方法的引數

HTTP 中介軟體提供了一個方便的機制來過濾進入應用程式的 HTTP 請求,在一個請求真正處理前,我們可能會對請求做各種各樣的判斷,然後才可以讓它繼續傳遞到更深層次中。

建立一箇中介軟體

中介軟體一般放在App/Middleware目錄下,如下就要一個名為App/Middleware/Auth.php的中介軟體,該中介軟體實現瞭如果使用者還沒登入,則跳轉到登入頁面,否則呼叫$next($request)繼續執行(相當於允許通過中介軟體)

<?php
/**
 * Project: YrPHP.
 * Author: Kwin
 * QQ:284843370
 * Email:kwinwong@hotmail.com
 */
namespace App\Middleware;

use Closure;
use Response;
use YrPHP\IMiddleware;
use YrPHP\Request;

class Auth implements IMiddleware
{
    public function handler(Request $request, Closure $next)
    {
        if (!session('admin')) {
            Response::errorBackTo('您還沒有登入,請先登入', '/admin/manager/login');
        }

        $next($request);
    }
}

呼叫

1、你可以在App/Config/config.php檔案中配置

<?php 
//.....
    /*--------------------以下是全域性中介軟體配置---------------------------------------*/
    'middleware' => [
        //在例項化控制器之前
        'before' => [
            YrPHP\Middleware\VerifyCsrfToken::class,
        ],
        //在例項化控制器例項化之後,未呼叫方法之前
        'middle' => [

        ],
        //呼叫方法之後
        'after' => [

        ],
    ],

//....

2、也可以在控制器中單獨呼叫

<?php
/**
 * Created by PhpStorm.
 * User: TOYOTA
 * Date: 2017/3/16 0016
 * Time: 14:05
 */

namespace App\Controllers\Admin;

use YrPHP\Controller;
class User extends Controller
{
    function __construct()
    {
        parent::__construct();
        $this->middleware('Auth',['except'=>['login']]);
    }

      //....

    }

middleware($middleware, array $options = []) $middleware引數為中介軟體名,$options 為過濾條件,[‘except’=>[‘login’]]代表呼叫login方法不呼叫該中介軟體,其他都要呼叫該中介軟體,[‘only’=>[‘content’]]代表僅呼叫content方法時呼叫該中介軟體,其他都不要呼叫該中介軟體。

#控制器

例子:創造一個控制器
在APP目錄下的controls目錄下建立一個名為:
Test.class.php的檔案

<?php
use YrPHP\Controller;

class Test extends Controller
{
    function __construct()
    {
        parent::__construct();
    }

    function  index()
    {
      echo "Hello World";
    }

接著我們用瀏覽器開啟 example.com/index.php/test
就可以看到 Hello World

##名稱空間

use YrPHP\Controller;

表示引入 YrPHP\Controller 名稱空間便於直接使用。所以,

use YrPHP\Controller;

class Test extends Controller

等同於使用:

class Test extends YrPHP\Controller

規則

  1. 檔名必須是:類名.class.php
  2. 類名首字母必須大寫
  3. 必須繼承Controller類,可以重寫Controller類(這在擴充套件中再說)
<?php
use YrPHP\Controller;

class Test extends Controller
{
    function __construct()
    {
        parent::__construct();
    }

    function  index(Request $request,$id,$name)
    {
      $data=$request->get();
      var_export($data);
      echo $id.$name;
    }

當呼叫控制器時會自動填充引數,如上$request為Request類,$id為URL多於欄位的第一個,$name為多於欄位第二個,以此類推
如訪問example.com//test/index/1/kwin?s=2&page=3 $data=[‘s’=>2,’page’=>3],$id=1,$name=’kwin’

預設的配置檔案在BASE_PATH/config/config.php
如需修改相關配置

如果設定了APP_MODE
則在APP_PATH/config_APP_MODE.php中修改相關配置
否則
在APP_PATH/config_APP.php中修改相關配置

yrPHP框架中所有配置檔案的定義格式均採用返回PHP陣列的方式,格式為:

 //專案配置檔案
return [
  'urlType'  => '2', //URL訪問模式
   'defaultCtl' => 'Index', // 預設控制器名稱
   //更多配置引數
   //...
  ];

讀取配置

無論何種配置檔案,定義了配置檔案之後,都統一使用系統提供的C方法(可以藉助Config單詞來幫助記憶)來讀取已有的配置。

獲取已經設定的引數值:C(‘引數名稱’)

除config.php檔案外,其他檔案可以用C(‘fileName.param’)獲取

$charset = C('charset');//獲得配置中的編碼格式 =>YrPHP\Config::get('charset');兩者等同

如果charset尚未存在設定,則返回NULL。

支援設定預設值例如:

C('my_config','default_config');

如果不傳引數 則返回所有配置資訊

$config = C();//return array;

動態配置

設定新的值 如果存在則覆蓋,否則新建:

YrPHP\Config::set('引數名稱','新的引數值');

YrPHP\Config::set("openCache",false);//關閉資料庫快取,只在該次請求有效

批量設定:

YrPHP\Config::set(array(key=>value,key1=>value1));

載入配置檔案

YrPHP\Config::load('config_test');//=>APP_PATH . 'config/config_test.php'

配置

'modelDir' =>  "Models", //設定模型目錄位置

/--------------------以下是模版配置---------------------------------------/

'setTemplateDir' => APP_PATH . "views/", //設定模板目錄位置

'setCompileDir' => APP_PATH . "runtime/compile_tpl/", //設定模板被編譯成PHP檔案後的檔案位置

'auto_literal' => false, //忽略限定符周邊的空白

'caching' => 1, //快取開關 1開啟,0為關閉

'setCacheDir' => (APP_PATH . "runtime/cache/"), //設定快取的目錄

'cacheLifetime' => 60 * 60 * 24 * 7, //設定快取的時間 0表示永久

'leftDelimiter' => "{", //模板檔案中使用的“左”分隔符號

'rightDelimiter' => "}", //模板檔案中使用的“右”分隔符號

載入檢視

display($fileName, $tplVars = ‘’, $cacheId = ‘’);

$fileName 提供模板檔案的檔名
$tpl_var 動態資料
$cacheId 當$cacheId為false時,不會生成快取檔案,其他情況做為快取ID,當有個檔案有多個快取時,$cacheId不能為空,否則會重複覆蓋

return \view::display('name');

上面的 name 便是你的檢視檔案的名字 如 index.html。

給檢視新增動態資料

\view::assign('name','yrPHP');//賦值單個資料

//等同於

return \view::display('name',array('name'=>'yrPHP'));

檢視快取

以下引數可用於檢視快取

protected $caching = true;   //bool 設定快取是否開啟 配置中可設定

protected $cacheLifeTime = 3600;  //定義快取時間 配置中可設定

protected $cacheDir;      //定義生成的快取檔案路徑 配置中可設定

protected $cacheSubDir;   //定義生成的快取檔案的子目錄預設為控制器名

protected $cacheFileName; //定義生成的快取檔名 預設為方法名

private $cacheFile;      //最後形成的快取完整路徑 根據前面引數生成

模版繼承

控制器中呼叫

<?php
/**
 * Created by YrPHP.
 * User: Kwin
 * QQ:284843370
 * Email:kwinwong@hotmail.com
 */
namespace App\Controllers;

use YrPHP\Controller;

class Index extends Controller
{
    function __construct()
    {
        parent::__construct();

    }


    function index()
    {
        $m = M('users');
        $all =$m->all();
       return \view::display('index',['data'=>$all]);

    }
}

定義頁面佈局layout.php

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>

{yield body}

</body>
</html>

繼承頁面佈局 index.php

{extends layout}

{section body}
{require test}
{endsection}


{section test}
123456
{endsection}

由於layout中沒有test內容區塊 所以section test中的內容不會顯示

test.php

<h1>hello world</h1>

<div>
    {foreach($data as $k=>$v)}
    {=$v->userName}
    {/foreach}
</div>

最後解析成:

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>

<h1>hello world</h1>

<div>
    <?php foreach($data as $k=>$v){?>
    <?php echo $v->userName;?>
    <?php } ?>
</div>

</body>
</html>

變數輸出

在模板中輸出變數的方法很簡單,例如,在控制器中我們給模板變數賦值:

{=$test}

模板編譯後的結果就是:

<?php echo $test;?>

輸出函式返回值

{=getUrl('public/css/style.css')}

注意模板標籤的{=之間不能有任何的空格,否則標籤無效。

運算子

{$i++}

{$i--}

{--$i}

{++$i}

包含檔案

{include header.html}

{require footer.html}

賦值

{assign $name='yrPHP'}

{$name}

注意模板標籤的assign$之間必須有空格,否則標籤無效。

將函式賦值

{assign $config = C()}

判斷

{assign $i=10}

{if($i>=90)}

優秀

{elseif($i>=80)}{else if( $i >= 60 )}

及格

{else}

不及格

{/if}

迴圈

####foreach

{assign $config = C()}

{foreach (config as k=>$v)}

<tr>
{if ($k=='openCache')}
{break}
{/if}
<td>{=$k}</td>
<td>{=$v}---</td>
</tr>

{/foreach}

for

{for(i=0;i<10;$i++)}

{if($i==5)}

{continue}

{/if}

{=$i}

<br/>

{/for}

while

{assign $i=10}

{while($i)}

{=$i}

</br>

{$i--}

{/while}

使用php程式碼

<?php echo "Hello World";?>

自定義標籤

####在配置檔案tabLib.php檔案中自定義標籤

/*

系統將自動新增定界符,其他同正規表示式

如下 在模版中呼叫方式為 {=dump $a}

*/

return array(

'=dump\s(.)\s*' => "<?php var_dump( \1);?>",

);

使用

<?php

use YrPHP\Controller;

class MyController extends Controller

{

function __construct()
{
    parent::__construct();
}

function index()
{

$data['arr'] = array(1,2,3,4,5,6);

return \view::display('index.html',$data);

}

}

在模版中呼叫

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TEST</title>
</head>

<body>
{=dump $a}
</body>

</html>

表單

例項:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>TEST</title>
</head>

<body>
{=form::open(['url' => 'index.php', 'method' => 'get', 'class' => 'form', 'id' => 'form-article'], $data)}
{=form::text('name', ['class'=>'input-text'],'預設值')}
{=form::password('password', ['class'=>'input-text'])}
{=form::submit('提交')}
{=form::close()}
</body>

</html>

開啟表單

{=form::open(['url' => 'index.php', 'method' => 'get', 'class' => 'form', 'id' => 'form-article'], $data)}

{=form::close()}

預設表單使用 POST 方法,當然您也可以指定傳參其他表單的方法

當填寫第二個引數$data(模型)時,當您產生表單元素時,如 text 欄位,模型的值將會自動比對到欄位名稱,並設定此欄位值,舉例來說,使用者模型的 email 屬性,將會設定到名稱為 email 的 text 欄位的欄位值,不僅如此,當 Session 中有與欄位名稱相符的名稱, Session 的值將會優先於模型的值,而優先順序如下:

  1. Session 的資料 (舊的輸入值)
  2. 明確傳遞的資料
  3. 模型屬性資料

這樣可以允許您快速地建立表單,不僅是繫結模型資料,也可以在伺服器端資料驗證錯誤時,輕鬆的回填使用者輸入的舊資料!

CSRF 保護

YrPHP提供了一個簡易的方法,讓您可以保護您的應用程式不受到 CSRF (跨網站請求偽造) 攻擊。首先YrPHP會自動在使用者的 session中放置隨機的token,別擔心這些會自動完成。如果你呼叫了=form::open方法,這個 CSRF 引數會用隱藏欄位的方式自動加到您的表單中。另外,您也可以使用 token 方法去產生這個隱藏的 CSRF 欄位的 HTML 標籤:

{=form::token()}

標籤(Label)

{=form::label('name', '姓名', array('class' => 'name'))}

注意: 在建立標籤時,任何您建立的表單元素名稱與標籤相符時,將會自動在 ID 屬性建立與標籤名稱相同的 ID。

文字欄位

{=form::text('name', array('class' => 'input-text'), '預設值')}

預設ID為欄位名,如上如果沒有在第二個引數中指定ID,則ID為name

多行文字域

{=form::textarea('desc', array('class' => 'input-text','size'=>50,10), '預設值')}

size 50為cols,10為rows,cols和rows預設就是50*10

密碼欄位

{=form::password('name', array('class' => 'input-text'))}

隱藏域

{=form::hidden('name', '預設值' , array('class' => 'input-text'))}

核取方塊、單選按鈕

{=form::checkbox('name', 'value',array('class' => 'input-checkbox'),true)}
{=form::radio('name', 'value',array('class' => 'input-radio'),true)}

第四個引數為是否預設選中

下拉框

{=form::select($name, $list = [], $options = ['class'=>'input-select'], $selected = null)}

按鈕

{=form::reset('name',['class'=>'button'])}
{=form::submit('name',['class'=>'button'])}
{=form::button('name',['class'=>'button'])}

資料庫配置

<?php

/**

- Created by YrPHP.
- User: Kwin
- QQ:284843370
- Email:kwinwong@hotmail.com
    */

//資料庫配置例子 請將該檔案複製到你的專案下的config資料夾下 不允許直接在該檔案下配置

return [
'defaultConnection' => 'default',
  'default' => [
    //主伺服器
    'masterServer' => [
        'dsn' => 'mysql:host=localhost;dbname=huobucuo',
        'dbDriver' => 'pdo', // 資料庫型別
        'dbType' => 'mysql', // 資料庫型別
        'dbHost' => 'localhost', // 伺服器地址
        'dbName' => 'test', // 資料庫名
        'dbUser' => 'root', // 使用者名稱
        'dbPwd' => 'root', // 密碼
        'dbPort' => '3306', // 埠
        'tablePrefix' => 'drp_', // 資料庫表字首
        'charset' => 'utf8',
    ],
    //從伺服器可以配置多個,也可以不配置,不做讀寫分離
    /*
    'slaveServer'  => [
        [
            'dsn'         => '',
            'dbDriver'    => 'pdo', // 資料庫型別
            'dbType'      => 'mysql', // 資料庫型別
            'dbHost'      => '', // 伺服器地址
            'dbName'      => '', // 資料庫名
            'dbUser'      => '', // 使用者名稱
            'dbPwd'       => '', // 密碼
            'dbPort'      => '3306', // 埠
            'charset'     => 'utf8',
        ],
        [
            'dsn'         => '',
            'dbDriver'    => 'pdo', // 資料庫型別
            'dbType'      => 'mysql', // 資料庫型別
            'dbHost'      => '', // 伺服器地址
            'dbName'      => '', // 資料庫名
            'dbUser'      => '', // 使用者名稱
            'dbPwd'       => '', // 密碼
            'dbPort'      => '3306', // 埠
            'charset'     => 'utf8',
        ],
    ],
    */
]
  ];

資料庫配置模版檔案在BASE_PATH/config/database.php
如需修改相關配置

如果設定了APP_MODE
則在APP_PATH/database__APP_MODE.php中修改相關配置
否則
在APP_PATH/database.php中修改相關配置

模型定義

模型類並非必須定義,只有當存在獨立的業務邏輯或者屬性的時候才需要定義。
檔名為模型名.class.php UserModel的檔名為UserModel.class.php

模型類通常需要繼承系統的YrPHP\Model類或其子類,下面是一個Model\UserModel類的定義:

<?php
namespace App\Model;
use YrPHP\Model;

class UserModel extends Model
{

    public function __construct()
    {
        parent::__construct('users');
  }

}

模型例項化

M([‘模型名’]);

模型名是為選填 如果為空則例項化父類。

M('UserModel');//例項化UserModel模型

例項化請確保引數確定 區分大小寫
如果模型UserModel不存在,則例項化父類 表為user_model

CURL

Active Record 模式

####新增資料INSERT

$this->insert([新增的資料]);

namespace App\Model;
use YrPHP\Model;
class UserModel extends Model
{
    public function __construct()
    {
        parent::__construct('users');//操作users表
  }

    public function userInsert()
    {
      return $this->insert(['name'=>'kwin','age'=>'18']);
       //return int 受影響行數
  }


      public function userInserts()
    {
      return $this->inserts([
        ['name'=>'kwin','age'=>'18'],
        ['name'=>'nathan','age'=>'26']
      ]);
       //return int 受影響行數
  }
}

新增的資料如果為空,則獲取$_POST資料,預設開啟驗證,如果欄位資料庫不存在 則過濾
如果有臨時關閉則 $this->setOptions(array(‘_validate’=>false));

inserts支付批量新增


刪除資料DELETE

$this->delete(條件);

在自定義模型在呼叫

<?php
namespace App\Model;
use YrPHP\Model;
class UserModel extends Model
{

    public function __construct()
    {
        parent::__construct('users');
  }

    public function userDelete()
    {
     return $this->delete(['id <'=>3]);
     //return int 受影響行數
  }
}

條件為array|string 推薦array


在控制器在呼叫

    <?php
    use core\Controller;

    class Users extends Controller
    {
        function __construct()
        {
            parent::__construct();
        }

       //直接呼叫父類model,操作users表
        function  model()
        {
         $db = M('users');
         $db->delete([是否自動新增字首bool]);

        }
       //例項化剛才建立的模型,操作其方法
        function  userModel()
        {
         $db = M('UserModel');
         $db->userDelete();
        }

修改資料

$this->update(array 資料,array 條件);
//return int 受影響行數

條件為array|string 推薦array

查詢資料

FIND

**find($id = 0, $assoc = false)
string|int $id 查詢的條件主鍵值
bool|false $assoc 當該引數為 TRUE 時,將返回 array 而非 object
以主鍵為條件 查詢


$db = M('users');
$db->find(1);
//生成的SQL語句
//select * from `users` where id=1;

ALL

**all($assoc = false, $tableName = “”, $auto = true)
bool|false $assoc 當該引數為 TRUE 時,將返回 array 而非 object
以主鍵為條件 查詢


$db = M('users');
$db->find(1);
//生成的SQL語句
//select * from `users` where id=1;

GET

get($tableName = “”, $auto = true)

生產最後的SQL一句

string $tableName 表名
$auto 是否自動新增表字首


$this->get([表名][是否自動新增字首bool]);
//生成的SQL語句
//select * from `tableName`;

SELECT|FIELD

select($field =[],[…])

$field string|array 欄位 ,多個引數


EXCEPT

except($field = [])
查詢tableName表(預設$this->tableName)除了$field外所有欄位
$field array 欄位


$this->select('field1,field2,field3')->all();
//生成的SQL語句
//select `field1`,`field2`,`field3` from `tableName`;

$this->select(['field1','field2','field3'])->all();
//生成的SQL語句
//select `field1`,`field2`,`field3` from `tableName`;

LIMIT

limit($offset, $length = null)
$offset 起始位置
$length 查詢數量


//查詢一條資料
$this->limit(1)->all();
//生成的SQL語句
//select * from `tableName` limit 1;

WHERE

where($where = ‘’, $logical = “and”)

@param $logical 與前一個條件的連線符
@param $where string|array
string “id>’100’” -> where id>’100’**

array($field=>$value)

例:
[‘id’=>1,’or id’=>2,’age >’=>15,’or id in’=>[1,2,3,4,5]]

$value 值 array|string|int|null|‘not null’
field可以用空格分開,與連線符、欄位名、運算子組成
運算子 =|!=|<>|>|<|like|is|between|not between|in|not in
連線符 or|and 與前一個條件的連線符 預設呼叫$logical


$this->where("id='100'")->all();
//生成的SQL語句
//select * from `tableName` where (id = '100');

$this->->where("id='1659'")->where(array('id !='=>'1113','name like'=>'%nathan%'))->get('users');//字首在config/database.php 設定 tablePrefix
//生成的SQL語句
//SELECT  *  FROM  `yrp_users` where (id='1659') or ( `id` != '1113'  or  `name` like '%nathan%' )


$this->where("id='1596'")->where(array('id !='=>'1113','or fullname like'=>'%nathan%',
'and update_time between'=>array(10000 , 100000000)))->get('users');
//字首在config/database.php 設定 tablePrefix
//生成的SQL語句
//SELECT  *  FROM  `yrp_users` where (id='1596') and ( `id` != '1113'  or  `fullname` like '%nathan%'  and  `update_time` between '10000' and '100000000' )

$this->where(array('id in'=>array(1,2,3,4,5,6,7,8,9,10)))->get('users');
//生成的SQL語句
//SELECT  *  FROM  `yrp_users` where ( `id` in(1,2,3,4,5,6,7,8,9,10))

where 可以用連貫查詢 一組where會用()包含

ORDER

$this->order('id desc')->all();
//生成的SQL語句
 SELECT  *  FROM  `yrp_users` ORDER BY `id` desc

GROUP

$this->order('ip')->all();
//生成的SQL語句
//SELECT  *  FROM  `yrp_users` `GROUP BY `ip`

HAVING

同WHERE

$this->group('id')->having(array('id >'=>'2000'))->get('users');
//生成的SQL語句
//SELECT  *  FROM  `yrp_users` GROUP BY `id` having ( `id` > '2000' )

JOIN

join($table, $cond, $type = ‘’, $auto = true)
@param $table 表名
@param $cond 連線條件 同where
@param string $type 連線方式
@param bool $auto 是否自動新增表字首

$this->join('users as b', ['a.id'=>'b.id'], 'left')->get('users as a');
//生成的SQL語句
//SELECT  *  FROM  `yrp_users` as `a` LEFT JOIN `yrp_users` as `b` ON `a`.`id`=`b`.`id`

##計算

統計COUNT

count($tableName,$auto = true)
$tableName 表名
$auto 是否自動新增字首 bool 預設true

$this->count('users');
//同
$this->select('count(*) as count')->get('users')->row()->count;
//生成的SQL語句
//SELECT COUNT(*) as `count` FROM  `yrp_users`

最大值MAX

max($tableName,$field,$auto = true)
$tableName 表名
$field 欄位名 不能為空
$auto 是否自動新增字首 bool 預設true

$this->max('users','id');
//同
$this->select('max(id) as max')->get('users')->row()->max;
//生成的SQL語句
//SELECT MAX(id) as `max` FROM  `yrp_users`

最小值MIN

min($tableName,$field,$auto = true)
$tableName 表名
$field 欄位名 不能為空
$auto 是否自動新增字首 bool 預設true

$this->min('users','id');
//同
$this->select('min(id) as min')->get('users')->row()->min;
//生成的SQL語句
//SELECT MIN(id) as `min` FROM  `yrp_users`

累計值SUM

sum($tableName,$field,$auto = true)
$tableName 表名
$field 欄位名 不能為空
$auto 是否自動新增字首 bool 預設true

$this->sum('users','id');
//同
$this->select('sum(id) as sum')->get('users');
//生成的SQL語句
//SELECT SUM(id) as `sum` FROM  `yrp_users`

平均值SUM

sum($tableName,$field,$auto = true)
$tableName 表名
$field 欄位名 不能為空
$auto 是否自動新增字首 bool 預設true

$this->avg('users','id');
//同
$this->select('avg(id) as avg')->get('users');
//生成的SQL語句
//SELECT AVG(id) as `avg` FROM  `yrp_users`

##查詢結果返回

####row($assoc = false) 查詢一條結果

*@param bool|false $assoc 當該引數為 TRUE 時,將返回 array 而非 object 當查詢價格為空時 返回false
*

//查詢一條資料 返回物件格式
$this->select('id')->where(array('id'=>1))->get('users')->row();
//返還一條資料 當查詢結果為空時 返回false
//stdClass::__set_state(array( 'id' => '231', ))

//查詢一條資料 返回陣列格式
$this->select('id')->where(array('id'=>1))->get('users')->row(true);
//返還一條資料 當查詢結果為空時 返回false
//array(1) { ["id"]=> string(3) "231" }

####result($assoc = false) 查詢一條結果

*@param bool|false $assoc 當該引數為 TRUE 時,將返回 array 而非 object 當查詢價格為空時 返回一個空的陣列array()
*

//查詢所有資料 返回物件格式
$this->select('id')->get('users')->result();
//返還一條資料 當查詢結果為空時 返回一個空的陣列array()
//array ( 0 => stdClass::__set_state(array( 'id' => '1', )), 1 => stdClass::__set_state(array( 'id' => '2', )), 2 => stdClass::__set_state(array( 'id' => '3', )), .....)

//查詢所有資料 返回陣列格式
$this->select('id')->get('users')->result(true);
//返還所以資料 當查詢結果為空時 返回一個空的陣列array()
//array ( 0 => array ( 'id' => '1', ), 1 => array ( 'id' => '2', ), 2 => array ( 'id' => '3', ),....)

####rowCount() — 返回受上一個 SQL 語句影響的行數

$db = M();
$re = $db->select('id')->get('users')->result();
echo  $db->rowCount();//輸出查詢結果總條數

##query 操作SQL

$db = M();
$re = $db->query("select * from yrp_users")->result();
//查詢 同 $db->get('yrp_users')

$re = $db->query("update yrp_users name='nathan' where id=500")->rowCount();
//修改 返回受影響的行數

事務

####要使用事務來執行你的查詢, 你可以使用如下方法:

  1. startTrans(); 開啟事務
  2. transComplete(); 自動判斷錯誤 提交或則回滾
  3. commit(); 事務提交
  4. rollback(); 事務回滾

####屬性
public $transStatus;bool 事務是否發生錯誤

$m = M('users');
$t= $m->transaction(function () use($m) {
  $m->insert(['name' => 'q1']);

   $m->insert(['name' => 'q17567']);
   $m->insert(['name1' => 'q3', 'age' => 24]);

})->transStatus;
var_export($t);






或則

try{
$this->startTrans();
$this->query('一條SQL查詢...');

$this->query('另一條查詢...');

re = this->query('還有一條查詢...');
$this->commit();
}catch (\Exception $e){
$m->rollback();
}

錯誤除錯

$db = M();
$error = $db->error();//返回的是一個陣列array
var_export($error);

資料快取

//獲得快取例項 $dbCacheType 快取驅動,有file memcache、memcached、redis,預設為file
$cache = core\cache::getInstance($dbCacheType = null);

/**
* 設定快取
* @param string $key 要設定值的key
* @param string $val 要儲存的資料
* @param null $timeout 有效期單位秒 0代表永久 預設為配置檔案中的cacheLifetime
* @return bool
  */

$cache->set($key, $val, $timeout = null);


/**
* 獲取快取
* @param $key
* @return mixed
  */
  $cache->get($key = null);

/**
* 根據key值刪除快取
* @param string $key
  */
  $cache->del($key = null);

/**
* 清空所有快取 慎用
* @return mixed
  */
  $cache->clear();

資料庫快取

在配置檔案中配置資料庫相關配置

return array(
/*--------------------以下是資料庫配置---------------------------------------*/
'openCache' => true, //是否開啟快取
'defaultFilter' => 'htmlspecialchars', // 預設引數過濾方法 用於I函式過濾 多個用|分割stripslashes|htmlspecialchars
'dbCacheTime' => 0, //資料快取時間0表示永久
'dbCacheType' => 'file', //資料快取型別 file|memcache|memcached|redis
//單個item大於1M的資料存memcache和讀取速度比file
'dbCachePath' => APP_PATH . 'runtime/data/',//資料快取檔案地址(僅對file有效)
'dbCacheExt' => 'php',//生成的快取檔案字尾(僅對file有效)

'memcache' => '127.0.0.1:11211',//string|array多個用陣列傳遞 array('127.0.0.1:11211','127.0.0.1:1121')

'redis' =>'127.0.0.1:6379',//string|array多個用陣列傳遞 array('127.0.0.1:6379','127.0.0.1:6378')
);
$this->setCache(false);
//預設配置檔案中openCache = true,臨時關閉 可以用setCache 僅當前請求有效

##lastQuery() 查詢上一條SQL語句

$db = M();
$re = $db->get('users')->result();
echo $db->lastQuery();
//select * from `yrp_users`

使用多資料庫連線

當你使用了多個連線時,則可以通過 connection 方法來訪問每個連線。傳遞給 connection 方法的 name 必須對應至 config/database.php 配置檔案中的連線列表的其中一個:

$users = M()->connection('foo')->select(...);

資料預處理——訪問器和修改器

定義一個訪問器

若要定義一個訪問器,則必須在你的模型上建立一個 getFooAttribute 方法。要訪問的 Foo 欄位需使用「駝峰式」來命名。在這個例子中,我們將為 first_name 屬性定義一個訪問器。當 Eloquent 嘗試獲取 first_name 的值時,將會自動呼叫此訪問器:

<?PHP
namespace App\Models;

use YrPHP\Model;

class User extends Model
{
    function __construct()
    {
        parent::__construct();
        $this->tableName = 'user';
    }

    /**
     * 獲取使用者的名字。
     *
     * @param  string  $value
     * @return string
     */
    public function getFirstNameAttribute($value)
    {
        return ucfirst($value);
    }
}

如你所見的,欄位原始的值被傳遞到訪問器中,讓你可以操作並返回結果。如果要訪問被修改的值,則可以像這樣來訪問 first_name 屬性:

$user = M('User')->find(1);

$firstName = $user->first_name;

//closePreProcess方法可以臨時關閉訪問器和修改器
$user = M('User')->closePreProcess()->find(1);

定義一個修改器

若要定義一個修改器,則必須在模型上定義一個 setFooAttribute 方法。要訪問的 Foo 欄位需使用「駝峰式」來命名。讓我們再來定義 first_name 屬性的修改器。當我們嘗試在模型上設定 first_name 的值時,將會自動呼叫此修改器:

<?php

namespace App\Models;

use YrPHP\Model;

class User extends Model
{
    /**
     * 設定使用者的名字。
     *
     * @param  string  $value
     * @return string
     */
    public function setFirstNameAttribute($value)
    {
       return strtolower($value);
    }
}

修改器會獲取屬性已經被設定的值,讓你可以操作該值並將其設定到 Eloquent 模型內部的 $attributes 屬性上。舉個例子,如果我們嘗試將 first_name 屬性設定成 Sally

$user = Model('User')->insert(['first_name'=>'Sally'])//closePreProcess方法可以臨時關閉訪問器和修改器
$user = M('User')->closePreProcess()->insert(['first_name'=>'Sally'])

在這個例子中,setFirstNameAttribute 函式將會使用 Sally 作為引數來呼叫。修改器會對該名字使用strtolower 函式並將其值返回。


namespace App;


use YrPHP\FormRequest;


class TestRequest extends FormRequest
{

    /**
     * 設定驗證規則
     * @return array
     */
    function rules()
    {
    /**
     * array('欄位名' => array(array('驗證規則', ['錯誤提示'],[ '值域','值域',...])));
     * 驗證規則:
     * required: 欄位不能為空
     * equal:值域:string|null 當值與之相等時,通過驗證
     * notequal:值域:string|null 當值與之不相等時 通過驗證
     * in:值域:array(1,2,3)|1,2,3 當值存在指定範圍時 通過驗證
     * notin: 值域:array(1,2,3)|1,2,3  當不存在指定範圍時 通過驗證
     * between: 值域:array(1,30)|1,30 當存在指定範圍時 通過驗證
     * notbetween:值域:array(1,30)|1,30 當不存在指定範圍時 通過驗證
     * length:值域:array(10,30)|10,30 當字元長度大於等於10,小於等於30時 通過驗證 || array(30)|30 當字元等於30時 通過驗證
     * unique:值域:string 當該欄位在資料庫中不存在該值時 通過驗證
     * email:  當值為email格式時 通過驗證
     * url:  當值為url格式時 通過驗證
     * number:  當值為數字格式時 通過驗證
     * regex:值域:正規表示式 //當符合正規表示式時 通過驗證
     * phone:判斷是否為手機號碼
     * verifyCode:值域:session驗證碼key值(預設verify)  判斷驗證碼的確與否
     * extend:值域:匿名函式 function(表單值,[ '值域'])
     *
     */
        return ['id' => [[10, '', 'equal']]];
    }


}
<?php
/**
 * Created by YrPHP.
 * User: Kwin
 * QQ:284843370
 * Email:kwinwong@hotmail.com
 */
namespace App\Controllers;

use App;
use App\TestRequest;
use YrPHP\Controller;


class Index extends Controller
{
    function __construct()
    {
        parent::__construct();
    }


    function index(TestRequest $request, $id)
    {
        //如果TestRequest驗證沒通過,則會將錯誤資訊寫入session 如果是post提交則返回上一頁,如果是ajax,則返回{error:{}}, 獲取錯誤資訊:session('errors')
    }
<?php


/**
 * 訪問控制器的原始資源
 * 返回當前例項控制器物件
 * $app =& getInstance();
 * @return Controller 資源
 */
function &getInstance(){}

/**
* 獲取配置引數
* @param string|array $name 配置變數 
* @param mixed $default 預設值
* @return mixed
*/
   function C($name = null,  $default = null){}

/**********************************************************/
/**
* @param string $url URL表示式,格式:'[模組/控制器/操作#錨點@域名]?引數1=值1&引數2=值2...'
* @param bool|true $indexPage 如果是REWRITE重寫模式 可以不必理會 否則預設顯示index.php
* @return string
    */
   getUrl($url = '', $indexPage = true){}

/**********************************************************/
/**
* 獲取語言 支援批量定義
* @param null $key 語言關鍵詞
* @param null $value 配置值
* @return array|null
    */
    function getLang($key = null, $value = null){}

/**********************************************************/
/**
* 以單例模式例項化類
* loadClass($className [, mixed $parameter [, mixed $... ]])
* @param $className 需要得到單例物件的類名
* @param $parameter $args 0個或者更多的引數,做為類例項化的引數。
* @return  object
    */
    function loadClass(){}

/**********************************************************/
/**
* 如果存在自定義的模型類,則例項化自定義模型類,如果不存在,則會例項化Model基類,同時對於已例項化過的模型,不會重複去例項化。
* @param string $modelName 模型類名
* @return object
    */
    function M($modelName = ""){}

/**********************************************************/
/**
* 管理session
* @param string $key
* @param string $val
* @return bool
    */
   session($key='',$val=''){};

//新增單個session
session('id','15');//$_SESSION['id'] = 15
//批量新增session
session(array('id'=>15,'name'=>'LiLei'));

//獲得session
session('id');

//刪除
session('id',null);

//清空session
session(null);

/**********************************************************/
/**
* 管理cookie
* @param string $key
* @param string $val
* @return bool
    */
   cookie($key='',$val=''){};

//新增單個session
cookie('id','15');
//批量新增session
cookie(array('id'=>15,'name'=>'LiLei'));

//獲得session
cookie('id');

//刪除
cookie('id',null);

/**********************************************************/
/**
* 優化的require_once
* @param string $filename 檔案地址
* @return boolean
    */
   function requireCache($filename){}

/**********************************************************/
/**
 *base64編碼壓縮序列化資料
* @param $obj
* @return string
    */
    function mySerialize($obj = ''){}

 /**********************************************************/
/**
* 反序列化
* @param $txt
* @return mixed
    */
   function myUnSerialize($txt = ''){}

 /**********************************************************/
/**
 *404跳轉
* @param string $msg 提示字串
* @param string $url 跳轉URL
* @param int $time 指定時間跳轉
    */
    function error404($msg = '', $url = '', $time = 3){}

/**
 * 下載一個遠端檔案到客戶端
 * 例  clientDown('http://img.bizhi.sogou.com/images/2012/02/13/66899.jpg');
 * @param $url 一個遠端檔案
 * @return bool
 */
function clientDown($url){}

/**
 * 獲取某個月第一天與最後一天的時間戳
 * @param  [type] $month [description]
 * @param  string $year [description]
 * @return [type]        [description]
 */
function getMonthTime($month, $year = ''){}

/**
 * http://www.php100.com/html/php/lei/2013/0904/3819.html
 * 獲取客戶端真實IP
 * @return mixed
 */
function getClientIp(){}

/**
 * //新浪根據IP獲得地址
 * @param string $ip
 * @return mixed|string
 * array ( 'ret' => 1, 'start' => -1, 'end' => -1, 'country' => '中國', 'province' => '浙江', 'city' => '杭州', 'district' => '', 'isp' => '', 'type' => '', 'desc' => '', )
 */
function Ip2Area($ip = ''){}

/**
 * 生成隨機字元
 * @param  string $type w:英文字元 d:數字 wd: dw:數字加英文字元
 * @param  integer $len [description]
 * @return [type]        [description]
 */
function randStr($len = 8, $type = 'wd'){}

/**
 * 傳送HTTP狀態
 * @param integer $code 狀態碼
 * @return void
 */
function sendHttpStatus($code){}

/**
 * 頁面跳轉
 * @param string $url
 */
function gotoUrl($url = ''){}

/**
 * 資料脫敏處理隱私資料的安全保護
 * @param string $str
 * @param int $start
 * @param int $length
 * @param string $replacement
 * @return mixed
 */
function desensitize($str = '', $start = 0, $length = 0, $replacement = '*'){}

/**
 * 返回一箇舊的輸入值
 * @param string $inputName
 * @param null $default
 * @return string|null
 */
function old($inputName = '', $default = null){}

/**
 * CSRF Token,該Token可用於驗證登入使用者和發起請求者是否是同一人,如果不是則請求失敗。
 * @return bool|string
 */
function csrfToken(){}

/**
 * 生成一個包含CSRF Token值的隱藏域
 * @return string
 */
function csrfField(){}

/**
 * 命名規則轉換
 * @param string $name
 * @param int $type 0、小駝峰法、1、大駝峰法、2、蛇形命名法
 * @return mixed|string
 */
function parseNaming($name = '', $type = 0){}

將你自己的 .php 檔案放入APP_PATH/Libs
檔案的命名規則為類名.php,類名不能與系統類庫(LIBS_PATH)下的類重名

####例:

APP_PATH/Libs資料夾中新建一個名問MyPage.class.php的類檔案

    <?php
    namespace App\Libs;

    class MyPage
    {
        function __construct()
        {
            parent::__construct();
        }

        function  index()
        {
          echo "Hello World";
        }

在控制器中呼叫

    <?php
     namespace App\Controllers;

    use YrPHP\Controller;

    class Test extends MyController
    {
        function __construct()
        {
            parent::__construct();
        }

        function  index()
        {
         $class = loadClass('App\Libs\MyPage');
         $class->index();
        }

loadClass($className)以單例模式例項化類

請確保類名正確 區分大小寫

所有系統類都註冊了別名,可以直接在控制器中用別名::方法名()來呼叫
如: crypt::encrypt($str)

當然自定義的類,在Config/class_alias.php中註冊了別名,也可以這樣呼叫

加密類 Crypt

配置金鑰

APP_PATH.config/config.php下配置

<?PHP
    return
    array('cryptMode' => 'des3',//現在加密方式只有DES3
          'cryptKey' => '123456789',//金鑰
          'cryptIv' =>  '123456789',//初始向量
    );

加密解密

<?PHP
  $crypt = loadClass('YrPHP\Crypt');
  $crypt->encrypt($str);//加密資料
  $crypt->decrypt($str);//解密資料

陣列類

<?php
/**
 * Created by YrPHP.
 * User: Kwin
 * QQ:284843370
 * Email:kwinwong@hotmail.com
 * GitHub:https://github.com/kwinH/YrPHP
 */
namespace YrPHP;

class Arr
{
    /**
     * 不區分大小寫的in_array實現
     * @param string $value
     * @param array $array
     * @return bool
     */
    public static function inIArray($value = '', $array = []){}

    /**
     * 在陣列中搜尋給定的值(不區分大小寫),如果成功則返回相應的鍵名
     * @param $needle
     * @param $haystack
     * @param bool $strict
     * @return mixed
     */
    public static function arrayISearch($needle, $haystack, $strict = false){}


    /**
     * 不區分key值大小寫獲取陣列中的值
     * @param array $arr
     * @param string $key
     * @return mixed
     */
    public static function arrayIGet(array $arr = [], $key = ''){}

    /**
     * 多維陣列轉一維陣列
     * @param array $multi
     * @return array
     */
    public static function arrToOne(array $multi = []){}


    /**
     *  判斷是不是索引陣列
     * @param array $array
     * @return bool true ? 索引陣列 : 不是索引陣列
     */

    public static function isAssoc(array  $array = []){}


    /**
     * 使用“點”符號從陣列中獲取一個項。
     * @param array $arr
     * @param string $key
     * @param null $default
     * @return mixed
     */
    public static function get(array $arr = [], $key = '', $default = null){}


    /**
     * 返回陣列中指定的陣列項
     * @param array $arr 指定陣列
     * @param $onlyKey 可以為多個引數或則單個陣列格式
     * @return array
     */
    public static function only(array &$arr = [], $onlyKey){}


    /**
     * 過濾陣列中指定的陣列項,並返回
     * @param array $arr 指定陣列
     * @param $exceptKey 可以為多個引數或則單個陣列格式
     * @return array
     */
    public static function except(array &$arr = [], $exceptKey){}


}

檔案處理類 File

<?php
/**
* 建立檔案
  *
* @param  string $aimUrl 檔案地址
* @param  boolean $overWrite 該引數控制是否覆蓋原檔案
* @return  boolean
  */
  YrPHP\File::createFile($aimUrl, $overWrite = false);

/**
* 遞迴刪除資料夾或檔案
* @param  string $aimDir 檔案地址
* @return  boolean
    */
   YrPHP\File::rm($aimDir);

/**
* 建立資料夾
* @param  string $aimUrl 檔案地址
* @param  int    $mode 許可權
* @return  viod
    */
   YrPHP\File::mkDir($aimUrl, $mode = 0777);

/**
* 移動資料夾或檔案
* @param  string $oldDir 原地址
* @param  string $aimDir 目標地址
* @param  boolean $overWrite 該引數控制是否覆蓋原檔案
* @return  boolean
    */
   YrPHP\File::mv($oldDir, $aimDir, $overWrite = false)/**
* 複製檔案或則資料夾
* @param  string $oldDir
* @param  string $aimDir
* @param  boolean $overWrite 該引數控制是否覆蓋原檔案
* @return  boolean
    */
   YrPHP\File::cp($oldDir, $aimDir, $overWrite = false)/**
* 修改檔名
    *$path 需要修改的檔案路徑
    *$name 修改後的檔案路徑及檔名
* @return    boolean
    */
   YrPHP\File::rename($path, $name)/**
* 將字串寫入檔案
* @param  string $filename 檔案路徑
* @param  boolean $str 待寫入的字元資料
    */
   YrPHP\File::vi($filename, $str);

/**
* 將整個檔案內容讀出到一個字串中
* @param  string $filename 檔案路徑
* @return string
    */
   YrPHP\File::readsFile($filename);

/**
* 將檔案內容讀出到一個陣列中
* @param  string $filename 檔名
* @return array
    */
   YrPHP\File::readFile2array($filename);

/**
* 根據關鍵詞列出目錄下所有檔案
* @param    string $path 路徑
* @param    string $key 關鍵詞
* @param    array $list 增加的檔案列表
* @return    array    所有滿足條件的檔案
* 返回一個索引為結果集列名的陣列
    */
   YrPHP\File::dirList($path, $key = '', $list = array())/**
* 根據關鍵詞列出目錄下所有檔案
    *
* @param    string $path 路徑
* @param    string $key 關鍵詞
* @param    array $list 增加的檔案列表
* @return    array    所有滿足條件的檔案
* 返回一個索引為結果集列名和以0開始的列號的陣列
    */
   YrPHP\File::search($path, $key = '', $list = array())/**
* 獲取檔名字尾
* @param    string $filename 檔案路徑
* @return    string
    */
   YrPHP\File::fileExt($filename)/**
* 獲得檔案相關資訊
* @param $filename 檔案路徑
* @return array|bool
* 將會返回包括以下單元的陣列 array :dirname(檔案實在目錄)、basename(檔名帶字尾)、extension(檔案字尾
* 如果有)、filename(檔名不帶字尾)、dev(裝置名)、ino(inode 號碼)、mode(inode 保護模式)、nlink(被連線數
* 目)、uid(所有者的使用者 id)、gid(所有者的組 id)、rdev(裝置型別,如果是 inode 裝置的話)、size(檔案大小的
* 位元組數)、atime(上次訪問時間(Unix 時間戳))、ctime(上次改變時間(Unix 時間戳))、blksize(檔案系統 IO
* 的塊大小)、blocks(所佔據塊的數目)。
    */
   YrPHP\File::getFileInfo($filename);

/**
* 統計目錄大小
* @param    string $dirname 目錄
* @return    string      位元B
    */
   YrPHP\File::getDirSize($dirname)/**
* 將位元組轉換成Kb或者Mb...
* @param $size為位元組大小
    */
   YrPHP\File::bitSize($size)/**
* 返回當前目錄層級下所有檔案及目錄列表
* @param    string $dir 路徑
* @return    array    返回目錄列表
   array (
   App
   2 => 'public',
   YrPHP
   )

 */
YrPHP\File::dirNodeTree($dir);

/**
* 遞迴迴圈目錄列表,並返回關係層級
* @param    string $dir 路徑
* @param    int $parentid 父id
* @param    array $dirs 傳入的目錄
* @return    array    返回目錄及子目錄列表

 array (
  1 =>
  array (
    'id' => 1,
    'parentid' => 0,
    App
    App
  ),
  2 =>
  array (
    'id' => 2,
    'parentid' => 1,
    Common
    Common
  ),
  )
 */
YrPHP\File::dirTree($dir, $parentid = 0, $dirs = array())

檔案上傳類 Uoload

支援多檔案上傳

上傳配置設定

key 值選項 說明
maxSize int 最大的上傳檔案 KB 預設為0 不限制   注意:通常PHP也有這項限制,可以在php.ini檔案中指定。通常預設為2MB。
savePath / 上傳目錄 預設/根目錄
fileName None 自定義上傳檔案後的名稱,不含檔案字尾
allowedTypes array() 允許上傳檔案的字尾列表預設空陣列為允許所有
isRandName BOOL 設定是否隨機重新命名檔案, false不隨機 預設 true
overwrite BOOL 是否覆蓋。true則覆蓋,false則重新命名  預設false

init($config)引數初始化

uploadFile($field)檔案上傳

@param 表單名稱 $field,上傳檔案的表單名稱 如果為空則上傳 $_FILES陣列中所有檔案

getFileInfo($inputName=null);獲得上傳檔案相關屬性

inputName 表單名 如果為多檔案上傳 則在表單名後面跟下標
如果inputName==null 則返回一個以表單名為鍵的多維陣列 return array(inputName1=>array(),inputName2=>array(),…)

如果inputName表單名不為空 則返回該表單上傳的檔案資訊 如果表單名錯誤 則 返回false

如果上傳檔案有錯誤 則return array(‘errorCode’=>錯誤程式碼)

否則 return 包括以下單元的陣列 array :fileName(最終檔名包含字尾)、fileType(檔案mime型別)、filePath(包含檔名的完整路徑)、origName(上傳前的檔名)、fileExt(檔案字尾)、 fileSize(檔案大小KB)、isImage(是否是圖片bool)、imgWidth(圖片寬度)、imgHeight(圖片高度)

getError($errorCode = null)

$errorCode 根據錯誤程式碼獲得上傳出錯資訊

<?php
 $config = $config = array(
 'maxSize'=>100,
 'savePath'=>'/ttt',
 'isRandName'=>false,
 'allowedTypes'=>array('jpg','png')
 );
 //引數配置可以在例項化時就傳入
        $up = loadClass('YrPHP\\upload',$config);
        $re = $up->uploadFile('file123');

 //引數配置也可以在init方法中傳入
        $up = loadClass('YrPHP\\upload');
        $re = $up->init($config)->uploadFile('file123');

影像處理類 Image

支援連貫操作

####縮圖

/**
縮圖
**/
$img = loadClass('YrPHP\Image','D:/test.jpg');//例項化 並開啟test.jpg圖片,也可以用open方法開啟圖片

/**
* 獲得圖片的基本資訊
* @return array(dirname,basename,extension,filename,width,height,type,mime)
  */
  var_dump($img->getInfo());

$img=$img->thumb(array('width'=>100,'height'=>100,'pre'=>0.5));//如果設定了$config['per']則按照$config['per']比例縮放 否則按給定寬高

/**
* 直接在瀏覽器顯示圖片
* @param null $type 影像型別(gif,jpeg,jpg,png) 為空則按原圖型別
* @return bool
  */
  $img->show($type = null);//顯示圖片

/**
* 儲存影像
* @param  string $imgname 影像儲存名稱
* @param  string $type 影像型別(gif,jpeg,jpg,png) 為空則按原圖型別
* @param  integer $quality 影像質量
* @param  boolean $interlace 是否對JPEG型別影像設定隔行掃描
  */
  $img->save($imgPath='test1.jpg', $type = null, $quality = 80, $interlace = true);

/**
* 客服端下載
* @param null $downFileName 檔名 預設為原檔名
* @param null $type 影像型別(gif,jpeg,jpg,png) 為空則按原圖型別
  */
  $img->down($downFileName = null, $type = null);

####水印

$img = loadClass('YrPHP\Image');//例項化
$img->open('D:/test.jpg');//並開啟test.jpg圖片

/**
* 為圖片新增文字水印
* @param    string $water array('str'=>'ok','font'=>'msyh.ttf','color'=>'#ffffff','size'=>20,'angle'=>0,)
* str水印文字為必填 font字型 color預設黑色 size文字大小預設20,angle文字傾斜度預設0 暫只支援GIF,JPG,PNG格式
* @param    int $position 水印位置,有10種狀態,0為隨機位置;
* 1為頂端居左,2為頂端居中,3為頂端居右;
* 4為中部居左,5為中部居中,6為中部居右;
* 7為底端居左,8為底端居中,9為底端居右;
* 指定位置 array(100,100) | array('x'=>100,'y'=>100)
* @return    mixed
  */
  $img->text($water = array(), $position = 0);
  //其他 顯示 下載 儲存同上
  /*************************************************************/

$img = loadClass('YrPHP\Image','D:/test.jpg');//例項化 並開啟test.jpg圖片


/**
* 新增水印圖片
* @param  string $water 水印圖片路徑
* @param  integer|array $position 水印位置
* @param    int $position 水印位置,有10種狀態,0為隨機位置;
* 1為頂端居左,2為頂端居中,3為頂端居右;
* 4為中部居左,5為中部居中,6為中部居右;
* 7為底端居左,8為底端居中,9為底端居右;
* 指定位置 array(100,100) | array('x'=>100,'y'=>100)
* @param  integer $alpha 水印透明度
* @param  integer $waterConf array('width'=>100,'height'=>100) 調整水印大小 預設呼叫原圖
  */
  $img->watermark($water, $position = 0, $alpha = 100, $waterConf = array())//其他 顯示 下載 儲存同上

####剪輯

$img = loadClass('YrPHP\Image','D:/test.jpg');//例項化 並開啟test.jpg圖片

/**
* 裁剪影像
* @param  integer $w 裁剪區域寬度
* @param  integer $h 裁剪區域高度
* @param  integer|array $position 裁剪起始位置 有10種狀態,0為隨機位置;
* 1為頂端居左,2為頂端居中,3為頂端居右;
* 4為中部居左,5為中部居中,6為中部居右;
* 7為底端居左,8為底端居中,9為底端居右;
* 指定位置 array(100,100) | array('x'=>100,'y'=>100)
* @param  integer $width 影像儲存寬度 預設為裁剪區域寬度
* @param  integer $height 影像儲存高度 預設為裁剪區域高度
  */
  $img->cut($w, $h, $position = 1, $width = null, $height = null);
  //其他 顯示 下載 儲存同上

CURL類 Curl

支援連貫操作

//GET請求
$curl = loadClass('YrPHP\Curl');

//設定需要獲取的URL地址
$curl = $curl->setUrl($url . 'https://api.weixin.qq.com/sns/oauth2/access_token');

/**
* 啟用時會傳送一個常規的GET請求
* @param array|string $data array('user'=>'admin','pass'=>'admin') | admin&admin
* @return $this
  */
  $curl = $curl->get('appid=' . $AppID . '&secret=' . $AppSecret . '&code=' . $code . '&grant_type=authorization_code')/**
* 執行一個cURL會話 返回執行的結果
* @param bool $debug 是否開啟除錯模式 如果為true將列印除錯資訊
* @return mixed
  */
   $curl =$curl->exec();
//POST請求
$curl = loadClass('YrPHP\Curl');

//設定需要獲取的URL地址
$curl = $curl->setUrl($url . 'https://127.0.0.1/test.php');

/**
* 啟用時會傳送一個常規的POST請求,預設型別為:application/x-www-form-urlencoded,就像表單提交的一樣
* @param array|string $data
* @param string $enctype application|multipart  預設為application,檔案上傳請用multipart
  */
  $curl = $curl->post(array('name' => 'test', 'sex'=>1,'birth'=>'20101010'))/**
* 執行一個cURL會話 返回執行的結果
* @param bool $debug 是否開啟除錯模式 如果為true將列印除錯資訊
* @return mixed
  */
   $curl =$curl->exec();
//獲取Cookie模擬登陸
$cookie_file = tempnam('./temp','cookie');

$curl = loadClass('YrPHP\Curl');

//設定需要獲取的URL地址
$curl = $curl->setUrl($url . 'https://127.0.0.1/login.php');

/**
* 啟用時會傳送一個常規的POST請求,預設型別為:application/x-www-form-urlencoded,就像表單提交的一樣
* @param array|string $data
* @param string $enctype application|multipart  預設為application,檔案上傳請用multipart
  */
  $curl = $curl->post(array('name' => 'admin', 'passwd'=>'123456'))/**
* 獲得cookies
* @param string $path 定義Cookie儲存路徑 必須使用絕對路徑
  */
  $curl = $curl->getCookie($cookie_file);

/**
* 執行一個cURL會話 返回執行的結果
* @param bool $debug 是否開啟除錯模式 如果為true將列印除錯資訊
* @return mixed
  */
   $curl =$curl->exec();

$curl = $curl->setUrl($url . 'https://127.0.0.1/getUserInfo.php');

/**
* 取出cookie,一起提交給伺服器
* @param string $path 定義Cookie儲存路徑 必須使用絕對路徑
  */
  $data = $curl->setCookieFile($cookie_file)->exec();


/**
* 設定HTTP請求中"Cookie: "部分的內容。多個cookie用分號分隔,分號後帶一個空格(例如, "fruit=apple; colour=red")。
* @param string|array $cookies 定義Cookie的值
  */
  $curl = $curl->setCookie(array('name'=>'admin','passwd'=>'123456'));

$data = $curl->exec();
var_dump($data);

//清理cookie檔案
unlink($cookie_file);
$headers['Referer'] = 'http://www.baidu.com';
$headers['CLIENT-IP'] = '202.103.229.40';
$headers['X-FORWARDED-FOR'] = '202.103.229.40';

$curl = loadClass('YrPHP\Curl');

//設定需要獲取的URL地址
$curl = $curl->setUrl($url . 'https://127.0.0.1/login.php');

/**
* @param bool $verify 是否驗證證照 預設false不驗證
* @param string $path 驗證證照時,證照路徑
* @return $this
  */
  $curl = $curl->sslVerify(false);

/**
* 傳遞一個連線中需要的使用者名稱和密碼
* @param array|string $userPassword 格式為:array('userName','password') 或則, "username:password"
  */

$curl = $curl->setUserPassword(array('admin','123456'));


//setHeader(array())設定請求頭
$curl->setHeader($headers)->get()->exec();
var_dump($data);

驗證碼類 VerifyCode

//配置,以下均為預設值
$conf= array(
'width' =>100;//圖片寬度
'height' =>40;//圖片高度
'size' =>21;//字型大小
'font'=>'yrphp/resource/font/1.ttf';//字型
'len' =>4;//隨機字串長度
'type';//預設是大小寫數字混合型,1 2 3 分別表示 小寫、大寫、數字型
'backColor' => '#eeeeee';     //背景色,預設是淺灰色
'pixelNum' => 666; //干擾點個數
'lineNum'=> 10; //干擾線條數
);

/**
* @param string $code 驗證碼key,用於session獲取,預設verify
* @param bool $line 是否顯示干擾線
* @param bool $pixel 是否顯示干擾點
    */
   //引數可以在例項化時傳入 也可以呼叫init方法初始化時呼叫
   loadClass('YrPHP\VerifyCode',$conf)->show($code = 'verify', $line = true, $pixel = true);

分頁類

//配置,以下均為預設值
        $config = array(
            'totalRows' => 100,// 總行數
            'listRows' => 12,// 列表每頁顯示行數 預設12
            'rollPage' => 6,// 分頁欄每頁顯示的頁數 預設8
            'p' => 'p',
            'url' => 'http://example.com/test/page/',//跳轉連結URL,不配置 預設為當前頁
            'urlParam' => array('key' => 'hello'),// 分頁跳轉時要帶的引數

            //新增封裝標籤
            'fullTagOpen' => '<div>',//整個分頁周圍圍繞一些標籤開始標籤
            'fullTagClose' => '</div>',//整個分頁周圍圍繞一些標籤結束標籤

            //自定義“當前頁”連結
            'nowPage' => 3,//當前頁,預設為'1'第一頁
            'nowTagOpen' => '<strong>',//在當前頁外圍包裹開始標籤 預設<strong>
            'nowTagClose' => '</strong>',//在當前頁外圍包裹結束標籤

            //自定義起始連結
            'firstTagOpen' => '',//在首頁外圍包裹開始標籤
            'firstLink' => '首頁',//你希望在分頁中顯示“首頁”連結的名字  如果不想顯示該標籤 則設定為FALSE即可
            'firstTagClose' => '',//在首頁外圍包裹標籤結束標籤

            //自定義結束連結
            'lastTagOpen' => '',//在尾頁外圍包裹開始標籤
            'lastLink' => '尾頁',//你希望在分頁中顯示“尾頁”連結的名字  如果不想顯示該標籤 則設定為FALSE即可
            'lastTagClose' => '',//在尾頁外圍包裹標籤結束標籤

            //自定義“上一頁”連結
            'prevTagOpen' => '',//在上一頁外圍包裹開始標籤
            'prevLink' => '上一頁',//上一頁顯示文字  如果不想顯示該標籤 則設定為FALSE即可
            'prevTagClose' => '',//在上一頁外圍包裹標籤結束標籤

            //自定義“下一頁”連結
            'nextTagOpen' => '',//在下一頁外圍包裹開始標籤
            'nextLink' => '下一頁',//你希望在分頁中顯示“下一頁”連結的名字 如果不想顯示該標籤 則設定為FALSE即可
            'nextTagClose' => '',//在下一頁外圍包裹標籤結束標籤

            //自定義“數字”連結  如果不想顯示該標籤 將rollPage設定為0即可
            'otherTagOpen' => '',//在其他“數字”連結外圍包裹開始標籤
            'otherTagClose' => '',//在其他“數字”連結外圍包裹標籤結束標籤

            //自定義“select下拉跳轉”
            'gotoPage' => false,//是否顯示select下拉跳轉,預設不顯示
            'gotoTagOpen' => '',//在select下拉跳轉外圍包裹標籤
            'gotoTagClose' => '',//在select下拉跳轉外圍包裹標籤閉合

        );

        //例項化分頁類 引數也可以通過init方法初始化
        $page = loadClass('YrPHP\page', $config);
        //輸出分頁的html
        echo $page->show();

生成樣式

驗證類 Validate

<?php
    /**
     * 判斷是否為空值,當資料不為空時 return true
     * @param null $data
     * @return bool
     */
        YrPHP\Validate::required(null);//return false

       /**
         * 當兩個值相等時 return true
         * @param string $data
         * @param string $val
         * @return bool
         */
        YrPHP\Validate::equal(20, 10);//false
        YrPHP\Validate::equal(20, 20);//true
        /**
         * 當兩個不值相等時 return true
         * @param string $data
         * @param string $val
         * @return bool
         */

        YrPHP\Validate::notEqual(20, 10);//true
        YrPHP\Validate::notEqual(20, 20);//false
        /**
         * 當存在指定範圍時return true
         * @param string $data
         * @param array|string $range
         * @return bool
         */
        YrPHP\Validate::in(2, '2,8');//true
        YrPHP\Validate::in(10, array(2, 8));//false

        /**
         * 當不存在指定範圍時return true
         * @param string $data
         * @param array|string $range
         * @return bool
         */
        YrPHP\Validate::notIn(2, '2,8');//false
        YrPHP\Validate::notIn(10, array(2, 8));//true


        /**
         * 當存在指定範圍時return true
         * @param null $data
         * @param array|string $range
         * @return bool
         */
        YrPHP\Validate::between(10, '10,20');//true
        YrPHP\Validate::between(10, array(20, 15));//false


        /**
         * 當不存在指定範圍時return true
         * @param null $data
         * @param array|string $range
         * @return bool
         */
        YrPHP\Validate::notBetween(10, '10,20');//false
        YrPHP\Validate::notBetween(10, array(20, 15));//true


        /**
         * 當資料庫中值存在時 return false
         * @param $tableName 表名
         * @param $field 欄位名
         * @param $val 值
         * @return bool
         */
        YrPHP\Validate::unique($tableName, $field, $val);

        /**
         * 當字元長度存在指定範圍時return true
         * @param null $data 字串
         * @param array|string $range 範圍
         * @return bool
         * length('abc',3); strlen('abc') ==3
         * length('abc',array(5,3))==length('abc',array(3,5)) => strlen('abc') >=3 && strlen('abc') <=5
         */
        YrPHP\Validate::length($data = '', $range = '');


        /**
         * Email格式驗證
         * @param    string $value 需要驗證的值
         */
        YrPHP\Validate::email('5463@qq.com');//true

        /**
         * URL格式驗證
         * @param    string $value 需要驗證的值
         */
        YrPHP\Validate::url('https://www.baidu.com');//true

        /**
         * 數字格式驗證
         * @param    string $value 需要驗證的值
         */
        YrPHP\Validate::number(100); //true;

        /**
         * 使用自定義的正規表示式進行驗證
         * @param    string $value 需要驗證的值
         * @param    string $rules 正規表示式
         */
        YrPHP\Validate::regex($value, $rules);

        /**
         * 判斷是否為手機號碼
         * @param    string $value 手機號碼
         */
        YrPHP\Validate::phone($value = '');

        /**
         * 判斷驗證碼的確與否
         * @param string $value 值
         * @param string $code session中的key 預設'verify'
         * @return bool
         */
        YrPHP\Validate::verifyCode($value, $code);

        /**
        自定義匿名函式
        */
     YrPHP\Validate::extend('test', function ($key, $val) {
      if ($key > $val) return true;
      return false;
      });
      var_dump(YrPHP\Validate::test(3, 2)); //true

購物車類 Cart

<?php
//配置引數
$conf = array(
'saveMode' = 'session'//儲存方式,有cookie和session,預設session
'mallMode'=>false,//商城模式 true多商家 false單商家,預設false單商家
'key'=>'cartContents',//儲存在session或者cookie中的key
);
//例項化購物車類 配置引數也可以通過init方法初始化
$cart = loadClass('YrPHP\Cart',$conf);

//新增一個產品到購物車
/**
六個保留的索引分別是:
id - 你的商店裡的每件商品都必須有一個唯一的識別符號(identifier)
qty - 購買的數量(quantity)。
price - 商品的價格(price)。
name - 商品的名稱(name)。
options - 標識商品的任何附加屬性。必須通過陣列來傳遞。
seller - 賣家標識ID,多商家模式必須設定
id, qty, price 和name是必需的,options是可選的
除以上六個索引外,還有兩個保留字:rowId 和 subtotal。它們是購物車類內部使用的,因此,往購物車中插入資料時,請不要使用這些詞作為索引。

其他可自行擴充套件
 */
      $items = array(
               'id'      => 'sku_123ABC',
               'qty'     => 1,
               'price'   => 39.95,
               'name'    => 'T-Shirt',
               'options' => array('Size' => 'L', 'Color' => 'Red')
            );
/**
* 新增單條或多條購物車專案
* @param array $items 新增多個可為二維陣列
* @param bool $accumulation 是否累加,預設累計
* @return bool|string
  */
  $cart->insert($items);



/**
* 返回一個包含了購物車中所有資訊的陣列
* @param null $mallMode 商城模式 true多商家(二維陣列) false單商家(一維陣列)預設為配置中的模式,當為單商家時,不管設定什麼都返回一維陣列
* @param null $seller 返回指定商家下的所以產品,預設為null,返回所以商家,單商家下無效
* @return array
  */
  $cartList = $cart->getContents()/**
* 獲得一條購物車的專案
* @param null $rowId
* @return bool|array
  */
  $rowId = n'b99ccdf16028f015540f341130b6d8ec';
  $item = $cart->getItem($rowId);

/**
* 顯示購物車中總共的商品數量
* @param null $seller 商家識別符號 單商家模式下無效
* @return int
  */
  $totalQty = $cart->totalQty();

/**
* 顯示購物車中的總計金額  商家識別符號 單商家模式下無效
* @return int
  */
  $priceTotal = $cart->total();

/**
* 顯示購物車中總共的專案數量
* @param null $seller 商家識別符號 單商家模式下無效
* @return int
  */
  $totalItems =$cart->totalItems();


/**
* 更新購物車中的專案 必須包含 rowId
* @param $item 修改多個可為二維陣列
* @return bool
  */

$items = array(
'rowId'=> 'b99ccdf16028f015540f341130b6d8ec',
'qty'=>6,
)
$cart->update($items);

/**
* 刪除一條購物車中的專案  必須包含 rowId
* @param null|array $rowId
* @return bool
  */
  $rowId = n'b99ccdf16028f015540f341130b6d8ec';
  $cart->remove($rowId);

/**
*刪除多條用陣列
*/
$rowId = array(
'b99ccdf16028f015540f341130b6d8ec',
'qweuyrf16028f985640f341130b6d66c'
);
$cart->remove($rowId);

/**
* 銷燬購物車
  */
  $cart->destroy()/**
* 根據rowId 查詢商家
* @param $key
* @return bool|int|string  當為單商家模式時直接返回false,當找不到時也返回false,否則返回商家識別符號
  */
  $rowId = 'b99ccdf16028f015540f341130b6d8ec';
  $seller = $cart->searchSeller($rowId);
  ?>

Email 類 PHPMailer

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章