ReflectionException:类StripeBilling不存在



我正在尝试实现一个使用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/"

您的问题看起来有两个方面:

  1. composer.json文件中的PSR-4自动加载定义不正确。

    如果你的Acme文件夹位于应用程序文件夹中,例如/dir/project_root/app/Acme/Billing/BillingInterface.php,那么你的composer.json定义应该是这样的:

    "psr-4": {
      "Acme\": "app/Acme" 
    }
    

    这是您收到的错误的根本原因,而不是Laravel特定的错误。自动加载器根本找不到您要的类,即使请求的完全限定类名是正确的。

  2. 您的接口和类没有正确绑定到容器(缺少命名空间的Acme部分)。

    因为您已经在Acme名称空间中定义了这两个名称空间,所以需要确保Acme存在于您的服务提供商定义中。所以你的服务提供商应该是这样的:

    class BillingServiceProvider extends ServiceProvider
    {
        public function register()
        {
            $this->app->bind('AcmeBillingBillingInterface', 'AcmeBillingStripeBilling');
        }
    }
    

    (或者,更好的是,使用::class语法来改进IDE支持。)

    在控制器App::make('AcmeBillingBillingInterface')中请求类时,还需要确保完全限定的类名是正确的。(无论如何,我建议使用依赖项注入而不是这种语法。)

相关内容

  • 没有找到相关文章

最新更新