溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

php7怎么實(shí)現(xiàn)一個(gè)簡(jiǎn)易框架

發(fā)布時(shí)間:2021-08-02 16:14:20 來源:億速云 閱讀:132 作者:chen 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“php7怎么實(shí)現(xiàn)一個(gè)簡(jiǎn)易框架”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“php7怎么實(shí)現(xiàn)一個(gè)簡(jiǎn)易框架”吧!

框架的核心鏈路是從開始的請(qǐng)求路由解析到控制器的分發(fā),model的數(shù)據(jù)交互到響應(yīng)。使用其他的框架實(shí)現(xiàn)會(huì)非常的笨重,集成的內(nèi)容太多,很多都不需要用到,所以借鑒其他框架寫了一個(gè)簡(jiǎn)單實(shí)用的框架。

先從路由開始來說:

1)路由

路由協(xié)議的規(guī)則是使用了正則表達(dá)的匹配,將不同的鏈接分發(fā)到不同的控制器上去,也支持調(diào)用匿名函數(shù)

// 第一種,使用匿名函數(shù)
App::router()->get('/', function () {
    echo "Beauty Framework.";
});
// 第二種,使用url分發(fā)到控制器
App::router()->post('/user/info/[0-9]+(/[0-9]+)?', 'App\Controllers\UserController@getUserInfo');

其中實(shí)現(xiàn)的核心代碼:(是不是很簡(jiǎn)單)

if (is_string($lostrcallable) && preg_match('!^([\a-zA-Z0-9]+)\@([a-zA-Z0-9]+)$!', $lostrcallable, $matches)) {
            $class  = $matches[1];
            $method = $matches[2];

            $callable = function () use ($class, $method) {
                static $obj = null;
                if ($obj === null) {

                    $obj = new $class;
                }

                return call_user_func_array(array($obj, $method), func_get_args());
            };
        }

2)控制器

沒有的,你指向的哪里,就可以在哪里進(jìn)行請(qǐng)求處理,但是按照MVC,建議寫到Controller里,大家都是這么認(rèn)為的,就這么做;

3)模型層

這里直接集成了Dao類,用于數(shù)據(jù)庫(kù)查詢操作,因?yàn)楝F(xiàn)在很多都在使用MySQL,就耦合地實(shí)現(xiàn)了MySQL的常規(guī)操作,因?yàn)閿?shù)據(jù)庫(kù)的原生操作會(huì)引起很多的注入等問題,沒有支持直接Qquery的方式來做。

4)DAO層

因?yàn)楹芏嗲闆r下都要進(jìn)行讀寫分離,但是要使用MySQL Proxy來實(shí)現(xiàn),有太過笨重,所以實(shí)現(xiàn)了支持?jǐn)?shù)據(jù)庫(kù)query根據(jù)不同的sql分別使用master和slave數(shù)據(jù)庫(kù)。

怎么做的?

就是根據(jù)不用的查詢操作直接劃分,Select查詢操作直接分到讀庫(kù),Insert、Update、Delete直接分到寫庫(kù)。也可以直接使用onMasterConnection/onSlaveConnection直接指定.

看看Select怎么做的,這部分是實(shí)現(xiàn)邏輯:

    /**
     * 獲取查詢內(nèi)容,以數(shù)組形式返回,數(shù)據(jù)內(nèi)為array。
     *
     * @access public
     * @param integer|array $limit Array to define SQL limit in format Array ($count, $offset)
     *                             or only $count
     *
     * @return mixed Array of Clients
     */
    protected function get($limit = null)
    {
        $this->dbClient->setQueryChannel($this->channel);

        $results = $this->dbClient->arrayBuilder()->get($this->dbTable, $limit, $this->fields);
        $this->_reset();

        if ($this->dbClient->count == 0) {
            return [];
        }

        return $results;
    }

5)配置類

在開發(fā)環(huán)境和生產(chǎn)環(huán)境會(huì)使用不同的配置環(huán)境,在框架中可以創(chuàng)建.env環(huán)境來切換。在config中可以常規(guī)設(shè)置development和production,使用哪個(gè)環(huán)境就在.env設(shè)置哪個(gè)

; This is a environment configuration file
environment=development

當(dāng)然也有一些公共的配置信息,可以在config文件里直接設(shè)置,這樣就可以在哪個(gè)環(huán)境都可以使用。

// 支持使用.連接訪問配置項(xiàng),訪問的是config/app.php中的config key
\Beauty\Core\App::config()->get("app.config");

6)請(qǐng)求響應(yīng)

因?yàn)椴恍枰猇iew,只需要返回json數(shù)據(jù),所以在Header直接寫死了text/json。 = =

其他實(shí)現(xiàn)了

  • memcache和redis采用一致性哈希訪問不同的實(shí)例。

  • validator驗(yàn)證類

具體代碼都在github上 https://github.com/tigerk/Beauty

到此,相信大家對(duì)“php7怎么實(shí)現(xiàn)一個(gè)簡(jiǎn)易框架”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI