摘要:但是這樣的弊端就是每一次的操作都要去查詢數(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
摘要:參考一些博主的經(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...
摘要:第三步注冊工廠啟動數(shù)據(jù)庫服務數(shù)據(jù)庫服務的啟動主要設置的連接分析器,讓能夠用服務連接數(shù)據(jù)庫。 在我們學習和使用一個開發(fā)框架時,無論使用什么框架,如何連接數(shù)據(jù)庫、對數(shù)據(jù)庫進行增刪改查都是學習的重點,在Laravel中我們可以通過兩種方式與數(shù)據(jù)庫進行交互: DB, DB是與PHP底層的PDO直接進行交互的,通過查詢構建器提供了一個方便的接口來創(chuàng)建及運行數(shù)據(jù)庫查詢語句。 Eloquent...
摘要:簡述的生命周期采用了單一入口模式,應用的所有請求入口都是文件。分發(fā)請求一旦應用完成引導和所有服務提供者都注冊完成,將會移交給路由進行分發(fā)。此外,由于對動態(tài)方法的獨特用法,也使測試起來非常容易。 本書的 GitHub 地址:https://github.com/todayqq/PH... Laravel 作為現(xiàn)在最流行的 PHP 框架,其中的知識較多,所以單獨拿出來寫一篇。 簡述 La...
摘要:工廠模式,依賴轉(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)載務必保...
摘要:本文一大半內(nèi)容都是通過舉例來讓讀者去理解什么是控制反轉(zhuǎn)和依賴注入,通過理解這些概念,來更加深入。這種由外部負責其依賴需求的行為,我們可以稱其為控制反轉(zhuǎn)。工廠模式,依賴轉(zhuǎn)移當然,實現(xiàn)控制反轉(zhuǎn)的方法有幾種。 容器,字面上理解就是裝東西的東西。常見的變量、對象屬性等都可以算是容器。一個容器能夠裝什么,全部取決于你對該容器的定義。當然,有這樣一種容器,它存放的不是文本、數(shù)值,而是對象、對象的描...
閱讀 3759·2021-11-25 09:43
閱讀 2191·2021-11-23 10:13
閱讀 823·2021-11-16 11:44
閱讀 2369·2019-08-29 17:24
閱讀 1384·2019-08-29 17:17
閱讀 3480·2019-08-29 11:30
閱讀 2584·2019-08-26 13:23
閱讀 2345·2019-08-26 12:10