在web应用的开发模式下,我们不可避免的总会遇到对第三方api的集成。比如支付宝支付和微信支付的sdk,再或者是各种短信api比如阿里大于的sdk集成等等等等。像这种类似的第三方很多,但是由于各个平台的sdk的代码规范各有特色,对于新手,集成到我们的yii2中,似乎就是一件不那么容易实现的操作。其实很容易,我一说你就懂。
今天我们将分别以支付宝、阿里大于和一个支持psr-4规范的Mailer类库为例,来介绍下yii2集成第三方代码的4种方式。
composer包
如果第三方代码是发布的composer包,这个集成往往是最简单的。
以这个支持psr-4的Mailer为例,你只需要用composer require命令安装,安装好了就可以直接在代码中使用了(如果需要,点击Mailer的链接,使用规则参考github上面的说明)。
这是为什么呢,为什么你可以直接使用,你手动require了吗?
我们知道,composer是php的包管理器,它本身就提供了一个自动加载器,能把composer下载的类文件全部加载进来,也就是说,只要我们在项目中引入这个自动加载的类,所有composer安装的库都可以直接使用。
我知道你想说你没有做任何操作,确实你没有。这是因为我们早已经在应用的入口文件index.php内require了composer的自动加载器,不信你看看是不是有这么一行代码
require(__DIR__ . '/../../vendor/autoload.php');
so,你懂了么?
官方自带的加载器
但是,实际上却有一部分不小的比例的人总是抱怨,composer安装不了,使用国内镜像也卡着不动,怎么破?我可不可以直接手动从github上下载使用?
当然可以。我们还以上面的Mailer为例,该类的命名方式符合psr-4标准,因此我们可以使用yii2自带的加载器来加载。
首先我们手动从github上下载,然后把下载下来的压缩包解压缩后放到你的vendor/bailangzhan/ 目录下,并重命名为 yii2-swiftmailer,现在vendor/bailangzhan下的目录结构是这样的
├─yii2-swiftmailer
│ composer.json
│ LICENSE
│ Mailer.php
│ README.md
注意我们没有使用composer安装哦。
我们注意到Mailer的命名空间是bailangzhan,所以我们在应用的config/main.php文件中配置
'aliases' => [
'@bailangzhan' => '@vendor/bailangzhan',
],
aliases同components同级,位置不要放错。
现在你只需要像下面这样操作Mailer就好
$mailer = new \bailangzhan\Mailer(\bailangzhan\Mailer::TYPE_1, $message)
利用第三方自己的自动加载器
有同学又要说了,哎呀呀,你这上面说的都是带composer的类库,阿里大鱼木有composer,只有一个他自己的Autoloader类,这个怎么操作喃?
有Autoloader自动加载就显得非常方便了,一般情况下,我们只需要在入口文件内引入这个自带的Autoloader类,就可以在代码中直接使用了。使用方法参考下面我们要说的阿里大于的使用方法。
把阿里大于的sdk下载下来,我们放到应用的vendor/alidayu目录下面,即 frontend/vendor/alidayu/Autoloader.php,相关目录需要自己创建。
因为阿里大鱼的sdk比较特殊,需要在引入Autoloader之前定义一些常量,即TopSdk文件内定义的且该文件有require("Autoloader.php"),所以我们实际需要引入的则是这个文件。
在index.php文件中,require Yii.php文件之前添加下面一行代码
require(__DIR__ . '/../vendor/alidayu/TopSdk.php');
因为没有具体的命名空间,所以在代码中new阿里大于类库中的类时,要在类名前面添加反斜杠 \
如阿里大于可以像下面这样使用
$c = new \TopClient;
$c ->appkey = $appkey ;
$c ->secretKey = $secret ;
$req = new \AlibabaAliqinFcSmsNumSendRequest;
$req ->setExtend( "" );
$req ->setSmsType( "normal" );
$req ->setSmsFreeSignName( "" );
$req ->setSmsParam( "" );
$req ->setRecNum( "13000000000" );
$req ->setSmsTemplateCode( "" );
$resp = $c ->execute( $req );
吐槽支付宝,原生require
说到这些,有同学不禁要吐槽支付宝支付的sdk,什么玩意,啥都没有。怎么办,怎么使用?
composer虽然给我们提供了很多的便利,但是有了composer不能忘本呀。从上面的例子中我们可以看出,无论是composer的自动加载还是yii官方自带的自动加载抑或是第三方代码带的自动加载,其实质都是require所有相关的类。
既然如此,对于支付宝这种无composer,不满足psr-4,无Autoloader的“三无”第三方,我们只能使出“杀手锏”:手动require!
怎么个手动require呢?以支付宝sdk为例,我们可能用的最多的就是sdk包下面的alipay.config.php和alipay_submit.class.php,假设我们把支付宝的sdk下载后放置在frontend\vendor\alipay 目录,我们可以这样使用
require_once(Yii::getAlias('@frontend')."/vendor/alipay/alipay.config.php");
require_once(Yii::getAlias('@frontend')."/vendor/alipay/lib/alipay_submit.class.php");
同样,我们使用alipay包下面的类比如AlipaySubmit时,仍然需要在类的前面添加斜杠 \