关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » UI前端 »Laravel 控制反转和门面模式概念详解

    Laravel 控制反转和门面模式概念详解

    2015-03-03 00:00:00 出处:ITJS
    分享

    这两个概念对于 Laravel 的使用者来说应该并不陌生,尤其是当你希望扩展或者替换 Laravel 核心库的时候,理解和合理使用它们可以极大提升 Laravel 的战斗力。这里以创建一个自己的 ServiceProvider 为例理解 Inversion of Control 和 Facade 在 Laravel 中的应用。

    控制反转(Inversion of Control)

    什么是 IoC

    控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。 — 维基百科

    简单说来,就是一个类把自己的的控制权交给另外一个对象,类间的依赖由这个对象去解决。依赖注入属于依赖的显示申明,而依赖查找则是通过查找来解决依赖。

    Laravel 中的使用

    注入一个类:

    App::bind('foo', function($app)
    {
        return new FooBar;
    });

    这个例子的意思是创建一个别名为 foo 的类,使用时实际实例化的是 FooBar。

    使用这个类的方法是:

    $value = App::make('foo');

    $value 实际上是 FooBar 对象。

    假如希望使用单例模式来实例化类,那么使用:

    App::singleton('foo', function()
    {
        return new FooBar;
    });

    这样的话每次实例化后的都是同一个对象。

    注入类的更多例子可以看 Laravel 官网

    你可能会疑问上面的代码应该写在哪儿呢?答案是你希望他们在哪儿运行就写在哪儿。0 —— 0 知道写哪儿还用来看这种基础文章么!

    服务提供器 (Service Providers)

    为了让依赖注入的代码不至于写乱,Laravel 搞了一个 服务提供器(Service Provider)的东西,它将这些依赖聚集在了一块,统一申明和管理,让依赖变得更加容易维护。

    Laravel 中的使用

    定义一个服务提供器:

    use IlluminateSupportServiceProvider;
    
    class FooServiceProvider extends ServiceProvider {
    
        public function register()
        {
            $this->app->bind('foo', function()
            {
                return new Foo;
            });
        }
    
    }

    这个代码也不难理解,就是申明一个服务提供器,这个服务提供器有一个 register的方法。这个方法实现了我们上面讲到的依赖注入。

    当我们执行下面代码:

    App::register('FooServiceProvider');

    我们就完成一个注入了。但是这个还是得手动写,所以怎么让 Laravel 自己来做这事儿呢?

    我们只要在 app/config/app.php 中的 providers 数组里面增加一行:

    'providers' => [
        …
           ‘FooServiceProvider’,
    ],

    这样我们就可以使用 App::make(‘foo’) 来实例化一个类了。

    你不禁要问了,这么写也太难看了吧?莫慌,有办法。

    门面模式(Facade)

    为了让 Laravel 中的核心类使用起来更加方便,Laravel实现了门面模式。

    外觀模式(Facade pattern),是軟件工程中常用的一種軟件設計模式,它為子系統中的一組接口提供一個統一的高層接口,使得子系統更容易使用。 — 维基百科

    Laravel 中的使用

    我们使用的大部分核心类都是基于门面模式实现的。例如:

    $value = Cache::get('key');

    这些静态调用实际上调用的并不是静态方法,而是通过 PHP 的魔术方法__callStatic() 讲请求转到了相应的方法上。

    那么如何讲我们前面写的服务提供器也这样使用呢?方法很简单,只要这么写:

    use IlluminateSupportFacadesFacade;
    
    class Foo extends Facade {
    
        protected static function getFacadeAccessor() { return ‘foo’; }
    
    }

    这样我们就可以通过 Foo::test() 来调用我们之前真正的 FooBar 类的方法了。

    别名(Alias)

    有时候我们可能将 Facade 放在我们扩展库中,它有比较深的命名空间,如:LibraryMyClassFoo。这样导致使用起来并不方便。Laravel 可以用别名来替换掉这么长的名字。

    我们只要在 app/config/app.php 中 aliases 下增加一行即可:

    'aliases' => [
        …
        'Foo' => ‘LibraryMyClassFoo’,
    ],

    这样它的使用就由 LibraryMyClassFoo::test() 变成 Foo::test() 了。

    总结

    所以有了控制反转(Inversion of Control)和门面模式(Facade),实际还有服务提供器(Service Providers)和别名(Alias),我们创建自己的类库和扩展 Laravel 都会方便很多。

    这里总结一下创建自己类库的方法:

    在 app/library/MyFoo 下创建类 MyFoo.php 在 app/library/MyFoo/providers 下创建 MyFooServiceProvider.php 在 app/library/MyFoo/facades 下创建 MyFooFacade.php 在 app/config/app.php 中添加 providers 和 aliases
    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    商业智能成CIO优先关注点 技术落地方显成效(1)

    用linux安装MySQL时产生问题破解

    JAVA中关于Map的九大问题

    windows 7旗舰版无法使用远程登录如何开启telnet服务

    Android View 事件分发机制详解

    MySQL用户变量的用法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。