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 集成極光推送指北
知乎專欄:極光日報

相關文章
相關標籤/搜索