使用 bind() 方法,为 QueryList 扩充新的自定义功能
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
多数情况下,QueryList
的默认功能,都是够用的。但是,如果说个性化定制的话,大家还是希望可以为QueryList
扩充新的自定义功能。那么,这个需求的解决方案就是:使用bind()
方法。
苏南大叔,在本文中,将要讲述的函数是bind()
方法。利用bind()
方法,给QueryList
扩充新的功能。
bind()
方法描述
QueryList bind(string $name,Closure $provide)
QueryList
功能扩展,绑定一个功能函数到QueryList
对象,轻量级功能扩展,可以理解为注册了一个插件。可静态调用或动态调用。
- 参数: $name
绑定的功能函数名称。如果绑定多个相同名称的函数,后面绑定的会覆盖前面绑定的,所以只有最后一个同名函数会生效。 - 参数: $provide
匿名处理函数,函数内的$this
对象为当前QueryList对象的内部$this
,意味着可以通过这个$this
调用QueryList
任意的方法。
bind()
用法范例一
下面演示注册一个自定义的http
网络操作方法到QueryList
对象:
//采集开发者头条
$ql = QueryList::getInstance();
//注册一个myHttp方法到QueryList对象
$ql->bind('myHttp',function ($url){
$html = file_get_contents($url);
$this->setHtml($html);
return $this;
});
//然后就可以通过注册的名字来调用
$data = $ql->myHttp('https://toutiao.io')->find('h3 a')->texts();
print_r($data->all());
//或者这样用
$data = $ql->rules([
'title' => ['h3 a','text'],
'link' => ['h3 a','href']
])->myHttp('https://toutiao.io')->query()->getData();
print_r($data->all());
输出:
Array
(
[0] => 用 500 行 Golang 代码实现高性能的消息回调中间件
[1] => 腾讯大神教你如何解决 Android 内存泄露
[2] => [译] 普通码农入门机器学习,必须掌握这些数据技能
[3] => 教你用 Carthage + RXSwift + MVVM + Moya + Router 写一个小说阅读 App
//...
)
Array
(
[0] => Array
(
[title] => 用 500 行 Golang 代码实现高性能的消息回调中间件
[link] => /k/u6hhfn
)
[1] => Array
(
[title] => 腾讯大神教你如何解决 Android 内存泄露
[link] => /k/abg526
)
[2] => Array
(
[title] => [译] 普通码农入门机器学习,必须掌握这些数据技能
[link] => /k/cnbt4o
)
[3] => Array
(
[title] => 教你用 Carthage + RXSwift + MVVM + Moya + Router 写一个小说阅读 App
[link] => /k/1aaumb
)
//....
)
bind()
用法范例二
自定义一个简单的图片下载功能:
//采集并下载ZOL桌面壁纸
//扩展一个图片下载功能
//参数:$path 为图片本地保存路径
$ql = QueryList::bind('downloadImage',function ($path){
$data = $this->getData()->map(function ($item) use($path){
//获取图片
$img = file_get_contents($item['image']);
$localPath = $path.'/'.md5($img).'.jpg';
//保存图片到本地路径
file_put_contents($localPath,$img);
//data数组中新增一个自定义的本地路径字段
$item['local_path'] = $localPath;
return $item;
});
//更新data属性
$this->setData($data);
return $this;
});
$data = $ql->get('http://desk.zol.com.cn')->rules([
'image' => ['#newPicList img','src']
])->query()->downloadImage('img')->getData();
print_r($data->all());
输出:
Array
(
[0] => Array
(
[image] => http://desk.fd.zol-img.com.cn/t_s208x130c5/g5/M00/0C/01/ChMkJ1nDaCOIatt0AAStbpl0q7sAAgrLABXih4ABK2G911.jpg
[local_path] => img/59561f7b8c122d529b9709fdc93283cd.jpg
)
[1] => Array
(
[image] => http://desk.fd.zol-img.com.cn/t_s208x130c5/g5/M00/04/0D/ChMkJ1mvUQ2IRSccAAIWHljxrrYAAgONAMJtn8AAhY2932.jpg
[local_path] => img/00bfaf54c930247815b6d906827600a9.jpg
)
[2] => Array
(
[image] => http://desk.fd.zol-img.com.cn/t_s208x130c5/g5/M00/04/00/ChMkJ1mtG--IPy-5AAOcpLiVZyQAAgLHwB3T3gAA5y8026.jpg
[local_path] => img/60ca7c8575da1f7746cb3e69918a7d68.jpg
)
[3] => Array
(
[image] => http://desk.fd.zol-img.com.cn/t_s208x130c5/g5/M00/03/07/ChMkJ1mqnYWIHGfnAA1lScmizi8AAgI1QBBDRQADWVh371.jpg
[local_path] => img/18c7a79b3f20244cbf7014a42e1709f5.jpg
)
[4] => Array
(
[image] => http://desk.fd.zol-img.com.cn/t_s208x130c5/g5/M00/0F/07/ChMkJ1auywyIfAiMAA1aJc_O3G0AAH8ygMjcosADVo9010.jpg
[local_path] => img/83e881add90fd5908d78918390ef0659.jpg
)
[5] => Array
(
[image] => http://desk.fd.zol-img.com.cn/t_s208x130c5/g5/M00/0F/04/ChMkJlk4uwOIXe12AAebdUNvnEkAAc4jQD4SUcAB5uN513.jpg
[local_path] => img/d2030a819368db51dec6919e141a8db3.jpg
)
)
bind()
用法范例三
如果你想扩展的功能比较复杂,你可以把你想扩展的功能独立成一个class,然后在bind里面调用,就像这样:
QueryList::bind('myHttp',function(){
return new MyHttp($this);
})
bind()
用法范例四
一个bind
可以依赖另一个bind
:
$ql = QueryList::bind('myHttp',function(){
return new MyHttp($this);
});
$ql->bind('other',function(){
//使用上一个bind
$this->myHttp();
return $this;
})
注意事项
bind()
是只有当前的querylist
才可以使用的,如果想全局任何querylist
对象都能使用,请使用config()
方法进行配置。bind()
的第一个参数$name
,存在着同名覆盖的关系。只能有一个$name
。bind()
的第二个参数$provide
,必须return $this
。
总结
当您想增强实现QueryList
功能的时候,就可以使用bind()
来配置新的功能了。但是增加新功能的途径,还有config()
。这个功能,将在苏南大叔的后续QueryList
系列文章里面说明。
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。