laravel中的Facades和Ioc Container還有ServiceProvider 思路分析?

來源:互聯網
上載者:User
首先在學習laravel中看container中的container這個類的時候有點懵,這個是一個ioc Container我知道但是 這個laravel中的我不是太能看明白不知道是否能有分析過的人幫忙分析一下能有個清晰的思路 還有就是ServiceProvider這個類 也比較難以理解 好像很多都是圍繞這兩個類玩的,有時間的 可以一起都幫忙分析下 主要想知道他的運用原理 知其然知其所以然嗎! 先行感謝了
已有的資料
  • zhaoyi 感謝您的文章

  • PHP程式員如何理解IoC/DI
    PHP程式員如何理解依賴注入容器(dependency injection container)

    回複內容:

    你的迷糊就是被一些文章裡大量的術語搞的,所謂ioc 容器的說法我覺得用服務容器的更合適,ioc只是一種思想,實現ioc可以是依賴注入,也可以服務定位器,策略模式,思想和實現之間我覺得不能混為一談。laravel中的容器是把被依賴的類當作服務,每當需要傳入被依賴的類時,比如你想使用緩衝類,換句話說你現在依賴一個快取服務時,由一個叫做容器的類負責具體的執行個體化,其工作就是解析類,解析出你的快取服務是memcache還是redis,還是別的什麼,然後執行個體化,注入到你的消費類中,如此就實現了ioc。當然這需要抽象的配合,否則你注入個別的,方法不一樣當然無法工作了。

    容器只是一種管理類的方式。

    那麼問題來了,容器怎麼知道要建立哪個類的執行個體?也就是類是如何被解析的?這個就可以在service provider裡綁定,你把需要用的實現在這裡綁定,當容器需要時就知道解析到哪個類了。

    那麼問題又來了,程式如何知道都有哪些service provider? 這又在config/app裡面定義的,專業點說註冊服務。

    我建議你自己親自動手建立一個service provider 綁定一個服務,註冊,又或者你玩玩別的獨立的服務容器,比如pimple,把他用在你自己的項目中,就很好理解了。

    至於facade,更好理解,實際是通過容器解析到實際的類,然後通過魔術方法去實際的類上執行方法。我也是醉了。
    這也是很多人批評facade的原因,這東西多封裝了一層文法糖而已。Facades 是面板模式,類似代理,在 Laravel 裡的作用其實就跟 PHP: class_alias 的作用類似,只是把架構裡帶命名空間的類變得更好記,比如:App => Illuminate\Support\Facades\App 。 另外一個好處是:Laravel 裡的外觀是可以很方便的自訂的,直接修改 config/app.php 裡的 aliases 部分即可,比如,你覺得系統提供的 Cache 不好用,你想用自己的,直接改成你想要的類名就好了。當然外觀還有一些其它的好處,也有它的弊端,比如無法直接存取真正目標對象的類常量。

    Ioc Container IOC容器,上面的兩篇文章講其它已經得很清楚了。我用比較通俗的文字來講一下:這個容器就相當於我們的工具想,我們到哪兒都帶著它,用的時候從裡面取出想要的工具即可。

    那麼 ServiceProvider 是什麼呢?它就是完成了 “在出門前把工具放到工具箱” 的過程,ServiceProvider 只是把一個東西(通常是實現某個功能的服務,比如緩衝,也可以放一些配置進去)在容器裡註冊,架構運行時會調用每一個 ServiceProvider 的 register 方法完成註冊該服務並啟動。
    然後你就可以在控制器或者其它架構啟動後的地方從容器裡取出該服務執行個體來使用。

    簡單點描述就是這樣,不過你可以從源碼 framework/Application.php at 5.0 · laravel/framework · GitHub 類開始一點點的看運行流程。

    不知道是不是你想要的。最近看了一陣子larave,感覺:
    1、IoC跟Phalcon的DI是一樣的,也就是一個對象容器,核心就一個:
    protected static $instance;
    建議不要跳出laravel的範疇去理解這些概念,其實本來是十分簡單的:
    Service Provider:Laravel 5.1 文檔攻略 ——Service Providers
    Service Container: http://laravelbase.com/collections/1/47
    Facades: http://laravelbase.com/collections/1/49 一切都怪這些該死的名詞,大家用的不一樣。

    說白了服務容器就是介面,然後服務提供者就是提供服務的實作類別。

    例如介面Storage class ,實作類別Ftp class或Local class。
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.