目錄
回复内容:
首頁 後端開發 php教程 laravel中的Facades和Ioc Container还有ServiceProvider 思路分析?

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

Jun 17, 2016 am 08:32 AM
laravel

首先在学习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是一样的,也就是一个对象容器,核心就一个:
    <span class="x">protected static $instance;</span>
    
    登入後複製
    建议不要跳出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。
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    在dcat admin中如何實現點擊添加數據的自定義表格功能? 在dcat admin中如何實現點擊添加數據的自定義表格功能? Apr 01, 2025 am 07:09 AM

    在dcatadmin(laravel-admin)中如何實現自定義點擊添加數據的表格功能在使用dcat...

    在Laravel中如何獲取郵件發送失敗時的退信代碼? 在Laravel中如何獲取郵件發送失敗時的退信代碼? Apr 01, 2025 pm 02:45 PM

    Laravel郵件發送失敗時的退信代碼獲取方法在使用Laravel開發應用時,經常會遇到需要發送驗證碼的情況。而在實�...

    Laravel Redis連接共享:為何select方法會影響其他連接? Laravel Redis連接共享:為何select方法會影響其他連接? Apr 01, 2025 am 07:45 AM

    Laravel框架中Redis連接的共享與select方法的影響在使用Laravel框架和Redis時,開發者可能會遇到一個問題:通過配置...

    Laravel多租戶擴展stancl/tenancy:如何自定義租戶數據庫連接的主機地址? Laravel多租戶擴展stancl/tenancy:如何自定義租戶數據庫連接的主機地址? Apr 01, 2025 am 09:09 AM

    在Laravel多租戶擴展包stancl/tenancy中自定義租戶數據庫連接使用Laravel多租戶擴展包stancl/tenancy構建多租戶應用時,...

    Bangla 部分模型檢索中的 Laravel Eloquent ORM) Bangla 部分模型檢索中的 Laravel Eloquent ORM) Apr 08, 2025 pm 02:06 PM

    LaravelEloquent模型檢索:輕鬆獲取數據庫數據EloquentORM提供了簡潔易懂的方式來操作數據庫。本文將詳細介紹各種Eloquent模型檢索技巧,助您高效地從數據庫中獲取數據。 1.獲取所有記錄使用all()方法可以獲取數據庫表中的所有記錄:useApp\Models\Post;$posts=Post::all();這將返回一個集合(Collection)。您可以使用foreach循環或其他集合方法訪問數據:foreach($postsas$post){echo$post->

    在Laravel6項目中如何有效檢查Redis連接的有效性? 在Laravel6項目中如何有效檢查Redis連接的有效性? Apr 01, 2025 pm 02:00 PM

    在Laravel6項目中如何檢查Redis連接的有效性是一個常見的問題,特別是在項目依賴於Redis進行業務處理時。以下是...

    laravel入門實例 laravel入門實例 Apr 18, 2025 pm 12:45 PM

    Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

    Laravel數據庫遷移遇到類重複定義:如何解決遷移文件重複生成及類名衝突? Laravel數據庫遷移遇到類重複定義:如何解決遷移文件重複生成及類名衝突? Apr 01, 2025 pm 12:21 PM

    Laravel數據庫遷移過程中出現類重複定義問題在使用Laravel框架進行數據庫遷移時,開發者可能會遇到“類已使用�...

    See all articles