ThinkPHP 3.2.x 集成极光推送指北

3.2版本已通过了维护生命周期,官方已经再也不维护,请及时更新至5.0版本
—— ThinkPHP 官方仓库php

以上,若是有条件,请关闭这个页面,而后升级至 ThinkPHP 5,若是因为各类各样的缘由没法升级至 TP 5 ,请往下看。另外本指南使用环境为 Linux/Mac,若开发环境为 Windwos,则或许可能会有某些问题,若是有任何问题,欢迎在下方评论区留言讨论。git

参考文档: http://www.kancloud.cn/manual/thinkphpgithub

因为 ThinkPHP 3.2 已经支持了 Composer,所以本指南分为使用 Composer不使用 Composer 两部分。thinkphp

快速去看不使用 Composer 的教程json

使用 Composer

ThinkPHP 3.2 已经全面支持了 Composer ,因此使用 Composer 来集成极光推送则成为首选的方式。若是不熟悉 Composer,能够去 Composer 中文网 了解详情,本篇将不会涉及到 Composer 的安装与使用(默认已经全局安装了最新版本的 Composer )。windows

一. 获取 ThinkPHP

在工做目录下运行 $ composer create-project topthink/thinkphp tp-demoapi

二. 初次运行 ThinkPHP

初次运行以前的 Application 目录

$ cd tp-demo && php -S 127.0.0.1:4000数组

打开浏览器输入地址:127.0.0.1:4000,若结果以下则说明 ThinkPHP 3.2.3 一切 OK。浏览器

初次运行

PS:
另外 ThinkPHP 的应用支持使用命令行访问,其访问规则是:
$ php index.php(或其它应用入口文件) 模块/控制器/操做/[参数名/参数值...]app

windows 下则为:
> php.exe index.php(或其它应用入口文件) 模块/控制器/操做/[参数名/参数值...]

在命令行下运行一下,其输出是:

cli

再回头看一下 Application 目录,能够看到自动生成了公共模块 Common、默认的 Home 模块和 Runtime 运行时目录(非模块):

Application 目录初次运行以后

三. 获取 JPush PHP Api Client 官方插件

项目地址:https://github.com/jpush/jpush-api-php-client

0 . 编辑项目根目录下的 composer.json 配置文件,添加 JPush 插件依赖:

"require": {
  "php": ">=5.3.0",
  "jpush/jpush": "v3.5.*"
},

1 . 运行 $ composer install or $ composer update 安装或更新插件 。
2 . 没有第 2 步。

四. 配置 JPush

两个相关问题:

不知道 app_key 和 master_secret 有什么用
不清楚 app_key 和 master_secret 怎么得到

编辑 Application/Common/Conf/config.php 文件

<?php
return array(
    'JPUSH_APP_KEY' => 'your app_key',
    'JPUSH_MASTER_SECRET' => 'your master_secret'
);

OR

<?php
return array(
    'JPUSH' => array(
        'APP_KEY' => 'your app_key',
        'MASTER_SECRET' => 'your master_secret'
    )
);

一维数组和二维数组的配置均可以,只是加载的时候使用不一样的参数而已 C('JPUSH_APP_KEY') or C('JPUSH.APP_KEY),我的比较喜欢二维数组,因此下面都以二维数组来示例。

五. 测试 JPush

首先习惯性的在 Controller 里面直接实例化 JPush 对象,而后按照官方的 demo 的一部分,进行推送测试

<?php
namespace Home\Controller;

use Think\Controller;
use JPush\Client as JPushClient;

class IndexController extends Controller {
    public function index() {
        $jpush = new JPushClient(C('JPUSH.APP_KEY'), C('JPUSH.MASTER_SECRET'));
        $response = $jpush->push()
            ->setPlatform('all')
            ->addAllAudience()
            ->setNotificationAlert('hello tp3.2')
            ->send();
        print_r($response);
    }
}

在浏览器中运行一下(命令行下也是一样的效果),

test

其结果天然不言而喻,相信有很多开发者都遇到过这个错误

我也很绝望啊

那么问题来了,这个时候到底遇到了什么问题呢?

因为是经过 Composer 安装的插件,其安装目录并非在 ThinkPHP 的系统级 vendor 目录下面(tp-demo/ThinkPHP/Library/Vendor)而是在应用根目录下面的 vendor 目录。同时 ThinkPHP 约定全部第三方框架的类库文件统一放到系统的 Vendor 目录下面。因此不管是使用 import 仍是 vendor 都没法或者说都很难去解决根目录下类库的自动/手动加载问题。

其实使用了 Composer 以后这就再也不是 ThinkPHP 的问题了,这就须要从 Composer 的文档中寻求答案了:

对于库的自动加载信息,Composer 生成了一个 vendor/autoload.php 文件。你能够简单的引入这个文件,你会获得一个免费的自动加载支持。
require 'vendor/autoload.php';
这使得你能够很容易的使用第三方代码

因此,其正确的作法是

<?php
namespace Home\Controller;
require 'vendor/autoload.php';

use Think\Controller;
use JPush\Client as JPushClient;

class IndexController extends Controller {
    public function index() {
        $jpush = new JPushClient(C('JPUSH.APP_KEY'), C('JPUSH.MASTER_SECRET'));
        $response = $jpush->push()
            ->setPlatform('all')
            ->addAllAudience()
            ->setNotificationAlert('hello tp3.2')
            ->send();
        print_r($response);
    }
}

只须要再添加一行(注意上面代码的第 2 行 require 'vendor/autoload.php';),而后在命令行运行一下:

result

若是结果出现相似于 Errorcode 1011:cannot find user by this audience 的问题,那么恭喜你,你的集成是成功的,可是有一个小小的问题,相关解决方法请参见极光社区的相关帖子

六. 全局自动加载

能够看到在这个类中使用了 JPush 的部分功能,因此是须要在类的上面 require 'vendor/autoload.php';,那么一样的若是须要使用七牛提供的服务呢?

若是是一样使用 Composer 安装的七牛的 SDk ,那么什么都不用管(由于 vendor/autoload.php 这个文件里面已经在安装七牛的时候加载了七牛的类库),直接跟着 use 语句:

use Qiniu\Storage\UploadManager;
use Qiniu\Auth;

若是是在另外一个 Controller 类中使用极光推送服务呢?
require 'vendor/autoload.php'; 这个在相应的 Controller 中是必须的。

可是能够在应用入口文件处添加 require 'vendor/autoload.php';这样就能够全局自动加载 Composer 安装的第三方类库,而后就能够删除全部其余地方的 require 'vendor/autoload.php';

也就是说

// 文件:tp-demo/index.php
...
// 定义应用目录
define('APP_PATH', './Application/');

require 'vendor/autoload.php';    // 注意位置必定要在 引入ThinkPHP入口文件 以前

// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';

// 亲^_^ 后面不须要任何代码了 就是如此简单
// 文件:tp-demo/Application/Home/Controller/IndexController.class.php
<?php
namespace Home\Controller;

// require 'vendor/autoload.php';   此行删除

use Think\Controller;
use JPush\Client as JPushClient;
...

这样子作也是可行的,而且在须要使用到相关的类库的时候能够直接使用,这就是 Composer 自动加载带来的好处。

不使用 Composer

一. 获取 ThinkPHP

官网下载(完整版): http://www.thinkphp.cn/down/framework.

从下图能够看到不一样的安装方式其目录结构是彻底同样的,不过要我选我确定选择使用 composer 安装的方式。什么!你说你不知道什么是 Composer

目录结构

二. 初次运行 ThinkPHP

$ cd thinkphp_3.2.3_full && php -S 127.0.0.1:4000
其他同上

三. 获取 JPush PHP Api Client 官方插件

项目地址:https://github.com/jpush/jpush-api-php-client

获取安装文件包有两种方式:

  • 使用 git 下载最新发布的 tag 的源代码 $ git clone -b 'v3.5.11' --single-branch --depth 1 https://github.com/jpush/jpush-api-php-client.git ThinkPHP/Library/Vendor/jpush
  • 项目 Release 页面 浏览器下载压缩包,解压以后放到 ThinkPHP/Library/Vendor/ 目录下。

注意:

这里须要注意的是使用 Composer 安装的时候第三方包是默认放在项目根目录下面的 vendor 目录下,而手动下载的时候却能够放在 ThinkPHP/Library/Vendor 目录下。

四. 配置 JPush

同上

五. 测试 JPush

若是要加载第三方类库,包括不符合命名规范和后缀的类库,以及没有使用命名空间或者命名空间和路径不一致的类库,或者你就是想手动加载类库文件,咱们均可以经过手动导入的方式加载。

<?php
namespace Home\Controller;

Vendor('jpush.autoload');
use JPush\Client as JPushClient;

use Think\Controller;

class IndexController extends Controller {
    public function index() {
        $jpush = new JPushClient(C('JPUSH.APP_KEY'), C('JPUSH.MASTER_SECRET'));
        $response = $jpush->push()
            ->setPlatform('all')
            ->addAllAudience()
            ->setNotificationAlert('hello tp3.2')
            ->send();
        print_r($response);
    }
}

六. 全局自动加载

不使用 Composer 的话,因为第三方类库不必定符合 ThinkPHP 的命名和后缀规范,因此没法作到第三方类库的全局自动加载,因此使用比较多的第三方类库 Composer 的优越性就体现出来了。


因为本人水平有限,此文不免出现一些错误或者不许确或者表达很差的地方,若有任何不对,恳请批评指正。

做者:Helperhaps - 极光
原文:ThinkPHP 3.2.x 集成极光推送指北
知乎专栏:极光日报

相关文章
相关标签/搜索