首页 > 作文

ThinkPHP vendor 方法导入第三方类库

更新时间:2023-04-07 11:57:55 阅读: 评论:0

第三方类库

第三方类库指除了 thinkphp 框架、应用项目类库之外的其他类库,一般由第三方系统或产品提供,如 smarty、zend 等系统的类库等。

前面使用自动加载或 import 方法导入的类库,thinkphp 约定是以 .class.php 为后缀的,非这类的后缀,需要通过 import 的参数来控制。

但对第三类库,由于不会有此约定,其后缀只能认为是 php 。为了方便的引入其他框架和系统的类库,thinkphp 特意提供了导入第三方类库的功能。第三方类库统一放置在 thinkphp系统目录/vendor 下面,并且使用 vendor 方法导入。

vendor 方法

语法:

boolen vendor(class, baurl, ext)

参数说明:

参数    说明class    必须,表示要导入的类库,采用命名空间的方式。baurl    可选,表示导入的基础路径,省略的话系统采用 thinkphp系统目录/vendor 目录。ext    可选,表示导入的类库后缀,默认是 .php 。

与 import 方法的区别在于,vendor 方法默认的导入路径为 thinkphp系统目录/vendor 目录,默认后缀为 .php 。

个人经验分享:

当我们想在thinkphp中引入第三方扩展,而第三方扩展又没有按照thinkphp的规范在编写的时候时,就需要将第三方扩展放置到library/vendor目录下,当然,这是针对thinkphp 3.2而言,低版本则根据情况来看了。

然后需要在controller或function中使用第三方扩展时,就可以直接使用vendor()方法来进行引用了。

第三方类库目录结构:

在function函数中使用:

第一种方法:

vendor('phpqrcode.phpqrcode');


/** * 生成二维码 * @param  string  $url  url连接 * @param  integer $size 尺寸 纯数字 */function qrcode($url,$size=4){    vendor('phpqrcode.phpqrcode');    if (strpos($url, 'http')===fal) {        $url='http://'.$url;    }    qrcode::png($url,fal,qr_eclevel_l,$size,2,fal,0xffffff,0x000000);}


第二种方法:

 require './thinkphp/library/org/nx/class.phpmailer.php'; require './thinkphp/library/org/nx/class.smtp.php';


/** * 发送邮件 * @param  string $address 需要发送的邮箱地址 发送给多个地址需要写成数组形式 * @param  string $subject 标题 * @param  string $content 内容 * @return boolean       是否成功 */function nd_email($address,$subject,$content){    $email_smtp=c('email_smtp')体操运动员身高;    $email_urname=c('email_urname');    $email_password=c('email_password');    $email_from_name=c('emai韩国电影新世界l_from_name');    if(empty($email_smtp) || empty($email_urname) || empty($email_password) || empty($email_from_name)){        return array("error"=>1,"message"=>'邮箱配置不完整');    }    require './thinkphp/library/org/nx/class.phpmailer.php';    require './thinkphp/library/org/nx/class.smtp.php';    $phpmailer=new \phpmailer();    // 设置phpmailer使用smtp服务器发送email    $phpmailer->issmtp();    // 设置为html格式    $phpmailer->ishtml(true);    // 设置邮件的字符编码'    $phpmailer->chart='utf-8';    // 设置smtp服务器。    $phpmailer->host=$email_smtp;    // 设置为"需要验证"    $phpmailer->smtpauth=true;    // 设置用户名    $phpmailer->urname=$email_urname;    // 设置密码    $phpmailer->password=$email_password;    // 设置邮件头的from字段。    $phpmailer->from=$email_urname;    // 设置发件人名字中学生假期打工    $phpmailer->fromname=$email_from_name;    // 添加收件人地址,可以多次使用来添加多个收件人    if(is_array($address)){        foreach($a成长的烦恼英文版ddress as $addressv){            $phpmailer->addaddress($addressv);        }    }el{        $phpmailer->addaddress($address);    }    // 设置邮件标题    $phpmailer->subject=$subject;    // 设置邮件正文    $phpmailer->body=$content;    // 发送邮件。    if(!$phpmailer->nd()) {        $phpmailererror=$phpmailer->errorinfo;        return array("error"=>1,"message"=>$phpmailererror);    }el{        return array("error"=>0);    }}


第三种方法:

支付宝类库目录结构

vendor('alipay.alipaysubmit','','.class.php');

注意说明:vendor加载的默认后缀是.php的

参数一:必须,表示要导入的类库,采用命名空间的方式参数二:可选,表示导入的基础路径,省略的话系统采用 thinkphp系统目录/vendor 目录。参数三:可选,表示导入的类库后缀,默认是 .php 。

支付宝第三方案例代码:


/** * 跳向支付宝付款 * @param  array $order 订单数据 必须包含 out_trade_no(订单号)、price(订单金额)、subject(商品名称标题) */function alipay($order){    vendor('alipay.alipaysubmit','','.class.php');    // 获取配置    $config=c('alipay_config');    $data=array(        "_input_chart" => $config['input_chart'], // 编码格式        "logistics_fee" => "0.00", // 物流费用        "logistics_payment" => "ller_pay", // 物流支付方式ller_pay(卖家承担运费)、buyer_pay(买家承担运费)        "logistics_type" => "express", // 物流类型express(快递)、post(平邮)、ems(ems)        "notify_url" => $config['notify_url'], // 异步接收支付状态通知的链接        "out_trade_no" => $order['out_trade_no'], // 订单号        "partner" => $config['partner'], // partner 从支付宝商户版个人中心获取        "payment_type" => "1", // 支付类型对应请求时的 payment_type 参数,原样返回。固定设置为1即可        "price" => $order['price'], // 订单价格单位为元        // "price" => 0.01, // // 调价用于测试        "quantity" => "1", // price、quantity 能代替 total_fee。 即存在 total_fee,就不能存在 price 和 quantity;存在 price、quantity, 就不能存在 total_fee。 (没绕明白;好吧;那无视这个参数即可)        "receive_address" => '1', // 收货人地址 即时到账方式无视此参数即可        "receive_mobile" => '1', // 收货人手机号码 即时到账方式无视即可        "receive_name" => '1', // 收货人姓名 即时到账方式无视即可        "receive_zip" => '1', // 收货人邮编 即时到账方式无视即可        "return_url" => $config['return_url'], // 页面跳转 同步通知 页面路径 支付宝处理完请求后,当前页面自 动跳转到商户网站里指定页面的 http 路径。        "ller_email" => $config['ller_email'], // email 从支付宝商户版个人中心获取        "rvice" => "create_direct_pay_by_ur", // 接口名称 固定设置为create_direct_pay_by_ur        "show_url" => $config['show_url'], // 商品展示网址,收银台页面上,商品展示的超链接。        "subject" => $order['subject'] // 商品名称商品的标题/交易标题/订单标 题/订单关键字等    );    $alipay=new \alipaysubmit($config);    $new=$alipay->buildrequestpara($data);    $go_pay=$alipay->buildrequestform($new, 'get','支付');    echo $go_pay;}


图片版权授权

不过当我将phpmailer放在vendor目录下后,在本机运行得好好得,最近将程序上传到服务器上时,直接提示class ‘phpmailer’ not found然后又在本机运行,还是正确!通过前面这片博客可以知道,我是通过vendor('phpmailer.class#phpmailer');

这行代码将phpmailer引入的。既然提示找不到phpmailer类,说明没有被正确引入。这是为什么呢?

就粗略看了一下vendor()方法的源码,这才发现其实vendor()方法也就是对import()方法进行了一次参数组装,然后还是交给了import()方法处理。查看import()方法的源码又发现,在import()方法中,对于上面传入参数的解析其实就是将’.’替换成’/’,将’#’替换成了’.’,baurl则由vendor()方法自动补充上了,指向vendor目录。所以上面vendor()方法中的参数最终还是被解析成了如下目录:

library/vendor/phpmailer/class.phpmailer.php

而phpmailer的入口文件的实际目录地址为:

library/vendor/phpmailer/class.phpmailer.php

内容都一样的嘛!不过我用的是linux的服务器,所以对大小写是严格区分的,这样当然不能成功导入这个类。而解决办法就是将vendor()引入改为:

vendor(‘phpmailer.class#phpmailer’)

另外对于phpmailer使用时还要注意一点,phpmailer如果使用smtp方式发送邮件,需要php对fsockopen的支持,所以我们需要修改php.ini中disable_functions中将fscokopen删除,否则会出现运行错误:

fsockopen() has been disabled

通过phpmailer的errorinfo属性可以获取到!

本文发布于:2023-04-07 11:57:54,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/f2bc579f6b4a3b6016f6b4c4d33c08de.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:ThinkPHP vendor 方法导入第三方类库.doc

本文 PDF 下载地址:ThinkPHP vendor 方法导入第三方类库.pdf

标签:类库   第三方   方法   参数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图