Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ReflectionException:类StripeBilling不存在_Php_Laravel_Composer Php - Fatal编程技术网

Php ReflectionException:类StripeBilling不存在

Php ReflectionException:类StripeBilling不存在,php,laravel,composer-php,Php,Laravel,Composer Php,我正在尝试实现一个使用Stripe的计费接口。 我已经创建了Billing接口、Stripe类,并使用服务提供商绑定了接口 尝试运行代码时,我收到一个类未找到错误: Container.php行737:Class中的ReflectionException Acme\Billing\StripeBilling不存在 我不知道问题是什么,我已经仔细检查了一些小问题,如正确的案例等 以下是我使用的代码: app/Acme/Billing/BillingInterface.php <?php

我正在尝试实现一个使用Stripe的计费接口。 我已经创建了Billing接口、Stripe类,并使用服务提供商绑定了接口

尝试运行代码时,我收到一个类未找到错误:

Container.php行737:Class中的ReflectionException Acme\Billing\StripeBilling不存在

我不知道问题是什么,我已经仔细检查了一些小问题,如正确的案例等

以下是我使用的代码:

app/Acme/Billing/BillingInterface.php

<?php 

namespace Acme\Billing;

interface BillingInterface {
    public function charge(array $data);
}
<?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');

        }

    }
}
BasketController.php(已添加)


我已将
App\Providers\BillingServiceProvider::class
添加到我的
App.php
文件中,并更新了我的composer.json以包含Acme文件夹
“Acme\\”:“App/”

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

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

    如果您的Acme文件夹位于app文件夹内,例如
    /dir/project\u root/app/Acme/Billing/BillingInterface.php
    ,则您的composer.json定义应如下所示:

    "psr-4": {
      "Acme\\": "app/Acme" 
    }
    
    class BillingServiceProvider extends ServiceProvider
    {
        public function register()
        {
            $this->app->bind('Acme\Billing\BillingInterface', 'Acme\Billing\StripeBilling');
        }
    }
    
    这是您收到的错误的根本原因,它不是特定于Laravel的错误。即使请求的完全限定类名正确,自动加载程序也无法找到您请求的类

  • 接口和类未正确绑定到容器(缺少命名空间的
    Acme
    部分)

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

    "psr-4": {
      "Acme\\": "app/Acme" 
    }
    
    class BillingServiceProvider extends ServiceProvider
    {
        public function register()
        {
            $this->app->bind('Acme\Billing\BillingInterface', 'Acme\Billing\StripeBilling');
        }
    }
    
    (或者更好地使用
    ::class
    语法来改进IDE支持。)

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


  • PSR-0还是PSR-4?如果是PSR-4,则路径错误。PSR-4从类名中删除前缀,剩余部分转换为路径-因此在搜索路径中没有“Acme”部分,但在您的路径中却是;更改我的提供者中的绑定,如
    $this->app->bind('Billing\BillingInterface','Billing\StripeBilling')
    返回一个
    类Acme\Billing\BillingInterface不存在
    而不是请检查更新的问题,如图所示更改代码后,我仍然得到原始错误。我已经更正了composer.json中的路径,但是
    $this->app->bind('Acme\Billing\BillingInterface',Acme\Billing\StripeBilling')是否奇怪不起作用,但
    $this->app->bind('Billing\BillingInterface','Acme\Billing\StripeBilling')是什么?我找不到BillingInterface。您可能在尝试注入计费服务(如控制器或其他服务)的任何位置请求不正确的命名空间。请确保您在使用BillingInterface或StripeBilling实现的任何地方都使用了完整、正确的命名空间(例如,
    Acme\Billing\BillingInterface
    )。感谢Cryode,这并不是说它会阻止我将此标记为答案,但您能给我一个如何使用依赖注入的示例吗?