laravel工作流程以及自定義provider創(chuàng)建

laravel 的整個框架中蜡励,任何一個模塊都可以刪除和修改,也可以任意增加自己的模塊阻桅,這也是laravel的靈活和強(qiáng)大之處凉倚。

laravel工作流程以及自定義provider創(chuàng)建

首先 laravel構(gòu)架的文件都在下面這個文件夾中

vendor/laravel/framework/src
具體流程

1.首先進(jìn)入我們熟悉的public下面,這是項(xiàng)目訪問的默認(rèn)目錄嫂沉,打開index.php,加載了一個app文件

$app = require_once __DIR__.'/../bootstrap/app.php';

2.打開這個bootstrap/app.php稽寒,看到里面實(shí)例化了一個叫做Application的類

$app = new Illuminate\Foundation\Application(    realpath(__DIR__.'/../'));

3.打開這個文件,發(fā)現(xiàn)這個application文件繼承了container對象

class Application extends Container

4.所以這個bootstrap下面的app.php其實(shí)是實(shí)例化了Application,而Application又繼承自容器對象趟章。

5.重新回到bootstrap/app.php,發(fā)現(xiàn)他在里面綁定了很多類并返回,
每個綁定里面有兩個類杏糙,第一個是接口慎王,第二個才是真正的類。

  $app->singleton(Illuminate\Contracts\Http\Kernel::class,    App\Http\Kernel::class);
    ......
    return $app;

6.所以我們自己也可以在這里綁定我們自己寫的類,并通過下面兩種方法來調(diào)用宏侍。

//綁定自己的類
$app->singleton('Test',App\Http\Test);
//調(diào)用(全局環(huán)境下)
$u = $this->app->make('Test');
$u = $this->appp['Test'];

這個就叫做工廠模式赖淤,所謂工廠的意思就是,以前你要每次實(shí)例化一個類才能獲得這個類的方法屬性谅河,但是現(xiàn)在你可以通過make(),或app['']咱旱,得到這個類。

7.假如你寫了以下兩個對象绷耍,將Ta對象作為參數(shù)傳入Tb對象的構(gòu)造函數(shù)中吐限,將會自動為你實(shí)例化Ta類為ta,這個叫做依賴注入褂始,經(jīng)持畹洌看到的(REQUEST $request),就是這個道理。但是前提是你的Ta 和Tb類都已經(jīng)綁定注冊過了崎苗。

class Ta
{
  public $jacklin狐粱;
   public function test()    
  {       
 echo 'tb';   
  }
}
 class Tb
{
    private $ta;

    public function __construct(Ta $ta)
    {
        $this->ta = $ta;
    }

    public function test()
    {
       echo "tb";
    }
}

8.剛才說到,我們自定義的對象可以在bootstrap/app.php中綁定注冊益缠,但是這個文件是個入口文件脑奠,多人合作的項(xiàng)目中,合并版本的時候會遇到?jīng)_突幅慌,所以要有一個合適的位置進(jìn)行注冊綁定的步驟宋欺。全局唯一的文件肯定不合適,那么控制器能不能注冊呢胰伍,不行齿诞,比如(Request $request)這個例子來說,肯定是要先已經(jīng)注冊過Request這個類骂租,才能依賴注入祷杈,所以假如寫在控制器有很多情況是無法使用我們注冊的類的。那么重新回到開始的文件渗饮,在public/index.php下但汞,除了剛才的加載app類,還有下面一句

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

這句話按照他的文件去找我是蒙逼了互站,但是大概的意思就是make了一個http的kernel內(nèi)核私蕾,按照龍哥的指示,直接找到http下面的kernel

9.找到app/Http/Kernel之后發(fā)現(xiàn)他除了加載我們熟悉的中間件胡桃,還繼承了一個內(nèi)核文件

use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel{}

找到這個文件踩叭,發(fā)現(xiàn)下面的啟動數(shù)組,環(huán)境,配置容贝,處理異常等等自脯。laravel會遍歷這個數(shù)組,把里面的東西分別啟動斤富。

protected $bootstrappers = [
    'Illuminate\Foundation\Bootstrap\DetectEnvironment',
    'Illuminate\Foundation\Bootstrap\LoadConfiguration',//config/app.php
    'Illuminate\Foundation\Bootstrap\ConfigureLogging',
    'Illuminate\Foundation\Bootstrap\HandleExceptions',
    'Illuminate\Foundation\Bootstrap\RegisterFacades',
    'Illuminate\Foundation\Bootstrap\RegisterProviders',//注冊服務(wù)提供者
    'Illuminate\Foundation\Bootstrap\BootProviders',
];

在加載配置的時候膏潮,程序會加載config里面中的app.php,有一段下面的程序,可以看到满力,他加載了所有的服務(wù)提供者的模塊戏罢。并且 'Illuminate\Foundation\Bootstrap\RegisterProviders',會把a(bǔ)pp.php里面記錄的的服務(wù)提供者都注冊

  'providers' => [

    /*
     * Laravel Framework Service Providers...
     */
    Illuminate\Foundation\Providers\ArtisanServiceProvider::class,
    Illuminate\Auth\AuthServiceProvider::class,
    Illuminate\Broadcasting\BroadcastServiceProvider::class,
    Illuminate\Bus\BusServiceProvider::class,
    Illuminate\Cache\CacheServiceProvider::class,
    Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
    Illuminate\Routing\ControllerServiceProvider::class,
    Illuminate\Cookie\CookieServiceProvider::class,
    Illuminate\Database\DatabaseServiceProvider::class,
    Illuminate\Encryption\EncryptionServiceProvider::class,
    Illuminate\Filesystem\FilesystemServiceProvider::class,
    Illuminate\Foundation\Providers\FoundationServiceProvider::class,
    Illuminate\Hashing\HashServiceProvider::class,
    Illuminate\Mail\MailServiceProvider::class,
    Illuminate\Pagination\PaginationServiceProvider::class,
    Illuminate\Pipeline\PipelineServiceProvider::class,
    Illuminate\Queue\QueueServiceProvider::class,
    Illuminate\Redis\RedisServiceProvider::class,
    Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
    Illuminate\Session\SessionServiceProvider::class,
    Illuminate\Translation\TranslationServiceProvider::class,
    Illuminate\Validation\ValidationServiceProvider::class,
    Illuminate\View\ViewServiceProvider::class,

    /*
     * Application Service Providers...
     */
    App\Providers\AppServiceProvider::class,
    App\Providers\AuthServiceProvider::class,
    App\Providers\EventServiceProvider::class,
    App\Providers\RouteServiceProvider::class,
], 

9.那么我們要注冊的方法到底在哪里呢,找到App/Providers,隨便打開里面的文件脚囊。發(fā)現(xiàn)下面代碼

use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider

打開這個文件

public function __construct($app){$this->app = $app;}

發(fā)現(xiàn)這個類注入了app對象,所以在Provider的范圍內(nèi)也可以寫

$this->app

重新回到剛才打開的AppServiceProvider桐磁,里面有一個注冊方法

public function register()

這里就是我們要注冊自己寫的類的地方了悔耘,把我們綁定的語句寫進(jìn)來,注意是$this->app

public function register()
{
    $this->app->singleton(\App\Ta::class,\App\Ta::class);
    $this->app->singleton(\App\Tb::class,\App\Tb::class);
}

這里要注意命名空間的問題我擂,App前面要加上\從根命名空間查找

這樣衬以,laravel加載內(nèi)核文件的時候,就會將我們寫好的服務(wù)提供者文件加載進(jìn)去校摩。

剛才是在AppServiceProvider中注冊了我們的模塊看峻,那怎么創(chuàng)建自己的Provider呢,首先在同樣的目錄下創(chuàng)建文件JacklinServiceProvider.php衙吩,基礎(chǔ)內(nèi)容可以從別的Provider文件復(fù)制互妓,然后同樣在注冊方法中寫入自己的類,最后坤塞,還要在剛才的config\app.php中的冯勉,providers[]里面加入我們新的服務(wù)提供者類,OK了摹芙。

10.上面已經(jīng)能夠把我們自己寫的模塊加進(jìn)去了灼狰,那還有一個問題,我們這樣每次調(diào)用自己的模塊都要通過工廠模式make出來浮禾,還是很麻煩交胚,但是系統(tǒng)的方法似乎很簡單,比如DB::盈电,Input::,就 可以直接調(diào)用方法蝴簇,這是為什么呢?laravel又提供了另外一個東西挣轨,叫做facades军熏,這個單詞的本意是門面的意思,下面開始解釋這個東西卷扮。

首先隨意創(chuàng)建一個Test.php,我們先創(chuàng)建在App\Http荡澎,寫入以下內(nèi)容

    <?php

namespace App\Http\Facades;

class Ta extends \Illuminate\Support\Facades\Facade
{
    protected static function getFacadeAccessor()
    {
        return '\App\Ta';
    }
}

從內(nèi)容上不難看到均践,這是\Illuminate\Support\Facades\Facade,的一個方法摩幔,大概的意思就是把Ta這個對象實(shí)例化出來彤委,并且嵌套在自己的一個靜態(tài)方法里面,給這個class起個跟Ta一樣的名字或衡,那么當(dāng)你Ta的時候焦影,這個類也就加載了\App\Ta,所以就造成了Ta::也能用Ta里面的方法封断。

//調(diào)用
App\Http\Facades\Ta::test();

這么調(diào)用好像也很麻煩斯辰,怎么樣能像DB::那樣直接用呢,還有一步坡疼,配置aliases彬呻,本意別名

還是剛才的config/app.php中,在aliases中加入

'Jacklin'   => App\Http\Facades\Ta::class,

這樣又把Ta類的方法轉(zhuǎn)移到了Jacklin身上柄瑰,試試闸氮,下面方法可以執(zhí)行,一套自己的‘靜態(tài)’provider就弄好了教沾,而且還把訪問的方式美化了蒲跨,這也就是laravel用facader這個詞命名這個方法的意思吧

Jacklin::test();    

11.最后剛才創(chuàng)建的這個JacklinServiceProvider.php是隨便放了個文件夾授翻,顯然不合適或悲,那么在app/Http 下面創(chuàng)建一個Facades文件夾,然后把JacklinServiceProvider.php放進(jìn)去藏姐,并修改命名空間即可隆箩。

12.另外,我們的Ta Tb也是直接創(chuàng)建在了app里羔杨,同樣的道理捌臊,在app/Http下建立Module文件夾,把我們的模塊放進(jìn)去兜材。

總結(jié)

為了便于記憶理澎,整理一下完成一個provider的思路。
1.建立Modules文件夾和Facades
2.在Modules建立模塊文件Test.php
3.在Provider中建立TestServiceProvider.php曙寡,復(fù)制AppServiceProvider.php,里的基礎(chǔ)內(nèi)容糠爬,在register()方法中注冊前面寫的Test模塊

  $this->app->singleton(\App\Http\Modules\Test::class,\App\Http\Modules\Test::class);

4.在config/app.php的providers[]中加入

App\Providers\TestServiceProvider::class,

5.在app/Http/Facades中建立Jacklin.php,模仿靜態(tài)方法

<?php

namespace App\Http\Facades;

class Test extends \Illuminate\Support\Facades\Facade
{
    protected static function getFacadeAccessor()
    {
        return '\App\Http\Modules\Test';
    }
}

6.在config/app.php的aliases[]中加入

'Test' => App\Http\Facades\Test::class,

7.OK了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市举庶,隨后出現(xiàn)的幾起案子执隧,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件镀琉,死亡現(xiàn)場離奇詭異峦嗤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)屋摔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門烁设,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钓试,你說我怎么就攤上這事装黑。” “怎么了弓熏?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵恋谭,是天一觀的道長。 經(jīng)常有香客問我挽鞠,道長箕别,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任滞谢,我火速辦了婚禮,結(jié)果婚禮上除抛,老公的妹妹穿的比我還像新娘狮杨。我一直安慰自己,他們只是感情好到忽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布橄教。 她就那樣靜靜地躺著,像睡著了一般喘漏。 火紅的嫁衣襯著肌膚如雪护蝶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天翩迈,我揣著相機(jī)與錄音持灰,去河邊找鬼。 笑死负饲,一個胖子當(dāng)著我的面吹牛堤魁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播返十,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼妥泉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洞坑?” 一聲冷哼從身側(cè)響起盲链,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后刽沾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體本慕,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年悠轩,在試婚紗的時候發(fā)現(xiàn)自己被綠了间狂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡火架,死狀恐怖鉴象,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情何鸡,我是刑警寧澤纺弊,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站骡男,受9級特大地震影響淆游,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜隔盛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一犹菱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吮炕,春花似錦腊脱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鳄炉,卻和暖如春杜耙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拂盯。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工佑女, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谈竿。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓珊豹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親榕订。 傳聞我的和親對象是個殘疾皇子店茶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

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