Sehr gut getestet, optimiert und serienreif!
Wir haben die complexity
hinter den Kulissen in Angriff genommen, um Ihnen viel simplicity
zu bieten.
Standardmäßig in das Laravel-Debugbar-Paket integriert: Laravel Debugbar
composer require imanghafoori/laravel-heyman
PHP v7.0 oder höher
Laravel v5.1 oder höher
Hier sehen Sie ein gutes Beispiel unter:
https://github.com/imanghafoori1/council
Speziell diese Datei:
https://github.com/imanghafoori1/council/blob/master/app/Providers/AuthServiceProvider.php
Dies ist eine Abzweigung aus der Tutorial-Reihe von laracasts.com, die für die Verwendung des Heyman-Pakets umgestaltet wurde.
Zombie-HTTP-Anfrage =>
<= Laravel Heyman
Stellen Sie sich vor, Ihr Chef kommt zu Ihnen und sagt:
Hey man !!! When you visit the login form, You should be guest, Otherwise you get redirected to '/panel',
Schreiben Sie den Code für mich, gerade jetzt ... Aber denken Sie daran, dass Sie den aktuellen Code nicht berühren dürfen. Es ist sehr empfindlich und wir möchten nicht, dass Sie es manipulieren. Du könntest es kaputt machen.
Und Sie schreiben Code wie diesen in einer boot
-Methode eines Dienstanbieters, um die Wünsche Ihres Chefs umzusetzen.
Sie können Methoden wie diese mit einem Alias versehen, wenn Ihnen die standardmäßig bereitgestellte ausführliche Syntax nicht gefällt.
Alias-Situationen (z. B. whenYouMakeView
zum view
)
Alias-Bedingungen (z. B. youShouldBeGuest
zu beGuest
)
Sie sollten dies in der Boot-Methode tun.
1- Auf diese Weise können Sie die Autorisierung und eine Menge Schutzcode vollständig vom Rest Ihres Anwendungscodes decouple
und an einer anderen Stelle platzieren. So werden Ihre Controller und Routen weniger überfüllt und Sie verfügen über einen zentralen Ort, an dem Sie den Zugriff von Benutzern auf Ihre Anwendung einschränken oder eine Anforderungsvalidierung durchführen können.
2- Wenn Sie Ihren Code auf diese Weise schreiben, halten Sie sich tatsächlich an das berühmte Tell don't ask principle.
Sie sagen dem Framework, was in bestimmten Situationen zu tun ist, anstatt Informationen einzuholen und dann zu entscheiden, was zu tun ist.
Procedural code gets information then makes decisions. Object-oriented code tells objects to do things. — Alec Sharp
3- Dieser Ansatz ist besonders nützlich, wenn Sie beispielsweise ein Paket schreiben, das ACL benötigt, Sie Ihren Paketbenutzern aber erlauben möchten, ihre eigenen ACL-Regeln (oder Validierungsregeln) zu überschreiben und in Ihren Paketrouten anzuwenden ...
Und das wird möglich, wenn Sie Laravel-HeyMan für ACL verwenden. Die Benutzer können die Standardregeln problemlos aufheben und ihre bevorzugten ACL- oder Validierungsinhalte in einem regulären ServiceProvider neu schreiben.
Hey Mann, das ist erstaunliches Zeug!
// Dies ist im Paket geschrieben und befindet sich im Herstellerordner, daher können wir es nicht ändern.HeyMan::whenYouHitRouteName('myPackageRoute')->youShouldHaveRole(....;
Um dies zu überschreiben, verwenden wir die forget
-Methode in app/Providers/...
:
öffentliche Funktion boot() { // Hebt die aktuellen Regeln auf HeyMan::forget()->aboutRoute('myPackageRoute'); // Neue Regeln nach Paketbenutzer hinzufügen. HeyMan::whenYouHitRouteName('myPackageRoute')-> ... }
Sie benötigen keinen Spickzettel.
Die
Auto-completion
wird vollständig unterstützt.
Heyman::
-Anrufe hinstellen?Sie können sie in
boot
-MethodeAuthServiceProvider.php
(oder einen anderen Dienstanbieter) einfügen.
Sie sollten die folgende Methode der HeyMan Facade-Klasse aufrufen.
use ImanghafooriHeyManFacadesHeyMan;// oruse HeyMan; // <--- Alias
Auch hier empfehlen wir den Besuch dieser Datei:
Funktionierende Heyman-Beispielregeln
HeyMan:: (Situation) -> (Bedingung) -> sonst() -> (Reaktion) ;
HeyMan::whenYouVisitUrl(['/welcome', '/home'])->... // Sie können ein ArrayHeyMan::whenYouVisitUrl('/admin/*')->... // oder ein Match by übergeben Platzhalter
HeyMan::whenYouSendPost('/article/store')-> ... HeyMan::whenYouSendPatch('/article/edit')-> ... HeyMan::whenYouSendPut('/article/edit')-> ... HeyMan::whenYouSendDelete('/article/delete')-> ...
HeyMan::whenYouHitRouteName('welcome.name')->... // Für RoutennamenHeyMan::whenYouHitRouteName('welcome.*')->... // oder Übereinstimmung per Platzhalter
HeyMan::whenYouCallAction('HomeController@index')->... HeyMan::whenYouCallAction('HomeController@*')->... // oder Übereinstimmung per Platzhalter
HeyMan::whenYouMakeView('article.editForm')->... // akzeptiert auch ein Array HeyMan::whenYouMakeView('article.*')->... // Sie können eine Gruppe von Ansichten ansehen
Eigentlich bezieht es sich auf den Moment, in dem view('article.editForm')
ausgeführt wird.
HeyMan::whenEventHappens('myEvent')->...
Eigentlich bezieht es sich auf den Moment, in dem event('myEvent')
ausgeführt wird.
HeyMan::whenYouSave(AppUser::class)->... HeyMan::whenYouFetch(AppUser::class)->... HeyMan::whenYouCreate(AppUser::class)->... HeyMan::whenYouUpdate(AppUser::class)->... HeyMan::whenYouDelete(AppUser::class)->...
Eigentlich bezieht es sich auf den Moment, in dem eloquent seine internen Ereignisse auslöst, wie zum Beispiel: (Speichern, Löschen, Erstellen, ...)
HeyMan:: (Situation) -> (Bedingung) -> sonst() -> (Reaktion) ;
Nachdem die Situation erwähnt wurde, ist es an der Zeit, den Zustand zu erwähnen.
// definiere GateGate::define('hasRole', function(){...});
Dann können Sie das Tor nutzen:
HeyMan::whenYouVisitUrl('/home')->thisGateShouldAllow('hasRole', 'editor')->otherwise()->...;
Eine Schließung als Tor passieren:
$gate = function($user, $role) {/// einige Logikreturn true; } HeyMan::whenYouVisitUrl('/home')->thisGateShouldAllow($gate, 'editor')->otherwise()->...;
HeyMan::whenYouVisitUrl('/home')-> youShouldBeGuest() ->otherwise()->...; HeyMan::whenYouVisitUrl('/home')-> youShouldBeLoggedIn() ->otherwise()->...;
Closure
, Method
oder Value
:HeyMan::whenYouVisitUrl('home')->thisMethodShouldAllow('someClass@someMethod', ['param1' => 'value1'])->otherwise()->...; HeyMan::whenYouVisitUrl('home')->thisClosureShouldAllow( function($a) { ... }, ['param1'] ) ->otherwise()->...; HeyMan::whenYouVisitUrl('home')->thisValueShouldAllow( $someValue )->otherwise()->...;
HeyMan::whenYouHitRouteName('articles.store')->yourRequestShouldBeValid(['title' => 'required', 'body' => 'required', ]);
Sie können die Daten auch vor der Validierung ändern, indem Sie beforeValidationModifyData()
aufrufen.
$modifier = function ($data) { // entfernt das „@“-Zeichen vor der Validierung aus dem „Namen“. $data['name'] = str_replace('@', '', $data['name']); $data zurückgeben; } HeyMan::whenYouHitRouteName('welcome.name') ->yourRequestShouldBeValid(['name' => 'required']) ->beforeValidationModifyData($modifier);
Sie können auch irgendwo in Ihrem Anwendungscode einige Prüfpunkte deklarieren:
HeyMan::checkPoint('MyLane');
Und legen Sie einige Regeln dafür fest
HeyMan::whenYouReachCheckPoint('MyLane')->youShouldHaveRole('Zombie')-> ...
HeyMan::whenYouVisitUrl('home')->always()-> ... HeyMan::whenYouVisitUrl('home')->sessionShouldHave('key1')->...
Sie können auch die Methoden „ always
“ und „ sessionShouldHave
“ verwenden:
HeyMan::whenYouVisitUrl('home')->always()-> ... HeyMan::whenYouVisitUrl('home')->sessionShouldHave('key1')->...
Sie können die Bedingungen erweitern und neue Methoden wie folgt in die Heyman-API einführen:
// Platzieren Sie diesen Code:// In der `boot`-Methode Ihres DienstanbietersHeyMan::condition('youShouldBeMan', function () { return function () { return auth()->user() && auth()-> user()->gender === 'Man'; }; });// oder HeyMan::condition('youShouldBeMan', 'AppSomeWhereSomeClass@someMethod');
Dann können Sie es so verwenden:
HeyMan::whenYouVisitUrl('home')->youShouldBeMan()-> ...
Schön, nicht wahr?!
HeyMan:: (Situation) -> (Bedingung) -> sonst() -> (Reaktion) ;
HeyMan::whenSaving(AppUser::class)->thisGateShouldAllow('hasRole', 'editor')->otherwise()->weDenyAccess();
Bei Bedarf wird eine AuthorizationException
ausgelöst
HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->redirect()->to(...) ->with([...]); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->redirect()->route(...) ->withErrors(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->redirect()->action(...) ->withInput(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->redirect()->intended(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->redirect()->guest(...);
Tatsächlich ähnelt die Redirect-Methode hier sehr der redirect()
Hilfsfunktion von Laravel.
$msg = 'Meine Nachricht'; HeyMan::whenYouVisitUrl('/login') ->youShouldBeGuest() ->sonst() ->weThrowNew(AuthorizationException::class, $msg);
HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->abort(...);
Der Aufruf dieser Funktionen generiert genau die gleiche Antwort wie der Aufruf über die Hilfsfunktion response()
: return response()->json(...);
HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->response()->json(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->response()->view(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->response()->jsonp(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->response()->make(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->response()->download(...);
HeyMan::whenYouVisitUrl('/login')-> ... ->sonst() ->weRespondFrom('AppHttpResponsesAuthentication@guestsOnly');
Namespace AppHttpResponses;Klassenauthentifizierung {öffentliche Funktion GuestsOnly() {if (request()->expectsJson()) {return Response()->json(['error' => 'Unauthenticated.'], 401); }return restart()->guest(route('login')); } }
Hey Mann, siehst du? Wir haben hier nur eine HTTP-Antwort. So haben unsere Controller die Freiheit, mit den richtigen Situationen umzugehen und müssen sich keine Sorgen über außergewöhnliche Situationen machen.
Hallo Mann, vielleicht möchten Sie eine Methode aufrufen oder ein Ereignis auslösen, bevor Sie die Antwort zurücksenden. Sie können dies mit den Methoden afterCalling()
und afterFiringEvent()
tun.
HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->afterFiringEvent('explode')->response()->json(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->afterCalling('someclass@method1')->response()->json(...);
Sie können HeyMan-Prüfungen wie folgt deaktivieren (nützlich beim Testen):
HeyMan::turnOff()->eloquentChecks();.../// Sie können hier einige eloquente Modelle speichern.../// ohne Einschränkungen durch HeyMan-Regeln.... HeyMan::turnOn()->eloquentChecks();
Wenn Sie ein Problem finden oder eine bessere Möglichkeit haben, etwas zu tun, können Sie gerne ein Problem oder eine Pull-Anfrage eröffnen.
Wie immer, wenn Sie dieses Paket nützlich fanden und uns ermutigen möchten, es zu pflegen und daran zu arbeiten. Drücken Sie einfach die Sterntaste, um Ihr Einverständnis zu erklären.
Ein minimales, aber leistungsstarkes Paket, das Ihren Laravel-Apps eine bessere Struktur und Caching-Möglichkeit bietet.
https://github.com/imanghafoori1/laravel-widgetize
Ein minimales, aber leistungsstarkes Paket, das Ihnen die Möglichkeit gibt, Ihre Controller umzugestalten.
https://github.com/imanghafoori1/laravel-terminator
Sie können sich nur in der lokalen Umgebung mit einem beliebigen Passwort anmelden.
https://github.com/imanghafoori1/laravel-anypass
Es überprüft automatisch Ihre Laravel-Anwendung ( neu )
https://github.com/imanghafoori1/laravel-microscope
Great spirits have always encountered violent opposition from mediocre minds. "Albert Einstein"