Muito bem testado, otimizado e pronto para produção!
Abordamos muita complexity
nos bastidores, para fornecer a você muita simplicity
.
Integrado com o pacote laravel-debugbar pronto para uso: laravel debugbar
composer require imanghafoori/laravel-heyman
PHP v7.0 ou superior
Laravel v5.1 ou superior
Aqui você pode ver um bom exemplo em:
https://github.com/imanghafoori1/council
Especialmente este arquivo:
https://github.com/imanghafoori1/council/blob/master/app/Providers/AuthServiceProvider.php
Este é um fork do resultado da série de tutoriais laracasts.com refatorados para usar o pacote Heyman.
Solicitação HTTP Zumbi =>
<= Laravel Heyman
Imagine que seu chefe chega até você e diz:
Hey man !!! When you visit the login form, You should be guest, Otherwise you get redirected to '/panel',
Escreva o código para mim agora mesmo... Mas TENHA EM MENTE que você não tem permissão para mexer no código atual. é muito sensível e não queremos que você o altere. Você pode quebrá-lo.
E você escreve um código como este em um método boot
do provedor de serviços para implementar o que seu chefe queria.
Você pode usar métodos alternativos como este se não gostar de muita sintaxe detalhada fornecida por padrão.
Situações de alias (ex. whenYouMakeView
to view
)
Condições do alias (ex. youShouldBeGuest
para beGuest
)
Você deve fazer isso no método de inicialização.
1- Dessa forma você pode decouple
totalmente a autorização e muito código de proteção do restante do código do seu aplicativo e colocá-lo em outro lugar. Assim seus Controllers e Rotas ficarão menos lotados e você terá um local central onde limitará o acesso dos usuários à sua aplicação ou realizará a validação de Request.
2- Na verdade, quando você escreve seu código dessa maneira, você está obedecendo ao famoso Tell don't ask principle.
Você está dizendo à estrutura o que fazer em determinadas situações, em vez de obter informações e decidir o que fazer então.
Procedural code gets information then makes decisions. Object-oriented code tells objects to do things. — Alec Sharp
3- Esta abordagem é particularmente útil quando você, por exemplo, escreve um pacote que precisa de ACL, mas deseja permitir que os usuários do pacote substituam e apliquem suas próprias regras de ACL (ou validação) em suas rotas de pacote...
E isso se torna possível quando você usa laravel-HeyMan para ACL. Os usuários podem facilmente cancelar as regras padrão e reescrever sua acl favorita ou material de validação em ServiceProviders regulares.
Ei cara, isso é uma coisa incrível!
// Isso está escrito no pacote e reside na pasta do fornecedor, portanto não podemos tocá-lo.HeyMan::whenYouHitRouteName('myPackageRoute')->youShouldHaveRole(....;
Para substituir isso, usamos o método forget
, em app/Providers/...
:
função pública inicialização() { //Cancela as regras atuais HeyMan::forget()->aboutRoute('myPackageRoute'); //Adiciona novas regras por usuário do pacote. HeyMan::whenYouHitRouteName('myPackageRoute')-> ... }
Você não precisa de nenhuma folha de dicas.
Auto-completion
do IDE é totalmente suportado.
Heyman::
?Você pode colocá-los no método
boot
AuthServiceProvider.php
(ou qualquer outro provedor de serviços).
Você deve chamar o seguinte método da classe HeyMan Facade.
use ImanghafooriHeyManFacadesHeyMan;// ouuse HeyMan; // <--- alias
Novamente recomendamos visitar este arquivo:
Exemplo de regras de trabalho do Heyman
HeyMan:: (situação) -> (condição) -> caso contrário() -> (reação) ;
HeyMan::whenYouVisitUrl(['/welcome', '/home'])->... // você pode passar um ArrayHeyMan::whenYouVisitUrl('/admin/*')->... // ou combinar por curinga
HeyMan::whenYouSendPost('/artigo/loja')-> ... HeyMan::whenYouSendPatch('/artigo/editar')-> ... HeyMan::whenYouSendPut('/artigo/editar')-> ... HeyMan::whenYouSendDelete('/artigo/delete')-> ...
HeyMan::whenYouHitRouteName('welcome.name')->... // Para nomes de rotasHeyMan::whenYouHitRouteName('welcome.*')->... // ou correspondência por curinga
HeyMan::whenYouCallAction('HomeController@index')->... HeyMan::whenYouCallAction('HomeController@*')->... // ou correspondência por curinga
HeyMan::whenYouMakeView('article.editForm')->... // também aceita um array HeyMan::whenYouMakeView('article.*')->... // Você pode assistir a um grupo de visualizações
Na verdade, refere-se ao momento em que view('article.editForm')
é executado.
HeyMan::whenEventHappens('meuEvento')->...
Na verdade, refere-se ao momento em que event('myEvent')
é executado.
HeyMan::whenYouSave(AppUser::class)->... HeyMan::whenYouFetch(AppUser::class)->... HeyMan::whenYouCreate(AppUser::class)->... HeyMan::whenYouUpdate(AppUser::class)->... HeyMan::whenYouDelete(AppUser::class)->...
Na verdade refere-se ao momento em que o eloquente dispara seus eventos internos como: (salvar, deletar, criar, ...)
HeyMan:: (situação) -> (condição) -> caso contrário() -> (reação) ;
Depois de mencionar a situação, é hora de mencionar a condição.
//define GateGate::define('hasRole', function(){...});
Então você pode usar o portão:
HeyMan::whenYouVisitUrl('/home')->thisGateShouldAllow('hasRole', 'editor')->caso contrário()->...;
Passando por um fechamento como um portão:
$gate = function($user, $role) {/// algum retorno lógico verdadeiro; } HeyMan::whenYouVisitUrl('/home')->thisGateShouldAllow($gate, 'editor')->caso contrário()->...;
HeyMan::whenYouVisitUrl('/home')-> youShouldBeGuest() ->caso contrário()->...; HeyMan::whenYouVisitUrl('/home')-> youShouldBeLoggedIn() ->caso contrário()->...;
Closure
ou Method
ou Value
:HeyMan::whenYouVisitUrl('home')->thisMethodShouldAllow('someClass@someMethod', ['param1' => 'value1'])->caso contrário()->...; HeyMan::whenYouVisitUrl('home')->thisClosureShouldAllow( function($a) { ... }, ['param1'] ) ->caso contrário()->...; HeyMan::whenYouVisitUrl('home')->thisValueShouldAllow( $someValue )->otherwise()->...;
HeyMan::whenYouHitRouteName('articles.store')->yourRequestShouldBeValid(['title' => 'required', 'body' => 'required', ]);
Você também pode modificar os dados antes da validação chamando beforeValidationModifyData()
.
$modifier = function ($data) { // remove o caractere "@" do "nome" antes da validação. $dados['nome'] = str_replace('@', '', $dados['nome']); retornar $dados; } HeyMan::whenYouHitRouteName('welcome.name') ->yourRequestShouldBeValid(['nome' => 'obrigatório']) ->beforeValidationModifyData($modificador);
Você também pode declarar alguns pontos de verificação em algum lugar, dentro do código da sua aplicação:
HeyMan::checkPoint('MinhaLane');
E coloque algumas regras para isso
HeyMan::whenYouReachCheckPoint('MyLane')->youShouldHaveRole('Zombie')-> ...
HeyMan::whenYouVisitUrl('home')->always()-> ... HeyMan::whenYouVisitUrl('home')->sessionShouldHave('key1')->...
Você também pode usar os métodos " always
" e " sessionShouldHave
":
HeyMan::whenYouVisitUrl('home')->always()-> ... HeyMan::whenYouVisitUrl('home')->sessionShouldHave('key1')->...
Você pode estender as condições e introduzir novos métodos na API heyman assim:
// Coloque este código:// no método `boot` dos seus provedores de serviçoHeyMan::condition('youShouldBeMan', function () { return function () { return auth()->user() && auth()-> usuário()->gênero === 'Homem'; }; });// ou HeyMan::condition('youShouldBeMan', 'AppSomeWhereSomeClass@someMethod');
Então você pode usá-lo assim:
HeyMan::whenYouVisitUrl('home')->youShouldBeMan()-> ...
Legal, não é?!
HeyMan:: (situação) -> (condição) -> caso contrário() -> (reação) ;
HeyMan::whenSaving(AppUser::class)->thisGateShouldAllow('hasRole', 'editor')->caso contrário()->weDenyAccess();
Uma AuthorizationException
será lançada se necessário
HeyMan::whenYouVisitUrl('/login')-> ... ->caso()->redirect()->to(...) ->with([...]); HeyMan::whenYouVisitUrl('/login')-> ... ->caso()->redirect()->route(...) ->withErrors(...); HeyMan::whenYouVisitUrl('/login')-> ... ->caso()->redirect()->action(...) ->withInput(...); HeyMan::whenYouVisitUrl('/login')-> ... ->caso contrário()->redirect()->intended(...); HeyMan::whenYouVisitUrl('/login')-> ... ->caso contrário()->redirect()->guest(...);
Na verdade, o método de redirecionamento aqui é muito parecido com a função auxiliar redirect()
do laravel.
$msg = 'Minha Mensagem'; HeyMan::whenYouVisitUrl('/login') ->vocêShouldBeGuest() ->caso contrário() ->weThrowNew(AuthorizationException::class, $msg);
HeyMan::whenYouVisitUrl('/login')-> ... ->caso contrário()->abortar(...);
Chamar essas funções gera exatamente a mesma resposta que chamá-las na função auxiliar response()
: return response()->json(...);
HeyMan::whenYouVisitUrl('/login')-> ... ->caso contrário()->response()->json(...); HeyMan::whenYouVisitUrl('/login')-> ... ->caso contrário()->response()->view(...); HeyMan::whenYouVisitUrl('/login')-> ... ->caso contrário()->response()->jsonp(...); HeyMan::whenYouVisitUrl('/login')-> ... ->caso contrário()->response()->make(...); HeyMan::whenYouVisitUrl('/login')-> ... ->caso contrário()->response()->download(...);
HeyMan::whenYouVisitUrl('/login')-> ... ->caso contrário() ->weRespondFrom('AppHttpResponsesAuthentication@guestsOnly');
namespace AppHttpResponses;autenticação de classe {função pública apenas convidados() {if (request()->expectsJson()) {return response()->json(['error' => 'Unauthenticated.'], 401); }return redirecionamento()->convidado(rota('login')); } }
Ei cara, você vê? temos apenas uma resposta HTTP aqui. Assim, nossos controladores ficam livres para lidar com as situações certas e não se preocupam com situações excepcionais.
Ei cara, você pode querer chamar algum método ou disparar um evento antes de enviar a resposta de volta. Você pode fazer isso pelos métodos afterCalling()
e afterFiringEvent()
.
HeyMan::whenYouVisitUrl('/login')-> ... ->caso contrário()->afterFiringEvent('explode')->response()->json(...); HeyMan::whenYouVisitUrl('/login')-> ... ->caso contrário()->afterCalling('someclass@method1')->response()->json(...);
Você pode desativar as verificações do HeyMan assim (útil durante o teste):
HeyMan::turnOff()->eloquentChecks();.../// Você pode salvar alguns modelos eloquentes aqui... /// sem limitações das regras do HeyMan.... HeyMan::turnOn()->eloquentChecks();
Se você encontrar um problema ou tiver uma maneira melhor de fazer algo, sinta-se à vontade para abrir um problema ou uma solicitação pull.
Como sempre, se você achou este pacote útil e deseja nos encorajar a mantê-lo e trabalhar nele. Basta pressionar o botão estrela para declarar sua vontade.
Um pacote mínimo, mas poderoso, para fornecer uma melhor estrutura e oportunidade de armazenamento em cache para seus aplicativos laravel.
https://github.com/imanghafoori1/laravel-widgetize
Um pacote mínimo, mas poderoso, para lhe dar a oportunidade de refatorar seus controladores.
https://github.com/imanghafoori1/laravel-terminator
Ele permite que você faça login com qualquer senha apenas no ambiente local.
https://github.com/imanghafoori1/laravel-anypass
Ele verifica automaticamente seu aplicativo laravel ( novo )
https://github.com/imanghafoori1/laravel-microscope
Great spirits have always encountered violent opposition from mediocre minds. "Albert Einstein"