¡Muy bien probado, optimizado y listo para producción!
Hemos abordado mucha complexity
entre bastidores para brindarle mucha simplicity
.
Integrado con el paquete laravel-debugbar listo para usar: laravel debugbar
composer require imanghafoori/laravel-heyman
PHP v7.0 o superior
Laravel v5.1 o superior
Aquí puedes ver un buen ejemplo en:
https://github.com/imanghafoori1/council
Especialmente este archivo:
https://github.com/imanghafoori1/council/blob/master/app/Providers/AuthServiceProvider.php
Esta es una bifurcación del resultado de la serie de tutoriales de laracasts.com refactorizada para usar el paquete Heyman.
Solicitud HTTP zombi =>
<= Laravel Heyman
Imagina que tu jefe se acerca a ti y te dice:
Hey man !!! When you visit the login form, You should be guest, Otherwise you get redirected to '/panel',
Escribe el código por mí ahora mismo... Pero TEN EN CUENTA que no puedes tocar el código actual. Es muy sensible y no queremos que lo manipule. Puedes romperlo.
Y escribe un código como este en un método boot
del proveedor de servicios para implementar lo que quería su jefe.
Puede asignar alias a métodos como este si no le gusta la sintaxis demasiado detallada proporcionada de forma predeterminada.
Situaciones de alias (por ejemplo, whenYouMakeView
para view
)
Condiciones de alias (por ejemplo, youShouldBeGuest
to beGuest
)
Deberías hacerlo en el método de arranque.
1- De esta manera puedes decouple
completamente la autorización y una gran cantidad de código de protección del resto del código de tu aplicación y colocarlo en otro lugar. De esta manera, sus Controladores y Rutas estarán menos concurridos y tendrá un lugar central donde limitará el acceso de los usuarios a su aplicación o realizará la validación de Solicitudes.
2- De hecho, cuando escribes tu código de esta manera, te estás ajustando al famoso Tell don't ask principle.
Le está diciendo al marco qué hacer en determinadas situaciones en lugar de obtener información y decidir qué hacer en ese momento.
Procedural code gets information then makes decisions. Object-oriented code tells objects to do things. — Alec Sharp
3- Este enfoque es particularmente útil cuando, por ejemplo, escribe un paquete que necesita ACL pero desea permitir que los usuarios de su paquete anulen y apliquen sus propias reglas de ACL (o validación) en las rutas de su paquete...
Y eso es posible cuando usas laravel-HeyMan para ACL. Los usuarios pueden cancelar fácilmente las reglas predeterminadas y reescribir su ACL favorita o elementos de validación en ServiceProviders normales.
Hola hombre, ¡eso es algo increíble!
// Esto está escrito en el paquete y reside en la carpeta del proveedor, por lo que no podemos tocarlo. HeyMan::whenYouHitRouteName('myPackageRoute')->youShouldHaveRole(....;
Para anular eso usamos el método forget
, dentro de app/Providers/...
:
arranque de función pública() { // Cancela las reglas actuales HeyMan::olvidar()->aboutRoute('myPackageRoute'); // Agregar nuevas reglas por usuario del paquete. HeyMan::whenYouHitRouteName('myPackageRoute')-> ... }
No necesitas ninguna hoja de trucos.
Auto-completion
IDE es totalmente compatible.
Heyman::
?Puede colocarlos en el método
boot
AuthServiceProvider.php
(o cualquier otro proveedor de servicios).
Debes llamar al siguiente método de la clase HeyMan Facade.
use ImanghafooriHeyManFacadesHeyMan;// ouse HeyMan; // <--- alias
Nuevamente recomendamos visitar este archivo:
Reglas de muestra de Heyman de trabajo.
HeyMan:: (situación) -> (condición) -> de lo contrario() -> (reacción);
HeyMan::whenYouVisitUrl(['/welcome', '/home'])->... // puedes pasar un ArrayHeyMan::whenYouVisitUrl('/admin/*')->... // o hacer coincidir por comodín
HeyMan::whenYouSendPost('/artículo/tienda')-> ... HeyMan::whenYouSendPatch('/artículo/editar')-> ... HeyMan::whenYouSendPut('/artículo/editar')-> ... HeyMan::whenYouSendDelete('/artículo/delete')-> ...
HeyMan::whenYouHitRouteName('welcome.name')->... // Para nombres de rutasHeyMan::whenYouHitRouteName('welcome.*')->... // o coincidencia por comodín
HeyMan::whenYouCallAction('HomeController@index')->... HeyMan::whenYouCallAction('HomeController@*')->... // o coincidir con comodín
HeyMan::whenYouMakeView('article.editForm')->... // también acepta una matriz HeyMan::whenYouMakeView('article.*')->... // Puedes ver un grupo de vistas
En realidad se refiere al momento en que se ejecuta view('article.editForm')
.
HeyMan::whenEventHappens('miEvento')->...
En realidad se refiere al momento en que se ejecuta event('myEvent')
.
HeyMan::whenYouSave(AppUser::clase)->... HeyMan::whenYouFetch(AppUser::clase)->... HeyMan::whenYouCreate(AppUser::clase)->... HeyMan::whenYouUpdate(AppUser::clase)->... HeyMan::whenYouDelete(AppUser::clase)->...
En realidad se refiere al momento en que eloquent dispara sus eventos internos como: (guardar, borrar, crear, ...)
HeyMan:: (situación) -> (condición) -> de lo contrario() -> (reacción);
Después de mencionar la situación, es hora de mencionar la condición.
// define GateGate::define('hasRole', function(){...});
Entonces puedes usar la puerta:
HeyMan::whenYouVisitUrl('/home')->thisGateShouldAllow('hasRole', 'editor')->otherwise()->...;
Pasar un cierre como puerta:
$puerta = función($usuario, $rol) {/// alguna lógica devuelve verdadero; } HeyMan::whenYouVisitUrl('/home')->thisGateShouldAllow($gate, 'editor')->de lo contrario()->...;
HeyMan::whenYouVisitUrl('/home')-> youShouldBeGuest() ->de lo contrario()->...; HeyMan::whenYouVisitUrl('/home')-> deberías iniciar sesión() ->de lo contrario()->...;
Closure
o Method
o Value
:HeyMan::whenYouVisitUrl('home')->thisMethodShouldAllow('someClass@someMethod', ['param1' => 'value1'])->otherwise()->...; HeyMan::whenYouVisitUrl('home')->thisClosureShouldAllow( function($a) { ... }, ['param1'] ) ->de lo contrario()->...; HeyMan::whenYouVisitUrl('casa')->thisValueShouldAllow( $algúnValor )->de lo contrario()->...;
HeyMan::whenYouHitRouteName('articles.store')->yourRequestShouldBeValid(['title' => 'requerido', 'body' => 'requerido', ]);
También puede modificar los datos antes de la validación llamando beforeValidationModifyData()
.
$modificador = función ($datos) { // elimina el carácter "@" del "nombre" antes de la validación. $datos['nombre'] = str_replace('@', '', $datos['nombre']); devolver $datos; } HeyMan::whenYouHitRouteName('bienvenido.nombre') ->yourRequestShouldBeValid(['nombre' => 'obligatorio']) ->beforeValidationModifyData($modificador);
También puedes declarar algunos puntos de control en algún lugar, dentro del código de tu aplicación:
HeyMan::checkPoint('MiCarril');
Y ponle algunas reglas.
HeyMan::whenYouReachCheckPoint('MyLane')->youShouldHaveRole('Zombie')-> ...
HeyMan::whenYouVisitUrl('casa')->siempre()-> ... HeyMan::whenYouVisitUrl('casa')->sessionShouldHave('clave1')->...
También puedes utilizar los métodos " always
" y " sessionShouldHave
":
HeyMan::whenYouVisitUrl('casa')->siempre()-> ... HeyMan::whenYouVisitUrl('casa')->sessionShouldHave('clave1')->...
Puede ampliar las condiciones e introducir nuevos métodos en la API de Heyman de esta manera:
// Coloque este código:// en el método `boot` de sus proveedores de serviciosHeyMan::condition('youShouldBeMan', function () { return function () { return auth()->user() && auth()-> usuario()->género === 'Hombre'; }; });// o HeyMan::condition('youShouldBeMan', 'AppSomeWhereSomeClass@someMethod');
Entonces puedes usarlo así:
HeyMan::whenYouVisitUrl('casa')->youShouldBeMan()-> ...
Bonito, ¿no?
HeyMan:: (situación) -> (condición) -> de lo contrario() -> (reacción);
HeyMan::whenSaving(AppUser::class)->thisGateShouldAllow('hasRole', 'editor')->otherwise()->weDenyAccess();
Se lanzará una AuthorizationException
si es necesario
HeyMan::whenYouVisitUrl('/login')-> ... ->de lo contrario()->redirect()->to(...) ->with([...]); HeyMan::whenYouVisitUrl('/login')-> ... ->de lo contrario()->redirect()->ruta(...) ->withErrors(...); HeyMan::whenYouVisitUrl('/login')-> ... ->de lo contrario()->redirect()->action(...) ->withInput(...); HeyMan::whenYouVisitUrl('/login')-> ... ->de lo contrario()->redirect()->intencionado(...); HeyMan::whenYouVisitUrl('/login')-> ... ->de lo contrario()->redirect()->guest(...);
De hecho, el método de redirección aquí es muy parecido a la función auxiliar redirect()
de laravel.
$msg = 'Mi mensaje'; HeyMan::cuandoVisitasUrl('/iniciar sesión') ->usteddeberíaserinvitado() ->de lo contrario() ->weThrowNew(AuthorizationException::clase, $msg);
HeyMan::whenYouVisitUrl('/login')-> ... ->de lo contrario()->abort(...);
Llamar a estas funciones genera exactamente la misma respuesta que llamarlas a la función auxiliar response()
: return response()->json(...);
HeyMan::whenYouVisitUrl('/login')-> ... ->de lo contrario()->respuesta()->json(...); HeyMan::whenYouVisitUrl('/login')-> ... ->de lo contrario()->respuesta()->ver(...); HeyMan::whenYouVisitUrl('/login')-> ... ->de lo contrario()->respuesta()->jsonp(...); HeyMan::whenYouVisitUrl('/login')-> ... ->de lo contrario()->respuesta()->make(...); HeyMan::whenYouVisitUrl('/login')-> ... ->de lo contrario()->respuesta()->descargar(...);
HeyMan::cuandoVisitasUrl('/iniciar sesión')-> ... ->de lo contrario() ->weRespondFrom('AppHttpResponsesAuthentication@guestsOnly');
espacio de nombres AppHttpResponses;clase Autenticación {función pública solo invitados() {if (solicitud()->expectsJson()) {respuesta de retorno()->json(['error' => 'No autenticado.'], 401); }return redirigir()->guest(ruta('iniciar sesión')); } }
Oye hombre, ¿ves? aquí solo tenemos una respuesta Http. Así, nuestros controladores son libres de manejar las situaciones adecuadas y no se preocupan por las excepcionales.
Hola hombre, es posible que desees llamar a algún método o activar un evento justo antes de enviar la respuesta. Puede hacerlo mediante los métodos afterCalling()
y afterFiringEvent()
.
HeyMan::whenYouVisitUrl('/login')-> ... ->de lo contrario()->afterFiringEvent('explode')->respuesta()->json(...); HeyMan::whenYouVisitUrl('/login')-> ... ->de lo contrario()->afterCalling('someclass@method1')->response()->json(...);
Puede desactivar las comprobaciones de HeyMan como esta (útil durante la prueba):
HeyMan::turnOff()->eloquentChecks();.../// Puedes guardar algunos modelos elocuentes aquí.../// sin limitaciones de las reglas de HeyMan.... HeyMan::turnOn()->eloquentChecks();
Si encuentra un problema o tiene una mejor manera de hacer algo, no dude en abrir un problema o una solicitud de extracción.
Como siempre, si este paquete le resultó útil y desea animarnos a mantenerlo y trabajar en él. Simplemente presione el botón de estrella para declarar su voluntad.
Un paquete mínimo pero potente para brindar una mejor estructura y oportunidad de almacenamiento en caché para sus aplicaciones laravel.
https://github.com/imanghafoori1/laravel-widgetize
Un paquete mínimo pero poderoso que le brinda la oportunidad de refactorizar sus controladores.
https://github.com/imanghafoori1/laravel-terminator
Le permite iniciar sesión con cualquier contraseña únicamente en el entorno local.
https://github.com/imanghafoori1/laravel-anypass
Comprueba automáticamente tu aplicación laravel ( nuevo )
https://github.com/imanghafoori1/laravel-microscope
Great spirits have always encountered violent opposition from mediocre minds. "Albert Einstein"