2013-12-20 20 views
6

Ich versuche Laravels Auth Guard Klasse um eine zusätzliche Methode zu erweitern, so dass ich Auth::myCustomMethod() am Ende aufrufen kann.Wie Laravel Auth Guard-Klasse zu erweitern?

Nach dem Dokumentationsabschnitt Extending The Framework bin ich fest, wie genau dies zu tun, weil die Guard-Klasse selbst keine eigenen IoC binding, die ich überschreiben könnte.

Hier einige Code demonstriert, was ich versuche zu tun: die Auth::myCustomMethod()

namespace Foobar\Extensions\Auth; 

class Guard extends \Illuminate\Auth\Guard { 

    public function myCustomMethod() 
    { 
     // ... 
    } 

} 

Nun, wie soll ich die erweiterte Klasse Foobar\Extensions\Auth\Guard verwendet werden anstelle des ursprünglichen Illuminate\Auth\Guard registrieren, so nennen ich bin in der Lage genauso wie zB Auth::check()?

Eine Möglichkeit wäre, die Auth Alias ​​in der app/config/app.php zu ersetzen, aber ich bin mir nicht sicher, ob dies wirklich der beste Weg ist, um dies zu lösen.

BTW: Ich benutze Laravel 4.1.

Antwort

8

Ich würde meinen eigenen UserProvider-Dienst erstellen, der die Methoden enthält, die ich möchte, und dann Auth erweitern.

Ich empfehle, einen eigenen Dienstanbieter zu erstellen, oder gerade die Auth-Klasse in einer der Startdateien (z. B. start/global.php) zu erweitern.

Auth::extend('nonDescriptAuth', function() 
{ 
    return new Guard(
     new NonDescriptUserProvider(), 
     App::make('session.store') 
    ); 
}); 

Dies ist eine gute tutorial you can follow to get a better understanding

Es gibt eine andere Methode, die Sie verwenden können. Es würde bedeuten, einen der derzeitigen Anbieter wie Eloquent zu erweitern.

class MyProvider extends Illuminate\Auth\EloquentUserProvider { 

    public function myCustomMethod() 
    { 
     // Does something 'Authy' 
    } 
} 

Dann könnten Sie auth wie oben, aber mit Ihrem benutzerdefinierten Anbieter erweitern.

\Auth::extend('nonDescriptAuth', function() 
{ 
    return new \Illuminate\Auth\Guard(
     new MyProvider(
      new \Illuminate\Hashing\BcryptHasher, 
      \Config::get('auth.model') 
     ), 
     \App::make('session.store') 
    ); 
}); 

Sobald Sie den Code implementiert haben Sie den Treiber in der auth.php Config-Datei ändern würde ‚nonDescriptAuth` zu verwenden.

+0

Dank f oder deine Antwort David! Ich hatte gehofft, dass es eine einfachere Methode gibt, als einen eigenen UserProvider zu erstellen, um die Guard-Klasse zu erweitern. Ich werde einige Zeit warten, um zu sehen, ob es andere Vorschläge gibt. –

+0

@HolgerWeis Ich habe in einer einfachen Methode hinzugefügt, um Auth mit dem aktuellen Eloquent-Treiber mit einer Erweiterung zu erweitern. Der 'Auth :: extend' Code sollte so funktionieren wie er ist. –

-7

Nur Art und Weise hinzuzufügen (und auch bestehende Funktionen ersetzen) ist Kopie in Ihrem Projekt Guard.php Datei und/Start in App erstellen/global.php add:

require app_path().'/models/Guard.php'; 

Of Natürlich ist es eine hässliche Methode, aber ich habe mehr als eine Stunde damit verbracht, alle Möglichkeiten zu testen [wie man in Session by Auth gespeicherte Dinge ändert] und endet immer mit einem Fehler: ... _construct der Klasse HSGuard benötigt den ersten Parameter, um 'UserProviderInterface' zu erhalten 'EloquentUserProvider' ...

+0

Sehr schlechte Lösung. Es funktioniert nicht wie Laravel. – Jithin