2016-01-07 10 views
5

Ich arbeite an einer Laravel 5 Anwendung und jetzt soll der Code der Anwendung in mehreren Laravel 5 Anwendungen wiederverwendet werden, weshalb ich ein Composer-Paket erstelle und dann möchte ich dieses Paket in beliebiger Anzahl installieren von Laravel 5 Anwendungen die gleiche Funktionalität zu haben und darüber zu bauen.Wie Laravel 5 Service Provider aus dem Anbieterpaket selbst zu installieren?

Ich bin neu bei der Entwicklung von Composer-Paketen und insbesondere bei der Einbindung von Paketen in Laravel 5 mithilfe von Dienstanbietern. Bisher habe ich gelernt, dass, wenn ich einen Dienstanbieter wie die Verwendung unten, ich in der Lage sein, die Routen in der Laravel 5-Anwendung zu verwenden:

<?php 

namespace Uppdragshuset\AO\Tenant; 

use Illuminate\Support\ServiceProvider; 

class TenantServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap the application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     // 
    } 

    /** 
    * Register the application services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     include __DIR__.'/routes.php'; 
    } 
} 

Nun, diese Arbeit zu machen, die ich benötige nur das Paket über Komponist in jede neue Laravel 5-Installation und dann brauche ich nur, um aktualisierte den Array-Anbieter in app.php mit diesem:

Uppdragshuset\AO\Tenant\TenantServiceProvider::class 

Dies macht Sinn für mich und funktioniert auch. Aber jetzt hat das Paket, das ich entwickle, auch eigene Abhängigkeiten und viele dieser Abhängigkeitspakete haben auch Laravel 5-Dienstanbieter, so dass ich sie alle manuell in die Laravel5-Installationen aufnehmen muss, damit sie funktionieren.

Aber ich denke, es muss eine Möglichkeit geben, diese abhängigen Dienstanbieter in dem Paket, das ich selbst erstelle, irgendwie zu registrieren, so dass ich nur den einen Provider, den ich oben erwähnt habe, registrieren muss. Das Problem ist, ich weiß nicht, wie ich das machen soll und kann nirgends eine ähnliche Referenz finden. Wie registriere ich mehrere Service Provider aus dem Composer-Paket selbst?

Antwort

6

So habe ich endlich herausgefunden, wie Sie abhängige Dienstleister aus dem Composer-Paket selbst registrieren.

Ich habe die wichtigsten TenantServiceProvider in meinem Paket, die Routen in die Hauptanwendung einhängen soll und ist auch verantwortlich für die Veröffentlichung von Migrationen, Konfigurationen und so weiter.

Es stellte sich heraus, dass ich alle abhängigen Service-Provider über den gleichen Anbieter registrieren können die register() Methode auf der App Fassade verwenden und sie in das Register Methode meiner Haupt TenantServiceProvider wie so nennen:

public function register() 
{ 
    include __DIR__.'/routes.php'; 

    App::register(RepositoryServiceProvider::class); 
    App::register(\Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class); 
} 

Auf diese Weise I muss nur die TenantServiceProvider im Provider-Array in der App.php-Konfigurationsdatei der Laravel-Anwendung registrieren. Wenn sie aufgerufen wird und die Registermethode aufgerufen wird, werden alle anderen Provider über die App::register()-Aufrufe registriert. Hoffe, das hilft jemandem.

+0

Ja, das ist der Weg zu gehen: Sie können Service-Provider innerhalb von Service-Providern registrieren. –

+0

Danke, ich habe es gerade geschafft, einen Laravel Service Provider zu überschreiben, indem ich '$ this-> app-> register()' aus meinem Paket verwende – myol

1

Sie können ein Paket composer.json Datei erstellen und fügen Sie die Abhängigkeiten in dort für das Paket selbst, also, wenn Sie Composer erfordern Autor/Paket wird es die Abhängigkeiten des Pakets betrachten und sie benötigen automatisch unten ist ein Beispiel für ich ziehe oft

"require": { 
    "php": ">=5.5.0", 
    "illuminate/console": "~5.0", 
    "illuminate/support": "~5.0", 
    "illuminate/cache": "~5.0" 

eine composer.json Voraussetzung für ein Paket können Sie die folgenden Boot-Methode fügen Sie Ihren Service-Provider veröffentlichen

public function boot() 
{ 
    $this->publishes([ 
     __DIR__ . '/config/configifyouhaveone.php' => config_path('pathtotheconfig.php') 
    ]); 
    AliasLoader::getInstance()->alias(
     'serviceprovidername', 
     'Namespace\Subfolder\PackageName\PackageFacade' 
    ); 
} 

nach, dass Sie benötigen pHP-Handwerker-Anbieter zu tun: veröffentlichen, so nicht für Holen Sie sich das

+0

Ich verstehe das. Ich mache das schon. Mein Problem liegt bei den Dienstleistern einiger dieser Pakete. Wo registrieren Sie die Dienstleister? – Rohan

+0

Ich habe gerade den Code überprüft Ich sah, dass Sie bereits da sind Werfen Sie einen Blick auf den folgenden Link [Beispiel für einen Laracasts-Dienstanbieter] (https://github.com/laracasts/PHP-Vars-To-Js-Transformer/blob/master /src/JavaScriptServiceProvider.php) @Rohan –