以上,如果有条件,请关闭这个页面,然后升级至 ThinkPHP 5,如果由于各种各样的原因无法升级至 TP 5 ,请往下看。另外本指南使用环境为 Linux/Mac,若开发环境为 Windwos,则或许可能会有某些问题,如果有任何问题,欢迎在下方评论区留言讨论。
由于 ThinkPHP 3.2 已经支持了 Composer,因此本指南分为使用 Composer
和不使用 Composer
两部分。
使用 Composer
一. 获取 ThinkPHP
在工作目录下运行 $ composer create-project topthink/thinkphp tp-demo
二. 初次运行 ThinkPHP
$ cd tp-demo && php -S 127.0.0.1:4000
打开浏览器输入地址:127.0.0.1:4000,若结果如下则说明 ThinkPHP 3.2.3 一切 OK。
在命令行下运行一下,其输出是:
再回头看一下 Application 目录,可以看到自动生成了公共模块 Common、默认的 Home 模块和 Runtime 运行时目录(非模块):
三. 获取 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);
}
}
在浏览器中运行一下(命令行下也是同样的效果),
其结果自然不言而喻,相信有不少开发者都遇到过这个错误
那么问题来了,这个时候到底遇到了什么问题呢?
由于是通过 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';
),然后在命令行运行一下:
如果结果出现类似于 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
$ 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 的优越性就体现出来了。