2015-10-11 5 views
2

Я хотел был бы загрузить serviceprovider от моей папки поставщика. Я на самом деле добавил поставщик в мой проектКак загрузить пользовательский поставщик услуг в Laravel

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 так, что когда я бегу композитор обновления или что-то, что PayPalConfigServiceProvider скопирует файл конфигурации в папку myproject\config. Поэтому я добавил

'providers' => [ 
     Illuminate\Validation\ValidationServiceProvider::class, 
     Illuminate\View\ViewServiceProvider::class, 
     Illuminate\Html\HtmlServiceProvider::class, 

     PayPal\PayPalServiceProvider::class, 
] 

на config/app.php в массиве поставщиков. Но теперь, когда я пытаюсь запустить PHP ремесленника я получаю эту ошибку

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", 
    } 
} 

И это будет работать, когда я запустил композитор dumpautoload. Но я не хочу такого подхода, я вижу много библиотек, но не из них делал что-то вроде этого. Есть ли какой-нибудь подход, когда я могу загрузить свой сервисный сервис без добавления записи на автозагрузке под моим компоновым.json в корневом каталоге? Это нормально, если я добавлю что-то в композитор.json из папки поставщика. Но как я это сделаю? пожалуйста, помогите по этому поводу. Благодаря

+0

Каков путь к файлу 'PayPalServiceProvider.php'? Покажите также строку на 'config/app.php', где вы регистрируете своего поставщика услуг – Moppo

+0

Хорошо. Я добавлю это на вопрос –

+0

. В пакете неверная конфигурация, он должен использовать' psr-4' вместо 'psr-0' –

ответ

2

Вы не должны добавлять файлы в папку пакета.

Вы можете переместить свои файлы конфигурации в папку config и перенести поставщика услуг Paypal (я думаю, вы его сами напишите) в папку app/Providers и использовать пространство имен приложений для этого класса.

Однако, если вы все еще хотите, чтобы загрузить созданный класс из Lib папки (опять же, я не рекомендую, чтобы сделать это), поставить в сервисный класс поставщика в lib/Paypal вместо lib. Причина в том, что этот класс использует стандарт загрузки классов PSR-0, вы можете увидеть четкое объяснение разных PSR-0 и PSR-4 в this answer on Stack Overflow.

+1

Это объясняет больше, хотя я также люблю @Moppo ответить –

1

Если вы размещаете у поставщика услуг внутри папки поставщика вы должны сказать Laravel, где она есть, и, как вы сказали, поставив эту строку в composer.json:

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

будет делать это.

Во всяком случае, Остерегайтесь размещения кода в папке поставщика: это очень плохая практика, поскольку папка поставщика зарезервирована для внешних пакетов проекта. Вы можете и должны рассмотреть возможность размещения вашего поставщика услуг внутри вашей папки приложений, т.е.е: App\Providers\PayPalServiceProvider.php

и установить пространство имен, таким образом:

namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 

class PayPalServiceProvider extends ServiceProvider { 

//... 

} 

Таким образом, в вашем app.php вы можете установить:

App\Providers\PayPalServiceProvider::class, 

без добавления чего-либо в файле composer.json

0

Во-первых, пожалуйста, не пытайтесь изменить вещи в папке пакета (vendor), если вы не знаете, что делаете, оно генерируется и не должно включаться в VCS, например git.

Поэтому поставьте ваш провайдер услуг под app/Providers и определите его под App\Provider пространства имен.

Что касается вашего PaypalServiceProvider, ему должно быть присвоено полное имя класса App\Providers\PaypalServiceProvider и положить в my_project/app/Providers.

Если вы хотите создать пакет, вы должны узнать кое-что о Composer (getcomposer.org) и Packagist (packagist.org)

Secondary, о том, почему PaypalServiceProvider не может быть найден, вы должны узнать кое-что о PSR-4 (www.php-fig.org/psr/psr-4/).

Смежные вопросы