目录

QueryList bind(string $name,Closure $provide)

优质
小牛编辑
132浏览
2023-12-01

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

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

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

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

用法


  • 例子一

下面演示注册一个自定义的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
        )

   //....

)

  • 例子二 自定义一个简单的图片下载功能:
//采集并下载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] => https://www.xnip.cn/wp-content/uploads/2021/docimg6/25-fs2rngi0t0l.jpg
            [local_path] => img/59561f7b8c122d529b9709fdc93283cd.jpg
        )

    [1] => Array
        (
            [image] => https://www.xnip.cn/wp-content/uploads/2021/docimg6/26-wqr0t34ygpb.jpg
            [local_path] => img/00bfaf54c930247815b6d906827600a9.jpg
        )

    [2] => Array
        (
            [image] => https://www.xnip.cn/wp-content/uploads/2021/docimg6/27-exp3uo2gmmv.jpg
            [local_path] => img/60ca7c8575da1f7746cb3e69918a7d68.jpg
        )

    [3] => Array
        (
            [image] => https://www.xnip.cn/wp-content/uploads/2021/docimg6/28-vxpyfgbzfcy.jpg
            [local_path] => img/18c7a79b3f20244cbf7014a42e1709f5.jpg
        )

    [4] => Array
        (
            [image] => https://www.xnip.cn/wp-content/uploads/2021/docimg6/29-i1y12nlgeo2.jpg
            [local_path] => img/83e881add90fd5908d78918390ef0659.jpg
        )

    [5] => Array
        (
            [image] => https://www.xnip.cn/wp-content/uploads/2021/docimg6/30-ctdvgumartt.jpg
            [local_path] => img/d2030a819368db51dec6919e141a8db3.jpg
        )

)

  • 例子三

如果你想扩展的功能比较复杂,你可以把你想扩展的功能独立成一个class,然后在bind里面调用,就像这样:

QueryList::bind('myHttp',function(){
    return new MyHttp($this);
})

  • 例子四

一个bind可以依赖另一个bind:

$ql = QueryList::bind('myHttp',function(){
    return new MyHttp($this);
});

$ql->bind('other',function(){
    //使用上一个bind
    $this->myHttp();
    return $this;
})