摘要:但是這樣的弊端就是每一次的操作都要去查詢數(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ù)的 get、set 操作。而通常的做法是把這些操作做成類內(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
摘要:參考一些博主的經(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...
摘要:第三步注冊(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...
摘要:簡(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...
摘要:工廠模式,依賴轉(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ù)必保...
摘要:本文一大半內(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ì)象的描...
閱讀 3780·2021-11-25 09:43
閱讀 2199·2021-11-23 10:13
閱讀 831·2021-11-16 11:44
閱讀 2381·2019-08-29 17:24
閱讀 1391·2019-08-29 17:17
閱讀 3487·2019-08-29 11:30
閱讀 2590·2019-08-26 13:23
閱讀 2352·2019-08-26 12:10