国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

使用 Laravel 的服務(wù)容器來(lái)優(yōu)化讀寫數(shù)據(jù)庫(kù)中的 options

qingshanli1988 / 2094人閱讀

摘要:但是這樣的弊端就是每一次的操作都要去查詢數(shù)據(jù)庫(kù),這對(duì)于性能還是有挺大影響的,尤其是在一次響應(yīng)中要使用很多的情況下。沒錯(cuò),我們正是要把放到的服務(wù)容器里去。

原文地址:https://prinzeugen.net/optimi...

這篇文章應(yīng)該算是心得體會(huì)一類的吧,因?yàn)椴]有什么卵用(笑

就像前兩篇文章說(shuō)的一樣,在我把項(xiàng)目框架改為 Laravel 后,自然要最大限度地利用 Laravel 的特性來(lái)提升我們應(yīng)用的性能(雖然使用 Laravel 本身就是在降低性能了),并且讓我們的代碼看起來(lái)更優(yōu)雅 裝逼

其中我們可以最方便地利用的一個(gè)特性就是 Laravel 的服務(wù)容器了。在這里我不多贅述 Service Container 是個(gè)啥,想了解的可以自行搜索。不想了解的就只要大致知道它是個(gè)可以 綁定/取出 實(shí)例的東西就好了(當(dāng)然服務(wù)容器可不止這么點(diǎn)功能)。

相信很多 Web 應(yīng)用都會(huì)在數(shù)據(jù)庫(kù)建立一個(gè) options 表來(lái)儲(chǔ)存一些用戶的配置信息,而為了方便,我們通常會(huì)封裝一個(gè) Option 類來(lái)方便地進(jìn)行數(shù)據(jù)的 getset 操作。而通常的做法是把這些操作做成類內(nèi)靜態(tài)方法來(lái)調(diào)用。

但是這樣的弊端就是每一次的操作都要去查詢數(shù)據(jù)庫(kù),這對(duì)于性能還是有挺大影響的,尤其是在一次響應(yīng)中要使用很多 options 的情況下。

那么在 Laravel 下我們可以怎么優(yōu)化呢?

蛤?你說(shuō) Eloquent?你 TM 長(zhǎng)點(diǎn)腦子啊 用了 ORM 那 tm 還叫優(yōu)化?你們呀,不要聽的風(fēng)是得雨,看到 Laravel 就想到 Eloquent!

好吧好吧,再?gòu)?qiáng)行 +1s 是要出事的,我們回到正題。沒錯(cuò),我們正是要把 options 放到 Laravel 的服務(wù)容器里去。

這樣的話我們只需要在應(yīng)用啟動(dòng)的時(shí)候?qū)嵗粋€(gè) OptionRepository 類,在構(gòu)造函數(shù)里讀入所有的 options 并放到類內(nèi)屬性上,get 方法直接從該屬性里取值,而調(diào)用 set 操作的時(shí)候則對(duì)該屬性進(jìn)行修改,同時(shí) push 修改過(guò)的 key 到一個(gè) $items_modified 數(shù)組里去,在對(duì)象析構(gòu)的時(shí)候再真正執(zhí)行數(shù)據(jù)庫(kù)操作,寫入所有修改過(guò)的 options

下面我們來(lái)定義 OptionRepository 類:

get();

        foreach ($options as $option) {
            $this->items[$option->option_name] = $option->option_value;
        }

    }

    /**
     * Determine if the given option value exists.
     *
     * @param  string  $key
     * @return bool
     */
    public function has($key)
    {
        return Arr::has($this->items, $key);
    }

    /**
     * Get the specified option value.
     *
     * @param  string  $key
     * @param  mixed   $default
     * @return mixed
     */
    public function get($key, $default = null)
    {
        return Arr::get($this->items, $key, $default);
    }

    /**
     * Set a given option value.
     *
     * @param  array|string  $key
     * @param  mixed   $value
     * @return void
     */
    public function set($key, $value = null)
    {
        if (is_array($key)) {
            foreach ($key as $innerKey => $innerValue) {
                Arr::set($this->items, $innerKey, $innerValue);
                $this->items_modified[] = $innerKey;
            }
        } else {
            Arr::set($this->items, $key, $value);
            $this->items_modified[] = $key;
        }
    }

    protected function save()
    {
        $this->items_modified = array_unique($this->items_modified);

        foreach ($this->items_modified as $key) {
            if (!DB::table("options")->where("option_name", $key)->first()) {
                DB::table("options")
                    ->insert(["option_name" => $key, "option_value" => $this[$key]]);
            } else {
                DB::table("options")
                        ->where("option_name", $key)
                        ->update(["option_value" => $this[$key]]);
            }
        }
    }

    /**
     * Prepend a value onto an array option value.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return void
     */
    public function prepend($key, $value)
    {
        $array = $this->get($key);

        array_unshift($array, $value);

        $this->set($key, $array);
    }

    /**
     * Push a value onto an array option value.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return void
     */
    public function push($key, $value)
    {
        $array = $this->get($key);

        $array[] = $value;

        $this->set($key, $array);
    }

    /**
     * Get all of the option items for the application.
     *
     * @return array
     */
    public function all()
    {
        return $this->items;
    }

    /**
     * Determine if the given option option exists.
     *
     * @param  string  $key
     * @return bool
     */
    public function offsetExists($key)
    {
        return $this->has($key);
    }

    /**
     * Get a option option.
     *
     * @param  string  $key
     * @return mixed
     */
    public function offsetGet($key)
    {
        return $this->get($key);
    }

    /**
     * Set a option option.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return void
     */
    public function offsetSet($key, $value)
    {
        $this->set($key, $value);
    }

    /**
     * Unset a option option.
     *
     * @param  string  $key
     * @return void
     */
    public function offsetUnset($key)
    {
        $this->set($key, null);
    }

    /**
     * Save all modified options into database
     */
    public function __destruct()
    {
        $this->save();
    }

}

可以看到我們順便實(shí)現(xiàn)了 ArrayAccess 接口,所以我們?cè)谀玫?OptionRepository 的實(shí)例后就可以使用類似于 $option["fuck"] 的形式來(lái)獲取數(shù)據(jù)了(其實(shí)我后來(lái)一次也沒用到)。

不過(guò)光是實(shí)現(xiàn)了一個(gè) Repository 還是不夠的,我們還需要把它綁定到服務(wù)容器里,同時(shí)注冊(cè)個(gè) Facade 給它,讓我們能夠更優(yōu)雅地調(diào)用倉(cāng)庫(kù)類的相關(guān)方法:

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        // 綁定單例到服務(wù)容器上
        $this->app->singleton("option", AppServicesOptionRepository::class);
    }
}

新建一個(gè) Option 類并集成 Laravel 的 Facade 基類:


然后我們?cè)?config/app.php 中加入我們 Facade 的別名:

 [
        "Option"    => AppServicesFacadesOption::class
    ],

];

大功告成!我們現(xiàn)在又可以像以前那樣方便地使用類似于 Option::get("shit") 的方法獲取數(shù)據(jù),而且又大幅減少了數(shù)據(jù)庫(kù)操作,是不是很棒呢~ (=?ω?)=

好吧其實(shí)本文也沒講啥有用的東西,不過(guò)希望對(duì)從其他框架遷移到 Laravel 的開發(fā)者們有所啟示~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/30444.html

相關(guān)文章

  • PHP日常開發(fā)小結(jié)

    摘要:參考一些博主的經(jīng)驗(yàn)和自己的開發(fā)經(jīng)驗(yàn)進(jìn)行總結(jié)持續(xù)更新。優(yōu)先使用和集合來(lái)操作和處理數(shù)據(jù)。 參考一些博主的經(jīng)驗(yàn)和自己的開發(fā)經(jīng)驗(yàn)進(jìn)行總結(jié)-持續(xù)更新ing。 功能設(shè)計(jì) 功能盡量模塊化; 類的設(shè)計(jì)盡量單一,函數(shù)功能單一; 需要uml圖(類圖、時(shí)序圖、組件圖)、文檔沉淀; 編寫風(fēng)格 遵循PSR-1 基礎(chǔ)編碼規(guī)范https://laravel-china.org 遵循PSR-2 編碼風(fēng)格規(guī)范h...

    xfee 評(píng)論0 收藏0
  • Laravel核心解讀--Database(一)基礎(chǔ)介紹

    摘要:第三步注冊(cè)工廠啟動(dòng)數(shù)據(jù)庫(kù)服務(wù)數(shù)據(jù)庫(kù)服務(wù)的啟動(dòng)主要設(shè)置的連接分析器,讓能夠用服務(wù)連接數(shù)據(jù)庫(kù)。 在我們學(xué)習(xí)和使用一個(gè)開發(fā)框架時(shí),無(wú)論使用什么框架,如何連接數(shù)據(jù)庫(kù)、對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查都是學(xué)習(xí)的重點(diǎn),在Laravel中我們可以通過(guò)兩種方式與數(shù)據(jù)庫(kù)進(jìn)行交互: DB, DB是與PHP底層的PDO直接進(jìn)行交互的,通過(guò)查詢構(gòu)建器提供了一個(gè)方便的接口來(lái)創(chuàng)建及運(yùn)行數(shù)據(jù)庫(kù)查詢語(yǔ)句。 Eloquent...

    reclay 評(píng)論0 收藏0
  • PHPer面試指南-Laravel

    摘要:簡(jiǎn)述的生命周期采用了單一入口模式,應(yīng)用的所有請(qǐng)求入口都是文件。分發(fā)請(qǐng)求一旦應(yīng)用完成引導(dǎo)和所有服務(wù)提供者都注冊(cè)完成,將會(huì)移交給路由進(jìn)行分發(fā)。此外,由于對(duì)動(dòng)態(tài)方法的獨(dú)特用法,也使測(cè)試起來(lái)非常容易。 本書的 GitHub 地址:https://github.com/todayqq/PH... Laravel 作為現(xiàn)在最流行的 PHP 框架,其中的知識(shí)較多,所以單獨(dú)拿出來(lái)寫一篇。 簡(jiǎn)述 La...

    alaege 評(píng)論0 收藏0
  • php實(shí)現(xiàn)依賴注入(DI)和控制反轉(zhuǎn)(IOC)

    摘要:工廠模式,依賴轉(zhuǎn)移當(dāng)然,實(shí)現(xiàn)控制反轉(zhuǎn)的方法有幾種。其實(shí)我們稍微改造一下這個(gè)類,你就明白,工廠類的真正意義和價(jià)值了。雖然如此,工廠模式依舊十分優(yōu)秀,并且適用于絕大多數(shù)情況。 此篇文章轉(zhuǎn)載自laravel-china,chongyi的文章https://laravel-china.org/top...原文地址: http://www.insp.top/learn-lar... ,轉(zhuǎn)載務(wù)必保...

    tomato 評(píng)論0 收藏0
  • 深入理解控制反轉(zhuǎn)(IoC)和依賴注入(DI)

    摘要:本文一大半內(nèi)容都是通過(guò)舉例來(lái)讓讀者去理解什么是控制反轉(zhuǎn)和依賴注入,通過(guò)理解這些概念,來(lái)更加深入。這種由外部負(fù)責(zé)其依賴需求的行為,我們可以稱其為控制反轉(zhuǎn)。工廠模式,依賴轉(zhuǎn)移當(dāng)然,實(shí)現(xiàn)控制反轉(zhuǎn)的方法有幾種。 容器,字面上理解就是裝東西的東西。常見的變量、對(duì)象屬性等都可以算是容器。一個(gè)容器能夠裝什么,全部取決于你對(duì)該容器的定義。當(dāng)然,有這樣一種容器,它存放的不是文本、數(shù)值,而是對(duì)象、對(duì)象的描...

    HollisChuang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<