Très bien testé, optimisé et prêt pour la production !
Nous avons abordé beaucoup de complexity
en coulisses, pour vous offrir beaucoup de simplicity
.
Intégré au package laravel-debugbar prêt à l'emploi : laravel debugbar
composer require imanghafoori/laravel-heyman
PHP v7.0 ou supérieur
Laravel v5.1 ou supérieur
Ici vous pouvez voir un bon exemple à l'adresse :
https://github.com/imanghafoori1/council
Spécialement ce fichier :
https://github.com/imanghafoori1/council/blob/master/app/Providers/AuthServiceProvider.php
Il s'agit d'un fork issu du résultat de la série de didacticiels laracasts.com refactorisé pour utiliser le package Heyman.
Demande HTTP Zombie =>
<= Laravel Héman
Imaginez que votre patron vienne vers vous et vous dise :
Hey man !!! When you visit the login form, You should be guest, Otherwise you get redirected to '/panel',
Écrivez le code pour moi, tout de suite... Mais GARDEZ À L'ESPRIT que vous n'êtes pas autorisé à toucher au code actuel. il est très sensible et nous ne voulons pas que vous y altérez. Vous pouvez le casser.
Et vous écrivez du code comme celui-ci dans une méthode boot
d'un fournisseur de services pour mettre en œuvre ce que voulait votre patron.
Vous pouvez alias des méthodes comme celle-ci si vous n'aimez pas la syntaxe trop verbeuse fournie par défaut.
Situations d'alias (ex. whenYouMakeView
pour view
)
Conditions d'alias (ex. youShouldBeGuest
à beGuest
)
Vous devriez le faire dans la méthode de démarrage.
1- De cette façon, vous pouvez complètement decouple
l'autorisation et une grande partie du code de garde du reste de votre code d'application et le placer à un autre endroit. Ainsi, vos contrôleurs et routes deviennent moins encombrés et vous disposerez d'un endroit central où vous limiterez l'accès des utilisateurs à votre application ou effectuerez la validation des demandes.
2- En fait, lorsque vous écrivez votre code de cette manière, vous vous conformez au fameux Tell don't ask principle.
Vous dites au cadre quoi faire dans certaines situations plutôt que d'obtenir des informations et de décider quoi faire alors.
Procedural code gets information then makes decisions. Object-oriented code tells objects to do things. — Alec Sharp
3- Cette approche est particulièrement utile lorsque vous écrivez par exemple un package qui nécessite une ACL mais que vous souhaitez permettre aux utilisateurs de votre package de remplacer et d'appliquer leurs propres règles ACL (ou validation) dans vos routes de package...
Et cela devient possible lorsque vous utilisez laravel-HeyMan pour ACL. Les utilisateurs peuvent facilement annuler les règles par défaut et réécrire leurs éléments d'acl ou de validation préférés dans un ServiceProviders standard.
Hé mec, c'est un truc incroyable !
// Ceci est écrit dans le package et se trouve dans le dossier du fournisseur, nous ne pouvons donc pas y toucher.HeyMan::whenYouHitRouteName('myPackageRoute')->youShouldHaveRole(....;
Pour remplacer cela, nous utilisons la méthode forget
, dans app/Providers/...
:
fonction publique boot() { // Annule les règles actuelles HeyMan::forget()->aboutRoute('myPackageRoute'); // Ajout de nouvelles règles par utilisateur du package. HeyMan::whenYouHitRouteName('myPackageRoute')-> ... }
Vous n’avez besoin d’aucun aide-mémoire.
Auto-completion
IDE est entièrement prise en charge.
Heyman::
?Vous pouvez les placer dans la méthode
boot
AuthServiceProvider.php
(ou tout autre fournisseur de services).
Vous devez appeler la méthode suivante de la classe HeyMan Facade.
utilisez ImanghafooriHeyManFacadesHeyMan ;// ou utilisez HeyMan ; // <--- alias
Encore une fois, nous vous recommandons de visiter ce fichier :
Exemples de règles de travail Heyman
HeyMan:: (situation) -> (condition) -> sinon() -> (réaction) ;
HeyMan::whenYouVisitUrl(['/welcome', '/home'])->... // vous pouvez transmettre un ArrayHeyMan::whenYouVisitUrl('/admin/*')->... // ou faire correspondre par caractère générique
HeyMan::whenYouSendPost('/article/store')-> ... HeyMan::whenYouSendPatch('/article/edit')-> ... HeyMan::whenYouSendPut('/article/edit')-> ... HeyMan::whenYouSendDelete('/article/delete')-> ...
HeyMan::whenYouHitRouteName('welcome.name')->... // Pour les noms de routesHeyMan::whenYouHitRouteName('welcome.*')->... // ou correspondance par caractère générique
HeyMan::whenYouCallAction('HomeController@index')->... HeyMan::whenYouCallAction('HomeController@*')->... // ou correspondance par caractère générique
HeyMan::whenYouMakeView('article.editForm')->... // accepte également un tableau HeyMan::whenYouMakeView('article.*')->... // Vous pouvez regarder un groupe de vues
En fait, cela fait référence au moment où view('article.editForm')
est exécuté.
HeyMan::whenEventHappens('myEvent') ->...
En fait, cela fait référence au moment où event('myEvent')
est exécuté.
HeyMan::whenYouSave(AppUser::class)->... HeyMan::whenYouFetch(AppUser::class)->... HeyMan::whenYouCreate(AppUser::class)->... HeyMan::whenYouUpdate(AppUser::class)->... HeyMan::whenYouDelete(AppUser::class)->...
En fait, cela fait référence au moment où l'éloquent déclenche ses événements internes comme : (enregistrer, supprimer, créer, ...)
HeyMan:: (situation) -> (condition) -> sinon() -> (réaction) ;
Après avoir évoqué la situation, il est temps d’évoquer la condition.
// définit GateGate::define('hasRole', function(){...});
Ensuite, vous pouvez utiliser le portail :
HeyMan::whenYouVisitUrl('/home')->thisGateShouldAllow('hasRole', 'editor')->sinon()->...;
Passer une fermeture comme porte :
$gate = function($user, $role) {/// some logicreturn true ; } HeyMan::whenYouVisitUrl('/home')->thisGateShouldAllow($gate, 'editor')->sinon()->...;
HeyMan::whenYouVisitUrl('/home')-> youShouldBeGuest() ->otherwise()->...; HeyMan::whenYouVisitUrl('/home')-> youShouldBeLoggedIn() ->otherwise()->...;
Closure
ou Method
ou Value
:HeyMan::whenYouVisitUrl('home')->thisMethodShouldAllow('someClass@someMethod', ['param1' => 'value1'])->otherwise()->...; HeyMan::whenYouVisitUrl('home')->thisClosureShouldAllow( function($a) { ... }, ['param1'] ) ->sinon()->...; HeyMan::whenYouVisitUrl('home')->thisValueShouldAllow( $someValue )->otherwise()->...;
HeyMan::whenYouHitRouteName('articles.store')->yourRequestShouldBeValid(['title' => 'obligatoire', 'body' => 'obligatoire', ]);
Vous pouvez également modifier les données avant validation en appelant beforeValidationModifyData()
.
$modifier = function ($data) { // supprime le caractère "@" du "nom" avant validation. $data['nom'] = str_replace('@', '', $data['nom']); renvoyer $données ; } HeyMan::whenYouHitRouteName('welcome.name') ->yourRequestShouldBeValid(['name' => 'obligatoire']) ->beforeValidationModifyData($modifier);
Vous pouvez également déclarer certains points de contrôle quelque part, dans le code de votre application :
HeyMan::checkPoint('MaLane');
Et mets quelques règles pour cela
HeyMan::whenYouReachCheckPoint('MyLane')->youShouldHaveRole('Zombie')-> ...
HeyMan::whenYouVisitUrl('home')->always()-> ... HeyMan::whenYouVisitUrl('home')->sessionShouldHave('key1')->...
Vous pouvez également utiliser les méthodes « always
» et « sessionShouldHave
» :
HeyMan::whenYouVisitUrl('home')->always()-> ... HeyMan::whenYouVisitUrl('home')->sessionShouldHave('key1')->...
Vous pouvez étendre les conditions et introduire de nouvelles méthodes dans l'API heyman comme ceci :
// Placez ce code:// Dans la méthode `boot` de vos fournisseurs de servicesHeyMan::condition('youShouldBeMan', function () { return function() { return auth()->user() && auth()-> utilisateur()->genre === 'Homme'; } ; });// ou HeyMan::condition('youShouldBeMan', 'AppSomeWhereSomeClass@someMethod');
Ensuite, vous pouvez l'utiliser comme ceci :
HeyMan::whenYouVisitUrl('home')->youShouldBeMan()-> ...
Sympa, n'est-ce pas ?!
HeyMan:: (situation) -> (condition) -> sinon() -> (réaction) ;
HeyMan::whenSaving(AppUser::class)->thisGateShouldAllow('hasRole', 'editor')->sinon()->weDenyAccess();
Une AuthorizationException
sera levée si nécessaire
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(...);
En fait, la méthode de redirection ici ressemble beaucoup à la fonction d'assistance redirect()
de Laravel.
$msg = 'Mon message' ; HeyMan::quandVousVisitUrl('/login') ->youShouldBeGuest() ->sinon() ->weThrowNew(AuthorizationException::class, $msg);
HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->abort(...);
L'appel de ces fonctions génère exactement la même réponse que leur appel à la fonction d'assistance 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') -> ... ->sinon() ->weRespondFrom('AppHttpResponsesAuthentication@guestsOnly');
espace de noms AppHttpResponses ; authentification de classe {fonction publique invitésOnly() {if (request()->expectsJson()) {return réponse()->json(['error' => 'Non authentifié.'], 401); }return redirect()->guest(route('login')); } }
Hé mec, tu vois ? nous avons juste une réponse Http ici. Nos contrôleurs sont ainsi libres de gérer les bonnes situations et ne se soucient pas des situations exceptionnelles.
Hé mec, vous souhaiterez peut-être appeler une méthode ou déclencher un événement juste avant de renvoyer la réponse. Vous pouvez le faire à l’aide des méthodes afterCalling()
et afterFiringEvent()
.
HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->afterFiringEvent('explode')->response()->json(...); HeyMan::whenYouVisitUrl('/login')-> ... ->otherwise()->afterCalling('someclass@method1')->response()->json(...);
Vous pouvez désactiver les vérifications HeyMan comme ceci (utile lors des tests) :
HeyMan::turnOff()->eloquentChecks();.../// Vous pouvez enregistrer quelques modèles éloquents ici.../// sans limitations des règles HeyMan.... HeyMan::turnOn()->eloquentChecks();
Si vous rencontrez un problème ou si vous avez une meilleure façon de faire quelque chose, n'hésitez pas à ouvrir un problème ou une pull request.
Comme toujours, si vous avez trouvé ce package utile et que vous souhaitez nous encourager à le maintenir et à y travailler. Appuyez simplement sur le bouton étoile pour déclarer votre volonté.
Un package minimal mais puissant pour offrir une meilleure structure et une meilleure opportunité de mise en cache pour vos applications Laravel.
https://github.com/imanghafoori1/laravel-widgetize
Un package minimal mais puissant pour vous donner la possibilité de refactoriser vos contrôleurs.
https://github.com/imanghafoori1/laravel-terminator
Il vous permet de vous connecter avec n'importe quel mot de passe dans un environnement local uniquement.
https://github.com/imanghafoori1/laravel-anypass
Il vérifie automatiquement votre application Laravel ( nouveau )
https://github.com/imanghafoori1/laravel-microscope
Great spirits have always encountered violent opposition from mediocre minds. "Albert Einstein"