Laravel框架最重要的Facades

您所在的位置:网站首页 laravel的运行原理 Laravel框架最重要的Facades

Laravel框架最重要的Facades

2023-08-27 03:54| 来源: 网络整理| 查看: 265

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战

之前写了一篇Laravel提高DB查询效率的文章,转发到群里后竟然有人质疑我说“Laravel是他好几年前用的框架,没想到现在还有人在用。”

纳尼,什么意思嘛?别忘了PHP是最好的语言!

个人认为Laravel是非常优雅的开发框架:优雅的设计模式、强大的功能实现、各种方便的扩展、持续的版本更新,更主要的是迄今为止我认为最优秀的技术开发社区。

我必须为Laravel打Call。

2020年9月8号,Laravel发布了8.0版本。 Laravel计划于2022年1月25日发布9.0版本。

下面我介绍一下目前Laravel最新版(8.0版本)的新特性:

Laravel 8 通过引入 Laravel Jetstream,模型工厂类,迁移压缩,队列批处理,改善速率限制,队列改进,动态 Blade 组件,Tailwind 分页视图, 时间测试助手,artisan serve 的改进,事件监听器的改进,以及各种其他错误修复和可用性改进,对 Laravel 7.x 继续进行了改善。

介绍

Facades 为应用的 服务容器 提供了一个 『静态』 接口。Laravel 自带了很多 Facades,可以访问绝大部分功能。

Laravel Facades 实际是服务容器中底层类的 『静态代理』 ,相对于传统静态方法,在使用时能够提供更加灵活、更加易于测试、更加优雅的语法。

所有的 Laravel Facades 都定义在 Illuminate\Support\Facades 命名空间下。所以,我们可以轻松的使用 Facade :

use Illuminate\Support\Facades\Cache; Route::get('/cache', function () { return Cache::get('key'); });

在 Laravel 文档中,有很多示例代码都会使用 Facades 来演示框架的各种功能。

何时使用 Facades

Facades 有很多优点。它提供了简单,易记的语法,从而无需手动注入或配置长长的类名。此外,由于他们对 PHP 静态方法的独特调用,使得测试起来非常容易。

然而,在使用 Facades 时,有些地方需要特别注意。使用 Facades 时最主要的危险就是会引起类作用范围的膨胀。 由于 Facades 使用起来非常简单并且不需要注入,就会使得我们不经意间在单个类中使用许多 Facades ,从而导致类变得越来越大。

然而使用依赖注入的时候,使用的类越多,构造方法就会越长,在视觉上注意到这个类有些庞大了。因此在使用 Facades 的时候,要特别注意控制类的大小,让类的作用范围保持短小。

技巧:在开发与 Laravel 进行交互的第三方扩展包时,最好选择注入 Laravel 契约 而不使用 Facades 。因为扩展包是在 Laravel 之外构建,你无法使用 Laravel Facades 测试辅助函数。

Facades 相较于依赖注入

依赖注入的主要好处之一是能交换注入类的实现。在测试的时候非常有用,因为你可以注入一个 mock 或者 stub,并断言 stub 上的各种方法。

通常,真正的静态方法是不可能 mock 或 stub 的。但是 Facades 使用动态方法对服务容器中解析出来的对象方法的调用进行了代理,我们也可以像测试注入类实例一样测试 Facades。

比如,像下面的路由:

use Illuminate\Support\Facades\Cache; Route::get('/cache', function () { return Cache::get('key'); });

我们可以带上我们期望的参数编写下面的测试代码来验证 Cache::get 方法:

use Illuminate\Support\Facades\Cache; /** * 一个基础功能的测试用例。 * * @return void */ public function testBasicExample() { Cache::shouldReceive('get') ->with('key') ->andReturn('value'); $this->visit('/cache') ->see('value'); } Facades 相较于辅助函数

除了 Facades,Laravel 还包含各种 『辅助函数』 来实现这些常用功能,比如生成视图、触发事件、任务调度或者发送 HTTP 响应。

许多辅助函数都有与之对应的 Facades 。

例如,下面这个 Facades 和辅助函数的作用是一样的:

return View::make('profile'); return view('profile');Copy

Facade 和辅助函数之间没有实际的区别。当你使用辅助函数时,你可以像测试相应的 Facade 那样进行测试。

例如,下面的路由:

Route::get('/cache', function () { return cache('key'); });

在底层实现,辅助函数 cache 实际是调用 Cache 这个 Facade 的 get 方法。

因此,尽管我们使用的是辅助函数,我们依然可以带上我们期望的参数编写下面的测试代码来验证该方法:

use Illuminate\Support\Facades\Cache; /** * 一个基础功能的测试用例。 * * @return void */ public function testBasicExample() { Cache::shouldReceive('get') ->with('key') ->andReturn('value'); $this->visit('/cache') ->see('value'); } Facades 工作原理

在 Laravel 应用中,Facade 就是一个可以从容器访问对象的类。其中核心的部件就是 Facade 类。

不管是 Laravel 自带的 Facades,还是自定义的 Facades,都继承自 Illuminate\Support\Facades\Facade 类。

Facade 基类使用了__callStatic() 魔术方法,直到对象从容器中被解析出来后,才会进行调用。在下面的例子中,调用了 Laravel 的缓存系统。

通过浏览这段代码,可以假定在 Cache 类中调用了静态方法 get:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3