ReflectionException:类StripeBilling不存在

时间:2015-11-29 16:44:42

标签: php laravel composer-php

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

1 个答案:

答案 0 :(得分:1)

你的问题看起来很双重:

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

    如果你的Acme文件夹位于app文件夹中,例如/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('Acme\Billing\BillingInterface', 'Acme\Billing\StripeBilling');
        }
    }
    

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

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