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

由于 ThinkPHP 3.2 已经支持了 Composer,因此本指南分为使用 Composer不使用 Composer 两部分。

快速去看不使用 Composer 的教程

使用 Composer

一. 获取 ThinkPHP

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

二. 初次运行 ThinkPHP

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

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

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

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

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

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

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

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

三. 获取 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 步。

编辑 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);
}
}

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

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

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

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

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

由于是通过 Composer 安装的插件,其安装目录并不是在 ThinkPHP 的系统级 vendor 目录下面(tp-demo/ThinkPHP/Library/Vendor)而是在应用根目录下面的 vendor 目录。同时 ThinkPHP 约定所有第三方框架的类库文件统一放到系统的 Vendor 目录下面。所以不论是使用 import 还是 vendor 都无法或者说都很难去解决根目录下类库的自动/手动加载问题。

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

所以,其正确的做法是

<?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';),然后在命令行运行一下:

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

如果结果出现类似于 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 自动加载带来的好处。

一. 获取 ThinkPHP

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

从下图可以看到不同的安装方式其目录结构是完全一样的,不过要我选我肯定选择使用 composer 安装的方式。什么!你说你不知道什么是 Composer

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

二. 初次运行 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 的优越性就体现出来了。


由于本人水平有限,此文难免出现一些错误或者不准确或者表达不好的地方,如有任何不对,恳请批评指正。

04-24 23:05