1 依赖注入
方法传入组件名, 框架会自动实例化, 方法内可直接使用
例如最常用的 requert 对象
2 服务容器
其实, Laravel 的核心就是一个 IoC 容器, Laravel 的核心本身十分轻量, 并没有什么很神奇很实质性的应用功能很多人用到的各种功能模块比如 Route(路由)Eloquent ORM(数据库 ORM 组件)Request(请求)以及 Response(响应)等等等等, 实际上都是与核心无关的类模块提供的, 这些类从注册到实例化, 最终被你所使用, 其实都是 Laravel 的服务容器负责的
服务提供者主要分为两个部分, register(注册) 和 boot(引导初始化)
3 服务提供者
一个类要被容器所能够提取, 必须要先注册至这个容器既然 Laravel 称这个容器叫做服务容器, 那么我们需要某个服务, 就得先注册绑定这个服务到容器, 那么提供服务并绑定服务至容器的东西, 就是服务提供者(Service Provider)
4 向 IOC 容器添加自己的类
4.1 新建 validate 类
4.2 新建 validateProvider
4.3 绑定 validate 类到 Provider
- <?php
- namespace App\Providers;
- use Illuminate\Support\ServiceProvider;
- class ValidateProvider extends ServiceProvider
- {
- /**
- * Bootstrap the application services.
- *
- * @return void
- */
- public function boot()
- {
- //
- }
- /**
- * Register the application services.
- *
- * @return void
- */
- public function register()
- {
- $this->app->bind('valicate',function(){
- return new Validate();
- });
- }
- }
4.4 添加 Provider 到 IOC 容器
4.5 使用
4.6 成功!
5 门面(facade)
facade 用来提供统一的接口, 比如无论你用哪种 cache,redis 还是 memcache, 客户端都可以用 cache::get()方式来获取 value, 至于具体是用了 redis 还是 memcahe, 就看你在 sevice provider 里面绑定了哪个 cache::get()的实现方式是, 继承 Facade 方法 getFacadeAccessor, 返回你在容器中绑定的 key 值, 比如 cache, 然后 Facade 类会使用 php 魔术变量__callstatic(),callstatic 的逻辑里面会从 container 里解析 cache 所绑定的服务, 就是前面提到的 service provider 绑定了谁
5.1 例如 config/app.php 里的 mail
5.2 这个类只返回一个 mailer
5.3 如果调用它的 send 方法, 不存在的话会进入到 callstatic 的魔术方法
5.4 这个方法会得到 mailer 的实例, 即 app('mailer')
5.5 这个实例便能调用 mailer 类的 send 方法
6 契约
Laravel 的契约是一组定义框架提供的核心服务的接口例如,
Illuminate\Contracts\Queue\Queue
契约定义了队列任务所需的方法, 而
Illuminate\Contracts\Mail\Mailer
契约定义了发送电子邮件所需的方法框架对每个契约都提供了相应的实现
好处是实现了程序的低耦合和简单性
低耦合 #
首先, 让我们来看一些高耦合缓存实现的代码如下:
- <?php
- namespace App\Orders;
- class Repository
- {
- /**
- * 缓存实例
- */
- protected $cache;
- /**
- * 创建一个仓库实例
- *
- * @param \SomePackage\Cache\Memcached $cache
- * @return void
- */
- public function __construct(\SomePackage\Cache\Memcached $cache)
- {
- $this->cache = $cache;
- }
- /**
- * 按照 Id 检索订单
- *
- * @param int $id
- * @return Order
- */
- public function find($id)
- {
- if ($this->cache->has($id)) {
- //
- }
- }
- }
在这个类中, 程序跟给定的缓存实现高耦合因为我们依赖于一个扩展包的特定缓存类一旦这个扩展包的 API 被更改了, 我们的代码就必须跟着改变
同样的, 如果我们想要将底层的的缓存技术 ( Memcached ) 替换为另一种缓存技术( Redis ), 那又得再次修改这个 repository 类而 repository 类不应该了解太多关于谁提供了这些数据或是如何提供的等等
比起上面的做法, 我们可以使用一个简单的与扩展包无关的接口来改进我们的代码:
- <?php
- namespace App\Orders;
- use Illuminate\Contracts\Cache\Repository as Cache;
- class Repository
- {
- /**
- * 缓存实例
- */
- protected $cache;
- /**
- * 创建一个仓库实例
- *
- * @param Cache $cache
- * @return void
- */
- public function __construct(Cache $cache)
- {
- $this->cache = $cache;
- }
- }
现在, 更改之后的代码没有与任何扩展包甚至是 Laravel 耦合而契约扩展包不包含任何实现和依赖项, 你可以轻松地写任何给定契约的替代实现, 来实现不修改任何关于缓存消耗的代码就可以替换缓存实现
来源: https://www.cnblogs.com/lamp01/p/8445587.html