yii2 引入第三方类库

2019-09-02 16:13:20 浏览数 (1)

在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的自动加载器,不信你看看是不是有这么一行代码

代码语言:javascript复制
require(__DIR__ . '/../../vendor/autoload.php');

so,你懂了么?

官方自带的加载器

但是,实际上却有一部分不小的比例的人总是抱怨,composer安装不了,使用国内镜像也卡着不动,怎么破?我可不可以直接手动从github上下载使用?

当然可以。我们还以上面的Mailer为例,该类的命名方式符合psr-4标准,因此我们可以使用yii2自带的加载器来加载。

首先我们手动从github上下载,然后把下载下来的压缩包解压缩后放到你的vendor/bailangzhan/ 目录下,并重命名为 yii2-swiftmailer,现在vendor/bailangzhan下的目录结构是这样的

代码语言:javascript复制
├─yii2-swiftmailer
│      composer.json
│      LICENSE
│      Mailer.php
│      README.md

注意我们没有使用composer安装哦。

我们注意到Mailer的命名空间是bailangzhan,所以我们在应用的config/main.php文件中配置

代码语言:javascript复制
  1. 'aliases' => [
  2. '@bailangzhan' => '@vendor/bailangzhan',
  3. ],

aliases同components同级,位置不要放错。

现在你只需要像下面这样操作Mailer就好

代码语言:javascript复制
$mailer = new bailangzhanMailer(bailangzhanMailer::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文件之前添加下面一行代码

代码语言:javascript复制
require(__DIR__ . '/../vendor/alidayu/TopSdk.php');

因为没有具体的命名空间,所以在代码中new阿里大于类库中的类时,要在类名前面添加反斜杠

如阿里大于可以像下面这样使用

代码语言:javascript复制
  1. $c = new TopClient;
  2. $c ->appkey = $appkey ;
  3. $c ->secretKey = $secret ;
  4. $req = new AlibabaAliqinFcSmsNumSendRequest;
  5. $req ->setExtend( "" );
  6. $req ->setSmsType( "normal" );
  7. $req ->setSmsFreeSignName( "" );
  8. $req ->setSmsParam( "" );
  9. $req ->setRecNum( "13000000000" );
  10. $req ->setSmsTemplateCode( "" );
  11. $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下载后放置在frontendvendoralipay 目录,我们可以这样使用

  1. require_once(Yii::getAlias('@frontend')."/vendor/alipay/alipay.config.php");
  2. require_once(Yii::getAlias('@frontend')."/vendor/alipay/lib/alipay_submit.class.php");
代码语言:javascript复制
同样,我们使用alipay包下面的类比如AlipaySubmit时,仍然需要在类的前面添加斜杠 

0 人点赞