我正在尝试实现一个使用Stripe的Billing接口。 我创建了Billing接口,Stripe类,并使用服务提供程序绑定了接口。
尝试运行代码时收到Class not found错误:
Container.php第737行中的ReflectionException:Class Acme \ Billing \ StripeBilling不存在
我无法弄清问题是什么,我已经仔细检查了一些小问题,例如正确的案例等。
以下是我使用的代码:
应用/ Acme公司/结算/ BillingInterface.php
<?php
namespace Acme\Billing;
interface BillingInterface {
public function charge(array $data);
}
应用/ Acme公司/结算/ StripeBilling.php
<?php
namespace Acme\Billing;
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('Billing\BillingInterface', 'Billing\StripeBilling');
}
}
BasketController.php(已添加)
public function store(Request $request)
{
$billing = \App::make('Billing\BillingInterface');
return $billing->charge([
'email' => $request->email,
'stripe-token' => $request->token,
]);
我已将App\Providers\BillingServiceProvider::class
添加到我的app.php
文件中,并更新了我的composer.json以包含Acme文件夹"Acme\\": "app/"
答案 0 :(得分:1)
你的问题看起来很双重:
composer.json
文件中的PSR-4自动加载定义不正确。
如果你的Acme文件夹位于app文件夹中,例如/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('Acme\Billing\BillingInterface', 'Acme\Billing\StripeBilling');
}
}
(或者,更好的是,使用::class
语法来改进IDE支持。)
在控制器中请求类时,您还需要确保完全限定的类名是正确的:App::make('Acme\Billing\BillingInterface')
。 (无论如何,我建议使用依赖注入而不是这种语法。)