laravel contract——迹忆客-ag捕鱼王app官网
简介
laravel的contract是一组定义框架提供的核心服务的接口。例如,illuminate\contracts\queue\queue
contract 定义了排队作业所需的方法,而illuminate\contracts\mail\mailer
contract 定义了发送电子邮件所需的方法。
对每个contract,框架都有提供的相应实现。例如,laravel提供了具有各种驱动程序的队列实现,以及由swiftmailer提供支持的邮件程序的实现。
所有laravel contract都存在于自己的github仓库中。
contract 与 facade
laravel的facade 和帮助功能提供了一种利用laravel服务的简单方法,而无需在方法的参数中键入类型限定,就可以从服务容器中解析contract。在大多数情况下,每个facade都有一个等效的contract。
与facade(不需要您在类的构造函数中传入facade)不同,contract允许我们为类定义显式依赖关系。一些开发人员更喜欢以这种方式显式定义其依赖项,因此他们更喜欢使用contract,而其他开发人员则享受facade的便利。
无论是喜欢facade还是contract这都没关系,大多数的应用程序都能正常运行。但是,如果要构建程序包,则应强烈考虑使用contract,因为它们在程序包上下文中更容易测试。
何时使用 contract
如在其他地方讨论的那样,使用contract或facade的许多决定将取决于个人喜好和开发团队的喜好。contract和facade均可用于创建功能强大且经过良好测试的laravel应用程序。只要保持类的职责单一,就会发现使用contract和facade之间的实际差异很小。
但是,我们可能仍然对contract有几个疑问。例如,为什么要完全使用接口?使用接口不是更复杂吗?让我们将使用接口的原因归纳为以下两点:松散耦合和简单性。
松耦合
首先,让我们回顾一些与缓存实现紧密相关的代码:
cache = $cache;
}
/**
* retrieve an order by id.
*
* @param int $id
* @return order
*/
public function find($id)
{
if ($this->cache->has($id)) {
//
}
}
}
在此类中,代码与给定的缓存实现紧密耦合。之所以紧密耦合,是因为我们依赖于软件包 provider 提供的具体cache类。如果该包的api更改,我们的代码也必须更改。
同样,如果我们要用另一种技术(redis)替换我们的基础缓存技术(memcached),则我们将不得不再次修改代码。我们的repository不应该过多的关系是谁提供数据或他们是如何提供数据的。
要替换这种方法,我们可以依靠简单的,与实现无关的接口来改进代码:
cache = $cache;
}
}
现在,该代码尚未耦合到任何特定的实现,由于contract包不包含任何实现且没有依赖关系,因此我们可以轻松地编写任何给定contract的替代实现,从而使我们可以替换缓存的实现,而无需修改任何调用缓存的代码。
如何使用 contract
那么,如何获得contract的实现?实际上很简单。
laravel中的许多类型的类都可以通过服务容器来解析,包括控制器,事件监听器,中间件,排队的作业,甚至路由闭包。因此,要获取contract的实现,我们只需在要解析的类的构造函数中输入该接口的“类型提示”即可。
例如:
redis = $redis;
}
/**
* handle the event.
*
* @param orderwasplaced $event
* @return void
*/
public function handle(orderwasplaced $event)
{
//
}
}
解析事件监听器后,服务容器将读取类的构造函数上的类型提示,并注入适当的值。要了解有关在服务容器中注册内容的更多信息,请查阅服务容器文档。
contract 参考
下表提供了所有laravel contract 及其等效facade的参考:
contract | references facade |
---|---|
illuminate\contracts\auth\access\authorizable | |
illuminate\contracts\auth\access\gate | gate |
illuminate\contracts\auth\authenticatable | |
illuminate\contracts\auth\canresetpassword | |
illuminate\contracts\auth\factory | auth |
illuminate\contracts\auth\guard | auth::guard() |
illuminate\contracts\auth\passwordbroker | password::broker() |
illuminate\contracts\auth\passwordbrokerfactory | password |
illuminate\contracts\auth\statefulguard | |
illuminate\contracts\auth\supportsbasicauth | |
illuminate\contracts\auth\userprovider | |
illuminate\contracts\bus\dispatcher | bus |
illuminate\contracts\bus\queueingdispatcher | bus::dispatchtoqueue() |
illuminate\contracts\broadcasting\factory | broadcast |
illuminate\contracts\broadcasting\broadcaster | broadcast::connection() |
illuminate\contracts\broadcasting\shouldbroadcast | |
illuminate\contracts\broadcasting\shouldbroadcastnow | |
illuminate\contracts\cache\factory | cache |
illuminate\contracts\cache\lock | |
illuminate\contracts\cache\lockprovider | |
illuminate\contracts\cache\repository | cache::driver() |
illuminate\contracts\cache\store | |
illuminate\contracts\config\repository | config |
illuminate\contracts\console\application | |
illuminate\contracts\console\kernel | artisan |
illuminate\contracts\container\container | app |
illuminate\contracts\cookie\factory | cookie |
illuminate\contracts\cookie\queueingfactory | cookie::queue() |
illuminate\contracts\database\modelidentifier | |
illuminate\contracts\debug\exceptionhandler | |
illuminate\contracts\encryption\encrypter | crypt |
illuminate\contracts\events\dispatcher | event |
illuminate\contracts\filesystem\cloud | storage::cloud() |
illuminate\contracts\filesystem\factory | storage |
illuminate\contracts\filesystem\filesystem | storage::disk() |
illuminate\contracts\foundation\application | app |
illuminate\contracts\hashing\hasher | hash |
illuminate\contracts\http\kernel | |
illuminate\contracts\mail\mailqueue | mail::queue() |
illuminate\contracts\mail\mailable | |
illuminate\contracts\mail\mailer | |
illuminate\contracts\notifications\dispatcher | notification |
illuminate\contracts\notifications\factory | notification |
illuminate\contracts\pagination\lengthawarepaginator | |
illuminate\contracts\pagination\paginator | |
illuminate\contracts\pipeline\hub | |
illuminate\contracts\pipeline\pipeline | |
illuminate\contracts\queue\entityresolver | |
illuminate\contracts\queue\factory | queue |
illuminate\contracts\queue\job | |
illuminate\contracts\queue\monitor | queue |
illuminate\contracts\queue\queue | queue::connection() |
illuminate\contracts\queue\queueablecollection | |
illuminate\contracts\queue\queueableentity | |
illuminate\contracts\queue\shouldqueue | |
illuminate\contracts\redis\factory | redis |
illuminate\contracts\routing\bindingregistrar | route |
illuminate\contracts\routing\registrar | route |
illuminate\contracts\routing\responsefactory | response |
illuminate\contracts\routing\urlgenerator | url |
illuminate\contracts\routing\urlroutable | |
illuminate\contracts\session\session | session::driver() |
illuminate\contracts\support\arrayable | |
illuminate\contracts\support\htmlable | |
illuminate\contracts\support\jsonable | |
illuminate\contracts\support\messagebag | |
illuminate\contracts\support\messageprovider | |
illuminate\contracts\support\renderable | |
illuminate\contracts\support\responsable | |
illuminate\contracts\translation\loader | |
illuminate\contracts\translation\translator | lang |
illuminate\contracts\validation\factory | validator |
illuminate\contracts\validation\implicitrule | |
illuminate\contracts\validation\rule | |
illuminate\contracts\validation\validateswhenresolved | |
illuminate\contracts\validation\validator | validator::make() |
illuminate\contracts\view\engine | |
illuminate\contracts\view\factory | view |
illuminate\contracts\view\view | view::make() |