腾云网络教你如何扩展Laravel常用方法
2019-04-19
注册服务
向容器中注册服务
// 绑定服务
$container->bind('log', function(){
return new Log();
});
// 绑定单例服务
$container->singleton('log', function(){
return new Log();
});
扩展绑定
扩展已有服务
$container->extend('log', function(Log $log){
return new RedisLog($log);
});
Manager
Manager实际上是一个工厂,它为服务提供了驱动管理功能。
Laravel中的很多组件都使用了Manager,如:Auth
、Cache
、Log
、Notification
、Queue
、Redis
等等,每个组件都有一个xxxManager
的管理器。我们可以通过这个管理器扩展服务。
比如,如果我们想让Cache
服务支持RedisCache
驱动,那么我们可以给Cache
服务扩展一个redis
驱动:
Cache::extend('redis', function(){
return new RedisCache();
});
这时候,Cache
服务就支持redis
这个驱动了。现在,找到config/cache.php
,把default
选项的值改成redis
。这时候我们再用Cache
服务时,就会使用RedisCache
驱动来使用缓存。
Macro和Mixin
有些情况下,我们需要给一个类动态增加几个方法,Macro
或者Mixin
很好的解决了这个问题。
在Laravel底层,有一个名为Macroable
的Trait
,凡是引入了Macroable
的类,都支持Macro
和Mixin
的方式扩展,比如Request
、Response
、SessionGuard
、View
、Translator
等等。
Macroable
提供了两个方法,macro
和mixin
,macro
方法可以给类增加一个方法,mixin
是把一个类中的方法混合到Macroable
类中。
举个例子,比如我们要给Request
类增加两个方法。
使用macro
方法时:
Request::macro('getContentType', function(){
// 函数内的$this会指向Request对象
return $this->headers->get('content-type');
});
Request::macro('hasField', function(){
return !is_null($this->get($name));
});
$contentType = Request::getContentstType();
$hasPassword = Request::hasField('password');
使用mixin
方法时:
class MixinRequest{
public function getContentType(){
// 方法内必须返回一个函数
return function(){
return $this->headers->get('content-type');
};
}
public function hasField(){
return function($name){
return !is_null($this->get($name));
};
}
}
Request::mixin(new MixinRequest());
$contentType = Request::getContentType();
$hasPassword = Request::hasField('password');