我正在尝试实现一个使用Stripe的计费接口。我已经创建了计费接口Stripe类,并使用服务提供商绑定了该接口。
我在尝试运行代码时收到一个未找到类的错误:
Container.php第737行中的ReflectionException:类Acme\Billing\StripeBilling不存在
我不知道问题是什么,我已经仔细检查了小问题,比如正确的案例等。
这是我使用过的代码:
app/Acme/Billing/BillingInterface.php
<?php
namespace AcmeBilling;
interface BillingInterface {
public function charge(array $data);
}
app/Acme/Billing/StripeBilling.php
<?php
namespace AcmeBilling;
use Stripe;
use Stripe_Charge;
use Stripe_Customer;
use Stripe_InvalidRequestError;
use Stripe_CardError;
use Exception;
class StripeBilling implements BillingInterface {
public function __construct()
{
Stripe::setApiKey(env('STRIPE_SECRET_KEY'))
}
public function charge(array $data)
{
try
{
return Stripe_Charge::create([
'amount' => 1000, // £10
'currency' => 'gbp',
'description' => $data['email'],
'card' => $data['token']
]);
}
catch(Stripe_CardError $e)
{
dd('card was declined');
}
}
}
app/Providers/BillingServiceProvider.php(更新版)
class BillingServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind('BillingBillingInterface', 'BillingStripeBilling');
}
}
BasketController.php(ADDED)
public function store(Request $request)
{
$billing = App::make('BillingBillingInterface');
return $billing->charge([
'email' => $request->email,
'stripe-token' => $request->token,
]);
我已经将AppProvidersBillingServiceProvider::class
添加到我的app.php
文件中,并更新了我的composer.json以包含Acme文件夹"Acme\": "app/"
您的问题看起来有两个方面:
-
composer.json
文件中的PSR-4自动加载定义不正确。如果你的Acme文件夹位于应用程序文件夹中,例如
/dir/project_root/app/Acme/Billing/BillingInterface.php
,那么你的composer.json定义应该是这样的:"psr-4": { "Acme\": "app/Acme" }
这是您收到的错误的根本原因,而不是Laravel特定的错误。自动加载器根本找不到您要的类,即使请求的完全限定类名是正确的。
-
您的接口和类没有正确绑定到容器(缺少命名空间的
Acme
部分)。因为您已经在
Acme
名称空间中定义了这两个名称空间,所以需要确保Acme存在于您的服务提供商定义中。所以你的服务提供商应该是这样的:class BillingServiceProvider extends ServiceProvider { public function register() { $this->app->bind('AcmeBillingBillingInterface', 'AcmeBillingStripeBilling'); } }
(或者,更好的是,使用
::class
语法来改进IDE支持。)在控制器
App::make('AcmeBillingBillingInterface')
中请求类时,还需要确保完全限定的类名是正确的。(无论如何,我建议使用依赖项注入而不是这种语法。)