騰云網(wǎng)絡(luò)教你如何擴(kuò)展Laravel常用方法
2019-04-19
注冊(cè)服務(wù)
向容器中注冊(cè)服務(wù)
// 綁定服務(wù)
$container->bind('log', function(){
return new Log();
});
// 綁定單例服務(wù)
$container->singleton('log', function(){
return new Log();
});
擴(kuò)展綁定
擴(kuò)展已有服務(wù)
$container->extend('log', function(Log $log){
return new RedisLog($log);
});
Manager
Manager實(shí)際上是一個(gè)工廠,它為服務(wù)提供了驅(qū)動(dòng)管理功能。
Laravel中的很多組件都使用了Manager,如:Auth
、Cache
、Log
、Notification
、Queue
、Redis
等等,每個(gè)組件都有一個(gè)xxxManager
的管理器。我們可以通過這個(gè)管理器擴(kuò)展服務(wù)。
比如,如果我們想讓Cache
服務(wù)支持RedisCache
驅(qū)動(dòng),那么我們可以給Cache
服務(wù)擴(kuò)展一個(gè)redis
驅(qū)動(dòng):
Cache::extend('redis', function(){
return new RedisCache();
});
這時(shí)候,Cache
服務(wù)就支持redis
這個(gè)驅(qū)動(dòng)了?,F(xiàn)在,找到config/cache.php
,把default
選項(xiàng)的值改成redis
。這時(shí)候我們?cè)儆?code style="margin: 0px 3px; padding: 3px 5px; max-width: 100%; box-sizing: border-box; overflow-wrap: break-word !important; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 11.7px; color: rgb(199, 37, 78); background-color: rgb(241, 241, 241); border-radius: 3px; display: inline-block;">Cache服務(wù)時(shí),就會(huì)使用RedisCache
驅(qū)動(dòng)來使用緩存。
Macro和Mixin
有些情況下,我們需要給一個(gè)類動(dòng)態(tài)增加幾個(gè)方法,Macro
或者Mixin
很好的解決了這個(gè)問題。
在Laravel底層,有一個(gè)名為Macroable
的Trait
,凡是引入了Macroable
的類,都支持Macro
和Mixin
的方式擴(kuò)展,比如Request
、Response
、SessionGuard
、View
、Translator
等等。
Macroable
提供了兩個(gè)方法,macro
和mixin
,macro
方法可以給類增加一個(gè)方法,mixin
是把一個(gè)類中的方法混合到Macroable
類中。
舉個(gè)例子,比如我們要給Request
類增加兩個(gè)方法。
使用macro
方法時(shí):
Request::macro('getContentType', function(){
// 函數(shù)內(nèi)的$this會(huì)指向Request對(duì)象
return $this->headers->get('content-type');
});
Request::macro('hasField', function(){
return !is_null($this->get($name));
});
$contentType = Request::getContentstType();
$hasPassword = Request::hasField('password');
使用mixin
方法時(shí):
class MixinRequest{
public function getContentType(){
// 方法內(nèi)必須返回一個(gè)函數(shù)
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');