QueryList bind(string $name,Closure $provide)


  • 用法
    QueryList功能扩展,绑定一个功能函数到QueryList对象,轻量级功能扩展,可以理解为注册了一个插件。可静态调用或动态调用。

  • 参数: $name绑定的功能函数名称。如果绑定多个相同名称的函数,后面绑定的会覆盖前面绑定的,所以只有最后一个同名函数会生效。

  • 参数: $provide匿名处理函数,函数内的$this对象为当前QueryList对象的内部$this,意味着可以通过这个$this调用QueryList任意的方法。

{primary} 用该方法扩展的功能只有当前的QueryList对象可以使用,如果想要全局所有QueryList均可使用,可以查看config()方法文档。


用法


  • 例子一
    下面演示注册一个自定义的http网络操作方法到QueryList对象:
  1. //采集开发者头条
  2. $ql = QueryList::getInstance();
  3. //注册一个myHttp方法到QueryList对象
  4. $ql->bind('myHttp',function ($url){
  5. $html = file_get_contents($url);
  6. $this->setHtml($html);
  7. return $this;
  8. });
  9. //然后就可以通过注册的名字来调用
  10. $data = $ql->myHttp('https://toutiao.io')->find('h3 a')->texts();
  11. print_r($data->all());
  12. //或者这样用
  13. $data = $ql->rules([
  14. 'title' => ['h3 a','text'],
  15. 'link' => ['h3 a','href']
  16. ])->myHttp('https://toutiao.io')->query()->getData();
  17. print_r($data->all());

输出:

  1. Array
  2. (
  3. [0] => 500 Golang 代码实现高性能的消息回调中间件
  4. [1] => 腾讯大神教你如何解决 Android 内存泄露
  5. [2] => [译] 普通码农入门机器学习,必须掌握这些数据技能
  6. [3] => 教你用 Carthage + RXSwift + MVVM + Moya + Router 写一个小说阅读 App
  7. //...
  8. )
  9. Array
  10. (
  11. [0] => Array
  12. (
  13. [title] => 500 Golang 代码实现高性能的消息回调中间件
  14. [link] => /k/u6hhfn
  15. )
  16. [1] => Array
  17. (
  18. [title] => 腾讯大神教你如何解决 Android 内存泄露
  19. [link] => /k/abg526
  20. )
  21. [2] => Array
  22. (
  23. [title] => [译] 普通码农入门机器学习,必须掌握这些数据技能
  24. [link] => /k/cnbt4o
  25. )
  26. [3] => Array
  27. (
  28. [title] => 教你用 Carthage + RXSwift + MVVM + Moya + Router 写一个小说阅读 App
  29. [link] => /k/1aaumb
  30. )
  31. //....
  32. )

  • 例子二自定义一个简单的图片下载功能:
  1. //采集并下载ZOL桌面壁纸
  2. //扩展一个图片下载功能
  3. //参数:$path 为图片本地保存路径
  4. $ql = QueryList::bind('downloadImage',function ($path){
  5. $data = $this->getData()->map(function ($item) use($path){
  6. //获取图片
  7. $img = file_get_contents($item['image']);
  8. $localPath = $path.'/'.md5($img).'.jpg';
  9. //保存图片到本地路径
  10. file_put_contents($localPath,$img);
  11. //data数组中新增一个自定义的本地路径字段
  12. $item['local_path'] = $localPath;
  13. return $item;
  14. });
  15. //更新data属性
  16. $this->setData($data);
  17. return $this;
  18. });
  19. $data = $ql->get('http://desk.zol.com.cn')->rules([
  20. 'image' => ['#newPicList img','src']
  21. ])->query()->downloadImage('img')->getData();
  22. print_r($data->all());

输出:

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [image] => http://desk.fd.zol-img.com.cn/t_s208x130c5/g5/M00/0C/01/ChMkJ1nDaCOIatt0AAStbpl0q7sAAgrLABXih4ABK2G911.jpg
  6. [local_path] => img/59561f7b8c122d529b9709fdc93283cd.jpg
  7. )
  8. [1] => Array
  9. (
  10. [image] => http://desk.fd.zol-img.com.cn/t_s208x130c5/g5/M00/04/0D/ChMkJ1mvUQ2IRSccAAIWHljxrrYAAgONAMJtn8AAhY2932.jpg
  11. [local_path] => img/00bfaf54c930247815b6d906827600a9.jpg
  12. )
  13. [2] => Array
  14. (
  15. [image] => http://desk.fd.zol-img.com.cn/t_s208x130c5/g5/M00/04/00/ChMkJ1mtG--IPy-5AAOcpLiVZyQAAgLHwB3T3gAA5y8026.jpg
  16. [local_path] => img/60ca7c8575da1f7746cb3e69918a7d68.jpg
  17. )
  18. [3] => Array
  19. (
  20. [image] => http://desk.fd.zol-img.com.cn/t_s208x130c5/g5/M00/03/07/ChMkJ1mqnYWIHGfnAA1lScmizi8AAgI1QBBDRQADWVh371.jpg
  21. [local_path] => img/18c7a79b3f20244cbf7014a42e1709f5.jpg
  22. )
  23. [4] => Array
  24. (
  25. [image] => http://desk.fd.zol-img.com.cn/t_s208x130c5/g5/M00/0F/07/ChMkJ1auywyIfAiMAA1aJc_O3G0AAH8ygMjcosADVo9010.jpg
  26. [local_path] => img/83e881add90fd5908d78918390ef0659.jpg
  27. )
  28. [5] => Array
  29. (
  30. [image] => http://desk.fd.zol-img.com.cn/t_s208x130c5/g5/M00/0F/04/ChMkJlk4uwOIXe12AAebdUNvnEkAAc4jQD4SUcAB5uN513.jpg
  31. [local_path] => img/d2030a819368db51dec6919e141a8db3.jpg
  32. )
  33. )

  • 例子三
    如果你想扩展的功能比较复杂,你可以把你想扩展的功能独立成一个class,然后在bind里面调用,就像这样:
  1. QueryList::bind('myHttp',function(){
  2. return new MyHttp($this);
  3. })

  • 例子四
    一个bind可以依赖另一个bind:
  1. $ql = QueryList::bind('myHttp',function(){
  2. return new MyHttp($this);
  3. });
  4. $ql->bind('other',function(){
  5. //使用上一个bind
  6. $this->myHttp();
  7. return $this;
  8. })