Interface 在 Laravel 開發(fā)中的使用

代碼到接口鹃两,而不是實現(xiàn);程序到接口舀凛,使用抽象俊扳,而不是具體。

這些都是同一件事猛遍,在開發(fā)中馋记,我們的應(yīng)用程序應(yīng)該依賴抽象,而不是具體的類懊烤。

why?

剛開始聽梯醒,感覺不是多次一舉嗎?為什么不直接寫控制器腌紧,寫方法冤馏,寫邏輯就行了。

實際上寄啼,從架構(gòu)師的角度看,沒有什么不是變化的代箭,就是隨著時間的推移墩划,業(yè)務(wù)的變化,需求都是變化的嗡综,為了適應(yīng)變化乙帮,就不能依賴具體。

代碼到接口极景,使我們代碼松散耦合且靈活察净。

請舉例:


class Logger {

public function log($content) {

//輸出 Log 日志到文件。

echo "Log to file";

}

}

一個簡單Logger類盼樟,我們在控制器控制他

class LogController extends Controller {

public function log() {

$logger = new Logger();

$logger->log('Log this');

}

}

(簡書對代碼排版氢卡,真是支持的很不友好啊3拷伞R肭亍!)

他要記錄其他位置呢击碗?如數(shù)據(jù)庫筑悴,文件,云或其他稍途?

需要再Log類中加幾個方法

然后再控制器中寫對應(yīng)方法改進


好了阁吝,我們現(xiàn)在可以通過配置文件把日志輸出到各種終端。

但我們?nèi)绻€要再輸出日志到 redis 呢械拍?我們還需要再增加一個方法突勇,并且在控制器中再加一次判斷装盯。

控制器代碼很快就變得臃腫,如果還要輸出日志到更多地方呢与境?Logger 類中每個方法如果還需要擴展呢验夯?這對于后期維護來說并不好。

這樣做同時也不符合 SOLID 原則摔刁,我們先來拆分一下 Logger 類挥转,將職責拆分成不同的類。



再來修改LogController


看上去拆分了log,那繼續(xù)添加日志到redis,那就繼續(xù)加case吧共屈。

但依然有一個問題就是我們的控制器「知道太多了」绑谣,它應(yīng)該只去調(diào)用一個?log()?方法來記錄,而不應(yīng)該知道使用哪個 Logger 類拗引,也不應(yīng)該去實例化任何類借宵,這樣在將來有改動的時候,不論是要輸出到哪里矾削,我們都不需要再來修改?LogController?的代碼壤玫,那應(yīng)該怎么做呢?

這時候就是 interface出廠哼凯,聽下回分解欲间。

接口定義是可以執(zhí)行操作的描述

interface LogInterface{

? ? public function log($content);

}

我們一般把接口文件放在 項目目錄 App\Contracts文件里。

接口只聲明断部,不實現(xiàn)猎贴,這是他 抽象的原因。

我們實現(xiàn)接口時蝴光,必須提供實現(xiàn)接口的類的聲明方法

class? LogController? extends controller{

? ? public function Log(LogInterface $logger){

? ? ? ? $logger->log('log to');

}

}

namespace App\Logs;

use App\Contracts\LogInterface;

class DBLogger implents?LogInterface{

? ? ? ? public function log($content){

????????//輸出日志到DB

????????}

}

namespace App\Logs;

use App\Contracts\LogInterface;

class FileLogger implents LogInterface{

public function log($content){

//輸出日志到file

}

}

然后是依賴注入

在使用Laravel框架時她渴,我們可以利用它服務(wù)容器來實現(xiàn)自動注入接口實現(xiàn)

新建 config/log.php?

<?php

return [

? ? 'default' => env('Log_TARGET','file');

????'file' => [

? ? ? ? ? ? 'class' => App\Logs\FileLogger,

],

'db' => [

? ? ? ? 'class'=>App\Logs\DBLogger

]

];

并在 app\Providers\AppServiceProvider.php 添加下代碼

public function register(){

? ? ? ? $default = config('log.default');

? ? ? ? $logger = config("log.{$default}.class");

? ? ? ? $this->app->bind(

? ? ? ? ? ? \App\Contracts\LogInterface::class,

????????????$logger

????????);

}

我們從配置文件中選用日志類型,然后再config配置中綁定蔑祟,注冊服務(wù)趁耗,當我們請求接口時,容器就會解析返回實例

總結(jié):

接口允許我們創(chuàng)建松散耦合的代碼疆虚,同時提供一定程度的抽象对粪,這樣在快速切換時候,就不用現(xiàn)寫代碼装蓬。

對于大型應(yīng)用會隨著變化業(yè)務(wù)變化著拭,建議用這種,一勞永逸牍帚,不要嫌棄當時寫的代碼多儡遮,至于小型應(yīng)用,那看你心情暗赶。





真著急看鄙币,看?interface 在Laravel開發(fā)中應(yīng)用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肃叶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子十嘿,更是在濱河造成了極大的恐慌因惭,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绩衷,死亡現(xiàn)場離奇詭異蹦魔,居然都是意外死亡,警方通過查閱死者的電腦和手機咳燕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門勿决,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人招盲,你說我怎么就攤上這事低缩。” “怎么了曹货?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵咆繁,是天一觀的道長。 經(jīng)常有香客問我顶籽,道長么介,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任蜕衡,我火速辦了婚禮,結(jié)果婚禮上设拟,老公的妹妹穿的比我還像新娘慨仿。我一直安慰自己,他們只是感情好纳胧,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布镰吆。 她就那樣靜靜地躺著,像睡著了一般跑慕。 火紅的嫁衣襯著肌膚如雪万皿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天核行,我揣著相機與錄音牢硅,去河邊找鬼。 笑死芝雪,一個胖子當著我的面吹牛减余,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惩系,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼位岔,長吁一口氣:“原來是場噩夢啊……” “哼如筛!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抒抬,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤杨刨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后擦剑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妖胀,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年抓于,在試婚紗的時候發(fā)現(xiàn)自己被綠了做粤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡捉撮,死狀恐怖怕品,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巾遭,我是刑警寧澤肉康,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站灼舍,受9級特大地震影響吼和,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骑素,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一炫乓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧献丑,春花似錦末捣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妥畏,卻和暖如春邦邦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背醉蚁。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工燃辖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人网棍。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓郭赐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捌锭,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容