博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Laravel 5 系统架构:服务提供者、服务容器、Contracts、Facades
阅读量:5248 次
发布时间:2019-06-14

本文共 2411 字,大约阅读时间需要 8 分钟。

在一方面真的写的很糟糕,完全没描述相互之间的关系。

事实上, 、 、 、 是一件东西的多个方面。其实就是 Yii 的组件(Component)。

和 Yii 一样,Laravel 的所有功能都是通过与 Yii 组件类似的服务来实现的。

一个最简单直接的例子是 服务。其自身只是一个 的封装。

首先,Laravel 5 定义了一个 Contracts: Illuminate/Contracts/Hashing/Hasher.

 

Contracts 只是描述一个服务的具体方法,而不是实现该服务。 才是服务的具体实现,对于一个服务来说,可能会有多种不同的实现。Hash 目前只有一个,就是: Illuminate/Hashing/BcryptHasher.php

rounds; $hash = password_hash($value, PASSWORD_BCRYPT, array('cost' => $cost)); if ($hash === false) { throw new RuntimeException("Bcrypt hashing not supported."); } return $hash; } /** * Check the given plain value against a hash. * * @param string $value * @param string $hashedValue * @param array $options * @return bool */ public function check($value, $hashedValue, array $options = array()) { return password_verify($value, $hashedValue); } /** * Check if the given hash has been hashed using the given options. * * @param string $hashedValue * @param array $options * @return bool */ public function needsRehash($hashedValue, array $options = array()) { $cost = isset($options['rounds']) ? $options['rounds'] : $this->rounds; return password_needs_rehash($hashedValue, PASSWORD_BCRYPT, array('cost' => $cost)); } /** * Set the default password work factor. * * @param int $rounds * @return $this */ public function setRounds($rounds) { $this->rounds = (int) $rounds; return $this; } }

除了实现 Contracts 中定义的三个方法外,还实现了一个额外 setRounds() 方法。

下一步就是注册为服务提供者了: Illuminate/Hashing/HashServiceProvider.php

app->singleton('hash', function() { return new BcryptHasher; }); } /** * Get the services provided by the provider. * * @return array */ public function provides() { return array('hash'); } }

很明显的 register 了服务,具体做的就是 new 了一个 Container。如果容器有多种实现,这时建议使用 Config 来配置服务了。

$this->app->singleton('hash', function($app) { return new Hasher($app['config']['hash']); });

这时候 Hasher 实际上一个工厂类(Factory),使用配置来确定具体的,如 new Hasher('bcrypt') 来实例化。

如果服务要延迟载入,也就是按需载入。需要有一个激活标志,也就是 provides() 方法。

当然, HashServiceProvider.php 必须在 config/app.php 的 providers 中定义'Illuminate\Hashing\HashServiceProvider' 行。

这时,就可以使用:

$this->app->make('hash')->make('password'); $this->app['hash']->make('password');

最后,声明一个 Facade: Illuminate/Support/Facades/Hash.php

在 config/app.php 的 aliases 中定义 'Hash' => 'Illuminate\Support\Facades\Hash' 行。

那么,就不用上面长长的 $this->app->make('hash') ,直接:

Hash::make('password');转自:http://ju.outofmemory.cn/entry/144667

转载于:https://www.cnblogs.com/cyforever/p/6139154.html

你可能感兴趣的文章
【读书笔记】C#高级编程 第三章 对象和类型
查看>>
针对sl的ICSharpCode.SharpZipLib,只保留zip,gzip的流压缩、解压缩功能
查看>>
【转】代码中特殊的注释技术——TODO、FIXME和XXX的用处
查看>>
【SVM】libsvm-python
查看>>
C++循环单链表删除连续相邻重复值
查看>>
Jmeter接口压力测试,Java.net.BindException: Address already in use: connect
查看>>
ASP.NET使网页弹出窗口不再困难
查看>>
Leetcode Balanced Binary Tree
查看>>
Leetcode 92. Reverse Linked List II
查看>>
windown快速安装xgboost
查看>>
Linux上安装Libssh2
查看>>
九.python面向对象(双下方法内置方法)
查看>>
go:channel(未完)
查看>>
[JS]递归对象或数组
查看>>
LeetCode(17) - Letter Combinations of a Phone Number
查看>>
Linux查找命令对比(find、locate、whereis、which、type、grep)
查看>>
路由器外接硬盘做nas可行吗?
查看>>
python:从迭代器,到生成器,再到协程的示例代码
查看>>
Java多线程系列——原子类的实现(CAS算法)
查看>>
在Ubuntu下配置Apache多域名服务器
查看>>