Laravel5中contracts详解
《PHP实例:Laravel5中contracts详解》要点: PHP应用我们先来看看官方文档中对contracts的定义: Laravel's Contracts are a set of interfaces that define the core services provided by the framework. 也就是说,每一个Contract都是一个接口,对应一个框架核心服务. 那它的意义安在?官网给出的解释也很简单:使用接口是为了 松耦合 和 简单 . 先不讲大道理,先来点干货,看看怎么使用contract 先浏览下contracts接口列表:
代码如下:
IlluminateContractsAuthGuard IlluminateContractsAuthPasswordBroker IlluminateContractsBusDispatcher IlluminateContractsCacheRepository IlluminateContractsCacheFactory IlluminateContractsConfigRepository IlluminateContractsContainerContainer IlluminateContractsCookieFactory IlluminateContractsCookieQueueingFactory IlluminateContractsEncryptionEncrypter IlluminateContractsRoutingRegistrar …… 太多了,懒得继续贴了,官网手册里有.我们就拿 IlluminateContractsRoutingRegistrar 这个contract来演示一下吧.
代码如下:
public function register() { ??? $this->app->bind( ??????? 'IlluminateContractsAuthRegistrar', ??????? 'AppServicesRegistrar' ??? ); } $this->app 就是Application对象,也是容器对象,通过 $this->app->bind 办法我们绑定了一个实现IlluminateContractsAuthRegistrar接口的类AppServicesRegistrar. 注意,IlluminateContractsAuthRegistrar就是一个contract.AppServicesRegistrar 这个类文件在 app/Services/Registrar.php. 接着我们看 AppHttpControllersAuthAuthController 这个控制器类,看到它有 __construct 构造函数:
代码如下:
public function __construct(Guard $auth,Registrar $registrar) { ??? $this->auth = $auth; ??? $this->registrar = $registrar; ??? $this->middleware('guest',['except' => 'getLogout']); 它有两个参数,对应的类命名空间在脚本开头可以看到:
代码如下:
use IlluminateContractsAuthGuard; use IlluminateContractsAuthRegistrar; 这两个都是contract,但我们这里就拿 Registrar 说,我们注意到这里面只是通过参数类型指明了$registrar的接口类型,而实际调用的时候实际上是 AppServicesRegistrar 这个类,这就是依赖注入的特性了,Laravel会自动在容器中搜索实现了接口IlluminateContractsAuthRegistrar的类或对象,有的话就取出来作为实际参数传到构造函数里. 整个使用流程其实就可以总结为两个步骤: 向容器中注册实现contract接口的对象. 松耦合 官网给了一个例子解释什么是紧耦合以及Contract接口为何能够松耦合. 先来看看紧耦合的代码:
代码如下:
<?php namespace AppOrders; class Repository { ??? /** ???? * The cache. ???? */ ??? protected $cache; ??? /** ???? * Create a new repository instance. ???? * ???? * @param? SomePackageCacheMemcached? $cache ???? * @return void ???? */ ??? public function __construct(SomePackageCacheMemcached $cache) ??? { ??????? $this->cache = $cache; ??? } ??? /** ???? * Retrieve an Order by ID. ???? * ???? * @param? int? $id ???? * @return Order ???? */ ??? public function find($id) ??? { ??????? if ($this->cache->has($id)) ??????? { ??????????? // ??????? } ??? } } 可以看到构造函数中注入了一个详细的缓存实现 SomePackageCacheMemcached,如果换Redis作为缓存服务器或者更改了api办法,就需要修改,而如果项目很大,你不知道还有多少地方需要修改. 那么,Contract接口是如何办理这个问题的?请看代码:
代码如下:
<?php namespace AppOrders; use IlluminateContractsCacheRepository as Cache; class Repository { ??? /** ???? * Create a new repository instance. ???? * ???? * @param? Cache? $cache ???? * @return void ???? */ ??? public function __construct(Cache $cache) ??? { ??????? $this->cache = $cache; ??? } } 注意,缓存实现我们使用了一个接口,也就是contract,IlluminateContractsCacheRepository,因为它只是接口,不必要关心背后是memcache还是redis. 简单性 如果所有服务都使用接口定义,就可以很简单的决定一个服务必要的功能,更加容易维护和扩展,并且contract接口还能看作一个简洁的文档便于阅读. 编程之家培训学院每天发布《PHP实例:Laravel5中contracts详解》等实战技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培养人才。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |