php - 如何在 Laravel 中加载自定义服务提供者

标签 php laravel laravel-5 laravel-4 composer-php

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

Learning 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 update 或其他东西时,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

所以我假设这与我根目录中的 composer.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"
    ]
}
}

现在似乎已经包含了 paypal 我不确定我需要添加什么才能被识别。我只需要初始化我的 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 vendor 文件夹并检查了它的 composer.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/"
    }
}
}

我知道我总是可以在根目录的 composer.json 中添加类似这样的东西

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

这将在我运行 composer dumpautoload 时起作用。但我不想要这种方法,我看到很多库,但没有一个库做过这样的事情。有什么方法可以加载我的服务提供商,而无需在根目录的 composer.json 下的自动加载中添加条目?如果我在 vendor 文件夹的 composer.json 上添加一些东西就可以了。但是我将如何实现呢?请帮忙解决这个问题。谢谢

最佳答案

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

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

但是,如果您仍想从 lib 文件夹加载您创建的类(同样,我不建议这样做),请将您的服务提供商类放入 lib/Paypal 而不是 lib。原因是这个类使用 PSR-0 类加载标准,你可以在 this answer on Stack Overflow 中看到关于 PSR-0 和 PSR-4 之间差异的清楚解释。 .

关于php - 如何在 Laravel 中加载自定义服务提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33062981/

相关文章:

mysql - HAVING 在 Laravel 中抛出错误,而不是在 PHPMyAdmin 中

php - Eloquent multiple where from date 字段 <= >=

提交表单后 PHP 重定向到另一个 URL

php - 如何在 PHP 中缓存 XML 文件?

php - 在 Laravel 4 中刷新所有缓存

php - 拉拉维尔 4 : Get all product attributes with relationship table

laravel - 如何更改laravel中的日期语言?

php - 使用 Laravel 从数据库加载数据

php - Yii 返回连接模型的属性

PHP:如何将子类 __construct() 参数传递给 parent::__construct()?