2014-02-05 6 views
10

Ich erstelle ein Paket für Laravel und ich habe das Benachrichtigungspaket (https://github.com/edvinaskrucas/notification) als eine Abhängigkeit für mein Paket definiert.Wie kann ich bei der Erstellung eines Laravel-Pakets den Dienstanbieter und Alias ​​von Abhängigkeitspaketen registrieren?

In /workbench/vendor/package/src/composer.json ich habe:

"require": { 
    "php": ">=5.3.0", 
    "illuminate/support": "4.1.*", 
    "edvinaskrucas/notification": "2.*" 
} 

ich dann den Service-Provider Registrierung in Service-Providers Register Methode meines Paket (nicht einmal sicher, ob dies die richtigen Weg, um dies zu tun) und der Alias ​​mit App :: Alias.

So in /workbench/vendor/package/src/Vendor/Package/PackageServiceProvider.php ich habe:

public function register() 
{ 
    App::register('Krucas\Notification\NotificationServiceProvider'); 
    App::alias('Notification','Krucas\Notification\Facades\Notification'); 
} 

Aber ich bin immer noch der Klasse „Benachrichtigung" nicht gefunden“Ausnahme erhalten, wenn sie versuchen, Verwenden Sie Notification :: info() in einem Controller oder Notification :: showAll() in einer Ansicht.

Wie registriere ich Dienstanbieter ordnungsgemäß für die Abhängigkeiten meines Pakets?

Antwort

32

Ich hatte das gleiche Problem. Ich hatte eine Abhängigkeit in einem Paket und wollte den Benutzer nicht mit diesen Abhängigkeiten belästigen, da es sich um eine Abhängigkeit in einer Abhängigkeit handelte. Das ist also die Lösung. Hoffe es wird dir helfen!

public function register() 
{ 
    /* 
    * Register the service provider for the dependency. 
    */ 
    $this->app->register('LucaDegasperi\OAuth2Server\OAuth2ServerServiceProvider'); 
    /* 
    * Create aliases for the dependency. 
    */ 
    $loader = \Illuminate\Foundation\AliasLoader::getInstance(); 
    $loader->alias('AuthorizationServer', 'LucaDegasperi\OAuth2Server\Facades\AuthorizationServerFacade'); 
    $loader->alias('ResourceServer', 'LucaDegasperi\OAuth2Server\Facades\ResourceServerFacade'); 
} 
+2

Nur fyi, es ist nicht notwendig, eine Instanz der AliasLoader-Klasse zu erhalten, da der Container eine Methode zum Hinzufügen von Aliasen hat. '$ this-> app-> alias()' funktioniert genauso :) https://github.com/laravel/framework/blob/5.2/src/Illuminate/Container/Container.php#L400 – samrap

+2

@samrap Die '$ this-> app-> alias()' funktionierte nicht für mich, aber der '$ loader-> alias()' tat. Das ist seltsam – boyd

+0

'$ this-> app-> alias()' Methode ist irreführend, es braucht nicht eine typische Fassade Alias-Definition als Argument, sondern eher das Ergebnis der Fassaden 'getFacadeAccessor()'. Oder so scheint es mir. – Shadetheartist

5

Sie können die alias() -Methode für die App verwenden, um einen Alias ​​zu registrieren, aber ich würde in Erwägung ziehen, dass Ihre Paketbenutzer Aliase und Dienstanbieter selbst im Installationsprozess registrieren. Es ist eine gute Möglichkeit, den externen Code, den Sie verwenden, zu verfolgen, und eine gute Möglichkeit, Komponenten herauszuziehen, um Dinge zu testen.

Persönliche Meinung natürlich. :)

Dayle

+1

Okay, danke. Hmmm, ich verstehe was du sagst. Ich habe noch nie gesehen, dass andere Pakete das tun (d. H. Ich musste nur einen Dienstanbieter und einen Alias ​​zu app/config/app.php hinzufügen, wenn ich ein Paket installiere, selbst wenn dieses Paket andere Abhängigkeiten hat). Verwenden diese Entwickler wahrscheinlich App :: register und App :: alias, anstatt dass der Benutzer sie in ihrer Konfiguration hinzufügen soll? – tprsn

+1

Ich bekomme nach dem Hinzufügen von App :: alias immer noch eine Notification-Klasse nicht gefunden Ausnahme (vorausgesetzt, ich verwende die richtige Syntax, googelte herum, kann aber keine Dokumentation zu App :: alias finden?). Ich habe meine ursprüngliche Frage aktualisiert. Was mache ich falsch? Liegt es daran, dass mein Controller im Paketnamespace ist? – tprsn

Verwandte Themen