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

資訊專欄INFORMATION COLUMN

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

qingshanli1988 / 2082人閱讀

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

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

這篇文章應該算是心得體會一類的吧,因為并沒有什么卵用(笑

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

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

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

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

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

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

好吧好吧,再強行 +1s 是要出事的,我們回到正題。沒錯,我們正是要把 options 放到 Laravel 的服務容器里去。

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

下面我們來定義 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();
    }

}

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

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

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

新建一個 Option 類并集成 Laravel 的 Facade 基類:


然后我們在 config/app.php 中加入我們 Facade 的別名:

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

];

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

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

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

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

相關文章

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

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

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

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

    reclay 評論0 收藏0
  • PHPer面試指南-Laravel

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

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

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

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

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

    HollisChuang 評論0 收藏0

發(fā)表評論

0條評論

qingshanli1988

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<