在Laravel 5应用中全局传递默认Braintree网关的实现疑问
在Laravel 5中全局配置并传递Braintree网关
嘿,你的思路方向是对的,AppServiceProvider确实是配置这类全局服务的合适位置,但目前的写法还不够完善——你只是在boot方法里初始化了网关变量,这个变量只能在该方法的局部作用域使用,没法在应用的其他地方调用。我们可以通过Laravel的服务容器来优化,让整个应用都能便捷获取这个默认网关实例。
步骤1:将Braintree网关绑定到服务容器
建议在AppServiceProvider的register方法中完成服务注册(这个方法本来就是用于绑定服务到容器的,比boot更规范),代码如下:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Braintree_Gateway; class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // 绑定Braintree网关为单例,确保整个应用生命周期只有一个实例 $this->app->singleton(Braintree_Gateway::class, function ($app) { return new Braintree_Gateway([ 'environment' => env('BRAINTREE_ENVIRONMENT'), 'merchantId' => env('BRAINTREE_MERCHANT_ID'), 'publicKey' => env('BRAINTREE_PUBLIC_KEY'), 'privateKey' => env('BRAINTREE_PRIVATE_KEY'), ]); }); } /** * Bootstrap any application services. * * @return void */ public function boot() { Schema::defaultStringLength(191); // 原来的网关初始化代码可以移除了 } }
用singleton绑定的好处是:Laravel会在第一次请求时创建网关实例,之后整个应用重复使用同一个实例,避免不必要的资源消耗。
步骤2:在应用中使用网关
绑定完成后,你可以在应用的任何地方通过两种方式获取网关:
方式1:依赖注入(推荐)
在控制器、命令、甚至模型中,通过构造函数注入网关实例,Laravel会自动从服务容器中解析:
<?php namespace App\Http\Controllers; use Braintree_Gateway; class PaymentController extends Controller { protected $gateway; // 构造函数注入Braintree网关 public function __construct(Braintree_Gateway $gateway) { $this->gateway = $gateway; } public function processPayment() { // 使用网关调用Braintree的API,比如创建交易 $result = $this->gateway->transaction()->sale([ 'amount' => '19.99', 'paymentMethodNonce' => request('payment_method_nonce'), 'options' => [ 'submitForSettlement' => true ] ]); // 处理交易结果 if ($result->success) { // 交易成功逻辑 } else { // 交易失败逻辑 } } }
方式2:使用app()助手函数
如果在无法使用依赖注入的场景(比如视图、闭包中),可以直接用app()助手获取实例:
// 在视图或者任意PHP文件中 $gateway = app(Braintree_Gateway::class); $result = $gateway->customer()->create([ 'firstName' => 'John', 'lastName' => 'Doe' ]);
步骤3:完善环境变量配置
别忘了在你的.env文件中填写正确的Braintree配置信息:
# Braintree配置 BRAINTREE_ENVIRONMENT=sandbox # 生产环境改为production BRAINTREE_MERCHANT_ID=你的商户ID BRAINTREE_PUBLIC_KEY=你的公钥 BRAINTREE_PRIVATE_KEY=你的私钥
这样配置后,你的Braintree网关就可以在整个Laravel 5应用中轻松调用啦!
内容的提问来源于stack exchange,提问作者hightekjonathan
相关产品推荐
相关产品推荐

