插件开发指导


讲解前先列出最后的整体目录结构,假定www目录为当前的项目目录:

  1. www
  2. ├── querylist
  3. ├── Ext
  4. └── Hello.php
  5. ├── QueryList.php
  6. └── vendor
  7. └── testHello.php

一.下载QueryList项目到本地

安装querylist

  1. composer create-project jaeger/querylist

然后到querylist目录去执行下面命令安装AQuery,AQuery为所有插件的基类,插件必须继承AQuery并实现run()方法.

  1. composer require jaeger/querylist-ext-aquery

二.在querylist目录下新建Ext目录

querylist/Ext目录可用于存放QueryList扩展

三.在querylist/Ext目录下新建扩展文件Hello.php

  1. <?php
  2. /**
  3. * QueryList的Hello扩展演示
  4. */
  5. namespace QL\Ext;
  6. class Hello extends AQuery
  7. {
  8. /**
  9. * 必须要实现run()方法
  10. */
  11. public function run(array $args)
  12. {
  13. //getInstance()方法用于获取任意类的实例,默认获取QueryList实例
  14. $ql = $this->getInstance();
  15. //设置QueryList对象的html属性
  16. $ql->html = $this->getHtml($args['url']);
  17. //返回QueryList对象
  18. return $ql;
  19. }
  20. /**
  21. * 自定义一个抓取网页源码的方法
  22. */
  23. public function getHtml($url)
  24. {
  25. return file_get_contents($url);
  26. }
  27. }

这样一个简单的QueryList插件就开发好了,现在在项目目录新建一个testHello.php文件来测试一下Hello插件工作是否正常:

  1. <?php
  2. require 'querylist/vendor/autoload.php';
  3. use QL\QueryList;
  4. $ql = QueryList::run('Hello',[
  5. 'url' => 'http://www.baidu.com'
  6. ]);
  7. $data = $ql->setQuery([
  8. 'title'=>['title','text']
  9. ])->data;
  10. print_r($data);

输出结果:

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [title] => 百度一下,你就知道
  6. )
  7. )

下面附加一些现有的插件源码来加强理解

下面是Request扩展的源码:

  1. <?php
  2. namespace QL\Ext;
  3. /**
  4. * @Author: Jaeger <hj.q@qq.com>
  5. * @version 1.0
  6. * 网络操作扩展
  7. */
  8. class Request extends AQuery
  9. {
  10. protected function hq(array $args)
  11. {
  12. $args = array(
  13. 'http' => isset($args['http'])?$args['http']:$args,
  14. 'callback' => isset($args['callback'])?$args['callback']:'',
  15. 'args' => isset($args['args'])?$args['args']:''
  16. );
  17. $http = $this->getInstance('QL\Ext\Lib\Http');
  18. $http->initialize($args['http']);
  19. $http->execute();
  20. if(!empty($args['callback'])){
  21. $http->result = call_user_func($args['callback'],$http->result,$args['args']);
  22. }
  23. return $http;
  24. }
  25. public function run(array $args)
  26. {
  27. $http = $this->hq($args);
  28. $ql = $this->getInstance();
  29. $ql->html = $http->result;
  30. return $ql;
  31. }
  32. }

扩展之间还可以继承,下面的Login扩展继承了Request扩展并重写了run()方法:

  1. <?php
  2. namespace QL\Ext;
  3. /**
  4. * @Author: Jaeger <hj.q@qq.com>
  5. * @version 1.0
  6. * 模拟登陆扩展
  7. */
  8. class Login extends Request
  9. {
  10. private $http;
  11. public $html;
  12. public function run(array $args)
  13. {
  14. $this->http = $this->hq($args);
  15. $this->html = $this->http->result;
  16. return $this;
  17. }
  18. public function get($url,$callback = null,$args = null)
  19. {
  20. $result = $this->http->get($url);
  21. return $this->getQL($result,$callback,$args);
  22. }
  23. public function post($url,$data=array(),$callback = null,$args = null)
  24. {
  25. $result = $this->http->post($url,$data);
  26. return $this->getQL($result,$callback,$args);
  27. }
  28. private function getQL($html,$callback = null,$args = null)
  29. {
  30. if(is_callable($callback)){
  31. $result = call_user_func($callback,$result,$args);
  32. }
  33. $ql = $this->getInstance();
  34. $ql->html = $html;
  35. return $ql;
  36. }
  37. }