Drupal 7 开发内部培训资料, 分头诗人

d8的目录结构、自动加载及使用自动加载的方式加载第三方库

猪跑啦独家原创专稿,欢迎您转载本文,转载请注明来源。
标签: drupal8

上周没写,主要是忙了点

d8的目录结构已经有很多人都说了,不在重复他们说过的东西了,只说几个自己的东西,而自己这些都用到了drupal的自动加载

回顾下上次说的那一部分

//看着这行代码
$autoloader = require_once 'autoload.php';
//打开文件,后又是一个包含,继续打开
return require __DIR__ . '/vendor/autoload.php';
 
//注意composer,这个东西,这是一个php管理工具
<?php
 
// autoload.php @generated by Composer
 
require_once __DIR__ . '/composer' . '/autoload_real.php';
 
return ComposerAutoloaderInitDrupal8::getLoader();

d8使用了composer进行自动加载。

composer 这个php管理工具有很多框架都在使用,yii2,d8,symfony等等都在用。

这个自动加载有5种方式,如果你添加了一个新的类库,可以使用其中任意一种,这4种方式分别为class_map,files,namespace,psr4.对应composer文件夹下的autoloder_*.php文件

我只熟悉prs4,其他的没仔细看,有兴趣的朋友看了,可以给我讲讲

psr4是一种标准与其对应的是之前的psr0标准,psr4定义存放目录的方式为,当然这些也没有什么意义,可以作为了解内容。

vendor/  
    vendor_name/  
        package_name/  
            src/  
                ClassName.php       # Vendor_Name\Package_Name\ClassName  
            tests/  
                ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest 

转回话题那么我想引入一个第三方类库怎么搬,方法很简单,我这里以一个支付宝面对面支付(不是即及时到帐)的sdk类库作为列子,改类库是在支付宝官网下载,里面的配置已经配置好,我在外层放了一个pay文件夹,为方便以后添加微信支付、银行卡快捷支付等,能够统一管理,目录结构如下

打开d8/vendor/composer/autoload_psr4.php最后为数组添加两对键值,为啥添加两个呢?因为这个支付宝的sdk并不是psr4规范的

    'pay\\alipay_sdk\\' => array($vendorDir . '/pay/alipay_sdk'),
    'pay\\alipay_sdk\\aop\\request\\' => array($vendorDir . '/pay/alipay_sdk/aop/request'),

哦,对了,支付宝sdk的每个文件都需要在每一个类文件的上面添加一个命名空间,因为支付宝的这个sdk没有使用命名空间

命名空间的规则是键值,其中\\号是进行了转意,例如命名命名空间是pay\alipay_sdk,文件位置是vendor/pay/alipay_sdk/F2fpay.php(类名与文件名相同)

<?php
//定义了namespace
namespace pay\alipay_sdk;
//这三个require支付波改文件原来有的,我也就没有动
require_once 'AopSdk.php';
require_once 'function.inc.php';
require 'config.php';

use pay\alipay_sdk\aop\request\AlipayTradePrecreateRequest;
use pay\alipay_sdk\aop\request\AlipayTradeQueryRequest;
class F2fpay {
	
	
	public function barpay($out_trade_no, $auth_code, $total_amount, $subject) {
		
		$biz_content="{\"out_trade_no\":\"" . $out_trade_no . "\",";
		$biz_content.="\"scene\":\"bar_code\",";
		$biz_content.="\"auth_code\":\"" . $auth_code . "\",";
		$biz_content.="\"total_amount\":\"" . $total_amount
		. "\",\"discountable_amount\":\"0.00\",";
		$biz_content.="\"subject\":\"" . $subject . "\",\"body\":\"test\",";
		$biz_content.="\"goods_detail\":[{\"goods_id\":\"apple-01\",\"goods_name\":\"ipad\",\"goods_category\":\"7788230\",\"price\":\"88.00\",\"quantity\":\"1\"},{\"goods_id\":\"apple-02\",\"goods_name\":\"iphone\",\"goods_category\":\"7788231\",\"price\":\"88.00\",\"quantity\":\"1\"}],";
		$biz_content.="\"operator_id\":\"op001\",\"store_id\":\"pudong001\",\"terminal_id\":\"t_001\",";
		$biz_content.="\"timeout_express\":\"5m\"}";
		
		echo $biz_content;
		
		$request = new AlipayTradePayRequest();
		$request->setBizContent ( $biz_content );
		$response = aopclient_request_execute ( $request );
		
		
		
		return $response;
	}
	
	
	public function qrpay($out_trade_no,  $total_amount, $subject) {
		
		$biz_content="{\"out_trade_no\":\"" . $out_trade_no . "\",";
		$biz_content.="\"total_amount\":\"" . $total_amount
		. "\",\"discountable_amount\":\"0.00\",";
		$biz_content.="\"subject\":\"" . $subject . "\",\"body\":\"test\",";
		$biz_content.="\"goods_detail\":[{\"goods_id\":\"apple-01\",\"goods_name\":\"ipad\",\"goods_category\":\"7788230\",\"price\":\"88.00\",\"quantity\":\"1\"},{\"goods_id\":\"apple-02\",\"goods_name\":\"iphone\",\"goods_category\":\"7788231\",\"price\":\"88.00\",\"quantity\":\"1\"}],";
		$biz_content.="\"operator_id\":\"op001\",\"store_id\":\"pudong001\",\"terminal_id\":\"t_001\",";
		$biz_content.="\"timeout_express\":\"5m\"}";
	
		//echo $biz_content;
	
		$request = new AlipayTradePrecreateRequest();
		$request->setBizContent ( $biz_content );
		$response = aopclient_request_execute ( $request );
	
	
	
		return $response;
	}
	
	
	public function query($out_trade_no) {	
		$biz_content="{\"out_trade_no\":\"" . $out_trade_no . "\"}";
		$request = new AlipayTradeQueryRequest();
		$request->setBizContent ( $biz_content );
		$response = aopclient_request_execute ( $request );
		return $response;
	}
	
	
	public function cancel($out_trade_no) {
		$biz_content="{\"out_trade_no\":\"" . $out_trade_no . "\"}";
		$request = new AlipayTradeCancelRequest();
		$request->setBizContent ( $biz_content );
		$response = aopclient_request_execute ( $request );
		return $response;
	}
	
	public function refund($trade_no,
			$refund_amount, $out_request_no) {
		$biz_content = "{\"trade_no\":\"". $trade_no . "\",\"refund_amount\":\""
						. $refund_amount
						. "\",\"out_request_no\":\""
								. $out_request_no
								. "\",\"refund_reason\":\"reason\",\"store_id\":\"store001\",\"terminal_id\":\"terminal001\"}";
		
		$request = new AlipayTradeRefundRequest();
		$request->setBizContent ( $biz_content );
		$response = aopclient_request_execute ( $request );
		return $response;
	}
}

以上代码里面的源码由于需求和环境等一些原因被我改过了,因为sdk里面之前包含了一些demo,而且demo还报错,我去掉了,ok下面让我们来测试下

发现报错 未找到类,好吧说明以上方法是错的,回头在弄

评论

分头诗人的头像

好文!!

tying的头像

但是经过测试发现以上方法是错的,正确的方式还需要探究