如何在Laravel

时间:2015-10-11 08:27:26

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

我想从我的vendor文件夹加载serviceprovider。我实际上已将此供应商添加到我的项目中

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,
]

在providers数组下的config / app.php上。但现在当我尝试运行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供应商文件夹并检查了它的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时,这将有效。但我不希望这种方法我看到很多图书馆,但他们没有做过这样的事情。是否有任何方法可以加载我的serviceprovider,而无需在我的composer.json根目录下的autoload上添加条目?如果我在vendor文件夹的composer.json上添加一些内容,那就没关系了。但是我将如何实现这一目标呢?请帮忙。感谢

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

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

会这样做。

无论如何,小心将代码放在供应商文件夹中:这是一种非常糟糕的做法,因为供应商文件夹是为progect的外部包保留的。您可以而且应该考虑将您的服务提供商放在您的App文件夹中,即:App\Providers\PayPalServiceProvider.php

以这种方式设置命名空间:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class PayPalServiceProvider extends ServiceProvider {

//... 

}

这样在您的app.php中就可以设置:

App\Providers\PayPalServiceProvider::class,

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

答案 2 :(得分:0)

首先,请不要尝试修改包文件夹(vendor)下的内容,除非您知道自己在做什么,它已经生成,不应该像git一样包含在VCS中。 / p>

请将您的服务提供商置于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/)