如何在Laravel中加载自定义服务提供商


How to Load custom Service Provider in Laravel

我想从我的供应商文件夹加载一个服务提供商。我实际上把这个供应商添加到我的项目

学习Laravel PayPal SDK 现在在文件夹结构 下
vendor/
   - paypal/
        - rest-api-sdk-php/
            - config/
                 - paypal.php
            - docs/
            - lib/
                - PayPal/
                - PayPalConfigServiceProvider.php
            - sample/
            - test/
            - composer.json

正如你所看到的,我在供应商上添加了一些项目。我在config文件夹下添加了一个配置文件,即paypal.php,在lib文件夹下添加了PayPalConfigServiceProvider.php

服务提供商的全路径为my_project/vendor/paypal/rest-api-sdk-php/lib/PayPalConfigServiceProvider.php

现在我想添加PayPalConfigServiceProvider,以便当我运行composer更新或PayPalConfigServiceProvider将配置文件复制到myproject'config文件夹。所以我添加了

'providers' => [
      Illuminate'Validation'ValidationServiceProvider::class,
      Illuminate'View'ViewServiceProvider::class,
      Illuminate'Html'HtmlServiceProvider::class,
      PayPal'PayPalServiceProvider::class,
]

在config/app.php的providers数组下。但是当我尝试运行php artisan时,我得到了这个错误

PHP Fatal error:  Class 'PayPal'PayPalServiceProvider' not found in myproject/vendor/laravel/framework/src/Illuminate/Foundation/ProviderRepository.php

所以我认为这与我的作曲家有关。根目录下的Json文件,这是它的内容

{
"name": "laravel/laravel",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"type": "project",
"require": {
    "php": ">=5.5.9",
    "laravel/framework": "5.1.*",
    "illuminate/html": "^5.0",
    "doctrine/dbal": "^2.5",
    "paypal/rest-api-sdk-php": "*"
},
"require-dev": {
    "fzaninotto/faker": "~1.4",
    "mockery/mockery": "0.9.*",
    "phpunit/phpunit": "~4.0",
    "phpspec/phpspec": "~2.1"
},
"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App''": "app/"
    }
},
"autoload-dev": {
    "classmap": [
        "tests/TestCase.php"
    ]
}
}

似乎贝宝已经包括现在我不确定我需要添加什么才能被识别。我只需要初始化我的PayPalServiceProvider,以便运行这段代码

PayPalServiceProvider.php

namespace PayPal;
use Illuminate'Support'ServiceProvider;
class PayPalServiceProvider extends ServiceProvider {
/**
 * Register the service provider.
 *
 * @return void
 */
public function register()
{
    // TODO: Implement register() method.
}
public function boot()
{
    $this->mergeConfigFrom(__DIR__ . '../config/paypal.php', 'paypal');
}
}

我还检查了paypal供应商文件夹并检查了它的编写器。Json,这是内容

{
"name": "paypal/rest-api-sdk-php",
"description": "PayPal's PHP SDK for REST APIs",
"keywords": ["paypal", "payments", "rest", "sdk"],
"type": "library",
"license": "Apache2",
"homepage": "http://paypal.github.io/PayPal-PHP-SDK/",
"authors": [
    {
        "name": "PayPal",
        "homepage": "https://github.com/paypal/rest-api-sdk-php/contributors"
    }
],
"require": {
    "php": ">=5.3.0",
    "ext-curl": "*",
    "ext-json": "*"
},
"require-dev": {
    "phpunit/phpunit": "3.7.*"
},
"autoload": {
    "psr-0": {
        "PayPal": "lib/"
    }
}
}

我知道我总是可以在作曲器上添加这样的东西。在我的根目录

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App''": "app/",
        "PayPal''": "vendor/paypal/rest-api-sdk-php/lib",
    }
}

这将工作时,我运行composer dumpautolload。但我不想要这种方法,我看到很多库,但没有一个是这样做的。是否有任何方法,我可以加载我的服务提供商,而无需在我的作曲器下自动加载添加一个条目。Json在根目录?如果我在作曲家身上添加一些东西是可以的。供应商文件夹的Json。但是我要怎么做呢?请帮忙解决这个问题。由于

不应该将文件添加到包文件夹中。

你可以将你的配置文件移动到config文件夹,并将你的Paypal服务提供商(我认为你自己写的)移动到app/Providers文件夹,并使用你的应用程序命名空间。

但是,如果您仍然希望从lib文件夹加载创建的类(同样,我不建议这样做),请将您的服务提供者类放入lib/Paypal而不是lib中。原因是这个类使用PSR-0类加载标准,你可以在这个关于Stack Overflow的回答中看到关于PSR-0和PSR-4之间区别的清晰解释。

如果你把你的服务提供商放在你的供应商文件夹中,你必须告诉laravel它在哪里,并且,正如你所说,把这一行放在你的composer.json中:

"psr-4": {
        "App''": "app/",
        "PayPal''": "vendor/paypal/rest-api-sdk-php/lib",
    }

会这样做。

无论如何,小心不要把你的代码放在vendor文件夹中:这是一个非常糟糕的做法,因为vendor文件夹是为项目的外部包保留的。你可以,也应该考虑把你的服务提供商放在你的App文件夹里,比如:App'Providers'PayPalServiceProvider.php

并这样设置命名空间:

namespace App'Providers;
use Illuminate'Support'ServiceProvider;
class PayPalServiceProvider extends ServiceProvider {
//... 
}
这样你就可以在app.php中设置:
App'Providers'PayPalServiceProvider::class,

无需在composer.json文件中添加任何内容

首先,请不要试图修改包文件夹(vendor)下的东西,除非你知道你在做什么,它是生成的,不应该像git一样包含在VCS中。

所以把你的服务提供者放在app/Providers下,并在App'Provider命名空间下定义它。

对于您的PaypalServiceProvider,应该给它一个完整的类名App'Providers'PaypalServiceProvider,并放入my_project/app/Providers

如果你想创建一个包,你应该了解Composer (getcomposer.org)和Packagist (packagist.org)

其次,关于为什么无法找到PaypalServiceProvider,您应该了解PSR-4 (www.php-fig.org/psr/psr-4/)。