PHPackages                             tjdft/laravel - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. tjdft/laravel

ActiveLibrary[Framework](/categories/framework)

tjdft/laravel
=============

Pacote unificado para desenvolvimento de aplicações Laravel no TJDFT.

2.5.1(1mo ago)0119↓33.3%MITPHPCI passing

Since Oct 3Pushed 1mo agoCompare

[ Source](https://github.com/tjdft/laravel)[ Packagist](https://packagist.org/packages/tjdft/laravel)[ RSS](/packages/tjdft-laravel/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (23)Versions (32)Used By (0)

[![](logo.png)](logo.png)

 [ ![](https://camo.githubusercontent.com/c039534acbbb6d930f60cb7ddd7a610bf34f8efa1fe8ec4dd734d729051e636f/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f746a6466742f6c61726176656c3f63616368655365636f6e64733d3630) ](https://packagist.org/packages/tjdft/laravel) [ ![](https://camo.githubusercontent.com/a2c8a8ca76c48248f2d11fb7628a2cb5d779c091fca991fa7b28a41fb66cf441/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f746a6466742f6c61726176656c3f6c6162656c3d737461626c6526636f6c6f723d626c75652663616368655365636f6e64733d3630) ](https://packagist.org/packages/tjdft/laravel) [ ![](https://camo.githubusercontent.com/147ae7d3b4c20f9f5495d256efc314087163469cb11feb811b4f49f74a46374b/68747470733a2f2f636f6465636f762e696f2f67682f746a6466742f6c61726176656c2f67726170682f62616467652e7376673f746f6b656e3d58513739375744455041) ](https://codecov.io/gh/tjdft/laravel) [ ![](https://camo.githubusercontent.com/e8091f826d2eb2d902abac6385fde96da2814ce60ae48fcf6c575898f710658c/68747470733a2f2f706f7365722e707567782e6f72672f746a6466742f6c61726176656c2f6c6963656e73652e737667) ](https://packagist.org/packages/tjdft/laravel)

Introdução
==========

[](#introdução)

Pacote unificado para desenvolvimento de aplicações Laravel no TJDFT.

**Autenticação e Autorização:**

- Fluxo de autenticação com **Keycloak**.
- Gerenciamento de **Permissões**.
- Funcionalidade de **Impersonate**.

**Auditoria:**

- Mecanismo de auditoria de models.

**Integração com o RH:**

- Classe base para consulta na **API RH**.

**Integração com o Sentry**

- Pré-configuração do **Sentry** para monitoramento de erros.

**Integração com o SMAX**

- Abertura de requisições no **SMAX** (Central de Atendimento).

**Interface:**

- Inclui a biblioteca de componentes **maryUI**.
- Tela de **erro** padronizada.
- Pacote extra de **ícones**.
- Arquivos de **translation** em `pt_BR`.
- Utilitários `Numero` e `Data` para diversas **formatações** em tela.
- Trait `HasSearchAny` para busca simplificada em **múltiplos campos**.
- Trait `WithPaginationAndReset` para paginação simplificada com **Livewire**.
- Trait `HasSpinnerPlaceholder` para exibir um spinner em componentes `lazy`.

**Testes automatizados:**

- Trait `TestUtils` com métodos auxiliares para testes automatizados.
- **GraphQL Faker** para simular respostas da **API RH** em ambiente de testes.

**Postgres:**

- Ativa extensões úteis do **PostgreSQL** (unaccent, pg\_trgm).

Instalação
==========

[](#instalação)

Utilize o **Instalador Laravel do TJDFT** para criar uma nova aplicação com este pacote pré-configurado.

 Ou, execute a instalação manual
Adicione o pacote.

```
composer require tjdft/laravel
```

Instale maryUI incluído no pacote.

```
php artisan mary:install --yarn

```

Altere o idioma em `.env`

```
APP_LOCALE=pt_BR
```

Adicione as configurações de middleware e exceptions em `bootstrap/app.php`.

```
use TJDFT\Laravel\Exceptions\ExceptionHandler;
// ...

->withMiddleware(function (Middleware $middleware) {
    // Para proxy reverso (Openshift)
    $middleware->trustProxies(at: '*');
})
->withExceptions(function (Exceptions $exceptions) {
    // Tratamento personalizado de exceções
    ExceptionHandler::register($exceptions);
})
```

Ajuste `tests/Pest.php`.

```
pest()->extend(Tests\TestCase::class)->in('Feature', 'Unit');
```

Ajuste `tests/TestCase.php`.

```
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use TJDFT\Laravel\Traits\TestUtils;

abstract class TestCase extends BaseTestCase
{
    // Helpers para testes automatizados
    use TestUtils;

    // Equivale ao `setUp()` do PHPUnit
    protected function boot(): void
    {
        // Adicione aqui qualquer coisa que precise ser executada antes dos testes.
    }
}
```

Crie as novas variáveis de ambiente em `.env`.

```
# Sentry
TJDFT_SENTRY_LARAVEL_DSN=

# Schema onde devem ser ativadas as extensões do PostgreSQL
# Use apenas se o schema principal da aplicação for diferente de `public`.
TJDFT_PGSQL_EXTENSIONS_SCHEMA=core

# API RH
TJDFT_POLVO_API_URL=https:///graphql
TJDFT_POLVO_AUTH_URL=https:///auth/realms//protocol/openid-connect/token
TJDFT_POLVO_CLIENT_ID=
TJDFT_POLVO_CLIENT_SECRET=
TJDFT_POLVO_CACHE_TTL='1 hour'

# Keycloak
TJDFT_KEYCLOAK_BASE_URL=https:///auth
TJDFT_KEYCLOAK_REALMS=
TJDFT_KEYCLOAK_CLIENT_ID=
TJDFT_KEYCLOAK_CLIENT_SECRET=

# SMAX
TJDFT_SMAX_URL=https://
TJDFT_SMAX_TENANT_ID=
TJDFT_SMAX_REQUESTS_OFFERING=
TJDFT_SMAX_LOGIN=
TJDFT_SMAX_PASSWORD=
TJDFT_SMAX_FALLBACK_EMAILS=
```

Ajuste a migration existente `users`.

```
Schema::create('users', function (Blueprint $table) {
    $table->id();
    $table->uuid()->index()->nullable();
    $table->string('login')->index();
    $table->string('matricula')->nullable();
    $table->string('cpf')->index()->nullable();
    $table->string('nome');
    $table->string('email')->nullable();
    $table->string('foto')->nullable();
    $table->json('localizacao')->nullable();
    $table->string('rh_tipo')->nullable();
    $table->string('rh_status')->nullable();
    $table->timestamps();

    $table->unique(['cpf', 'matricula']);
});
```

Rode as migrations.

```
# Esta ação destruirá e recriará o banco!

php artisan migrate:fresh --seed
```

**Pronto!**

Autenticação
============

[](#autenticação)

Este pacote implementa o fluxo de autenticação OAuth2 via `Keycloak` para as rotas protegidas do sistema.

```
// Rotas protegidas
Route::middleware('auth')->group(function () {

    Route::livewire('/paginas/create', 'pages::paginas.criar');

    // ...
});
```

Para o **logout** de usuários utilize a rota `/auth/logout/keycloak`.

```

```

Usuários com **mais de um vínculo no RH** serão redirecionados automaticamente para a rota `/auth/perfil`.

```
Ex: Se o usuário possui vínculo de Pensão Alimentícia e Servidor, então ele deve selecionar um perfil para acesso.

```

```

```

Consulte o tópico **[Autorização](#autoriza%C3%A7%C3%A3o)** para mais detalhes sobre **permissões**.

```
pubfic function mount(): void
{
    // Lança uma exceção 403 se o usuário não tiver a permissão
    auth()->user()->authorize("comprovante.visualizar");
}
```

```

```

Autorização
===========

[](#autorização)

Utilize a rota `/auth/permissions` para acessar o gerenciamento de permissões.

```

```

Adicione o trait `HasGrant` no model `User`.

```
use TJDFT\Laravel\Traits\HasGrant;
// ...

class User extends Authenticatable
{
    use HasGrant;

    //...
}
```

Estas são as roles e permissions iniciais registradas automaticamente pelo pacote.

```
// Permissão master
Permission::create([
    'name' => 'permissoes.gerenciar',
    'description' => 'Permissões / Gerenciar',
]);

// Permissão de impersonate
Permission::create([
    'name' => 'impersonate',
    'description' => 'Impersonate',
]);

// Role admin
Role::create([
    'name' => 'admin',
    'description' => 'Administrador'
])->givePermissionTo(['permissoes.gerenciar', 'impersonate']);
```

**EXEMPLO: `authorize()`**

```
public function mount(): void
{
    // Lança uma exceção 403 se o usuário não tiver a permissão
    auth()->user()->authorize("comprovante-rendimentos.visualizar");
}
```

**EXEMPLO: `can()`**

```
// Se tem a permissão, mostra o aviso
@if(auth()->user()->can('consignacao.portabilidade'))
    Disponível para portabilidade
@endif
```

**EXEMPLO: `cannot()`**

```

```

**EXEMPLO:** crie outras roles e permissions na sua aplicação.

```
// database/seeders/PermissionsSeeder.php

use Illuminate\Database\Seeder;
use TJDFT\Laravel\Models\Permission;
use TJDFT\Laravel\Models\Role;

// ...

class PermissionsSeeder extends Seeder
{
    public function run(): void
    {
        if (Permission::where('name', 'comprovante.processar')->count()) {
            return;
        }

        // Processar comprovantes
        Permission::create([
            'name' => 'comprovante.processar',
            'description' => 'Comprovantes de Rendimentos / Processar',
        ]);

        // Visualizar comprovantes
        Permission::create([
            'name' => 'comprovante.visualizar',
            'description' => 'Comprovantes de Rendimentos / Visualizar',
        ]);

        // FUNCIONÁRIO tem permissão apenas para visualizar
        Role::create([
            'name' => 'funcionario',
            'description' => 'Funcionário'
         ])->givePermissionTo([
            'comprovante.visualizar',
        ]);

        // ADMIN tem todas as permissões
        // A role `admin` já é criada automaticamente pelo pacote
        Role::firstWhere('name', 'admin')->givePermissionTo(Permission::all());

        // Defina os administradores iniciais do sistema
        User::create([
            'cpf' => '0123456789',
            'matricula' => '123456',
            'login' => 't123456',
            'nome' => 'Maria Silva'
        ])->assignRole('admin');

        // Note que é inviável atribuir previamente as roles para milhares de `funcionários`.
        // Confira o exemplo de roles/permissions dinâmicas abaixo.
    }
}
```

**EXEMPLO:** lógica personalizada para definir dinamicamente roles/permissions.

```
// app/Actions/AtualizarPermissionsLoginAction.php
