PHPackages                             risetechapps/contact-for-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. [Utility &amp; Helpers](/categories/utility)
4. /
5. risetechapps/contact-for-laravel

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

risetechapps/contact-for-laravel
================================

1.1.0(2mo ago)0245↓77.8%MITPHPPHP ^8.3

Since May 26Pushed 3w ago1 watchersCompare

[ Source](https://github.com/risetechapps/contact-for-laravel)[ Packagist](https://packagist.org/packages/risetechapps/contact-for-laravel)[ Docs](https://github.com/risetechapps/contact-for-laravel)[ RSS](/packages/risetechapps-contact-for-laravel/feed)WikiDiscussions main Synced 3w ago

READMEChangelogDependencies (27)Versions (6)Used By (0)

Laravel Contact
===============

[](#laravel-contact)

📌 Sobre o Projeto
-----------------

[](#-sobre-o-projeto)

O **Laravel Contact** é um package para Laravel que te possibilita criar multiplos contatos no mesmo registro.

---

🚀 Instalação
------------

[](#-instalação)

### 1️⃣ Requisitos

[](#1️⃣-requisitos)

Antes de instalar, certifique-se de que seu projeto atenda aos seguintes requisitos:

- PHP &gt;= 8.3
- Laravel &gt;= 12
- Composer instalado

### 2️⃣ Instalação do Package

[](#2️⃣-instalação-do-package)

Execute o seguinte comando no terminal:

```
composer require risetechapps/contact-for-laravel
```

### 3️⃣ Configure seu Model

[](#3️⃣-configure-seu-model)

```
  use RiseTechApps\Contact\Traits\HasContacts\HasContacts;

  class Client extends Model
  {
    use HasFactory, HasContacts;
  }
```

### 4️⃣ Rodar Migrations

[](#4️⃣-rodar-migrations)

```
php artisan migrate
```

---

📖 Uso
-----

[](#-uso)

> **Nota:** O trait `HasContacts` pode ser usado em qualquer model, com ou sem `SoftDeletes`.

### Campos do Contato

[](#campos-do-contato)

- `name` - Nome do contato
- `telephone` - Telefone fixo
- `cellphone` - Celular
- `email` - Email
- `department` - Departamento/Tipo (ex: comercial, suporte)
- `is_primary` - Define se é o contato principal (boolean)
- `sort_order` - Ordenação personalizada (inteiro)

### Métodos Disponíveis no Trait

[](#métodos-disponíveis-no-trait)

```
use RiseTechApps\Contact\Traits\HasContacts\HasContacts;

class Client extends Model
{
    use HasFactory, HasContacts;
}

// Obter contato principal
$primaryContact = $client->getPrimaryContact();

// Obter contatos por departamento
$comercialContacts = $client->getContactsByType('comercial');

// Verificar se existe email
$hasEmail = $client->hasEmail('joao@exemplo.com');

// Verificar contato em campo específico
$hasPhone = $client->hasContact('telephone', '11999999999');
```

### Sincronizando Contatos

[](#sincronizando-contatos)

O método `syncContacts()` faz a sincronização completa dos contatos de um model em uma única chamada. Ele aceita tanto um `array` quanto um `Illuminate\Http\Request` — ideal tanto em controllers quanto em jobs/processamento em segundo plano.

```
// Lista de contatos direta
$client->syncContacts([
    ['name' => 'João', 'email' => 'joao@exemplo.com', 'cellphone' => '11999999999'],
    ['name' => 'Maria', 'email' => 'maria@exemplo.com', 'is_primary' => true],
]);

// Com a chave 'contacts'
$client->syncContacts(['contacts' => [...]]);

// A partir do Request (busca em 'contacts' ou 'person.contacts')
$client->syncContacts($request);
```

**Comportamento da sincronização (incremental):**

- Contato com `id` existente → **atualiza** (e restaura, se estiver soft-deleted)
- Contato sem `id` → **cria** novo
- Contatos ausentes no payload → **removidos** (soft delete)
- Garante automaticamente **um único** contato primário
- O `sort_order` é definido pela ordem dos itens no array

> 💡 Para preservar o histórico e os ids dos contatos existentes, envie o `id` de cada contato no payload. Sem `id`, um novo contato é criado.

**Exemplo em job (segundo plano):**

```
$client->syncContacts($data['contacts'] ?? []);
```

> ⚠️ Se o seu model usa `HasContacts`, salvar o model (`save()`/`update()`) dispara o `ContactEvent`, que também sincroniza contatos a partir do request. Ao usar `syncContacts()` de forma explícita, evite enviar contatos pelo request/static no mesmo fluxo para não sincronizar duas vezes.

### Relacionamento

[](#relacionamento)

```
// Todos os contatos ordenados por sort_order
$client->contacts;

// Apenas o contato principal
$client->contacts()->primary()->first();

// Ordenados
$client->contacts()->ordered()->get();
```

### Contato Principal (Automático)

[](#contato-principal-automático)

O sistema gerencia automaticamente o contato principal:

- **Ao criar um contato**: Se não existir nenhum contato primário para o model, ele automaticamente será marcado como primário
- **Ao definir como primário**: Se já existir um contato primário, o anterior perde automaticamente essa marcação
- **Ao deletar o primário**: Outro contato do mesmo model será promovido a primário automaticamente (respeitando `sort_order` e `created_at`)

```
// Criar primeiro contato - automaticamente vira primário
$client->contacts()->create(['name' => 'João', 'email' => 'joao@exemplo.com']);

// Criar segundo como primário - o primeiro perde a marcação
$client->contacts()->create([
    'name' => 'Maria',
    'email' => 'maria@exemplo.com',
    'is_primary' => true  // João deixa de ser primário
]);

// Deletar o primário - outro contato assume automaticamente
$client->getPrimaryContact()->delete();
$novoPrimario = $client->fresh()->getPrimaryContact(); // Retorna outro contato
```

### Histórico de Mudanças (Audit Log)

[](#histórico-de-mudanças-audit-log)

Todos os contatos possuem rastreamento automático de alterações:

```
// Obter histórico de um contato
$history = $contact->histories;

// Últimas 10 alterações
$latest = $contact->latestHistory(10);

// Filtrar por tipo de ação
$updates = $contact->historiesForAction('updated');

// Quem criou o contato
$creator = $contact->createdBy();

// Quem fez a última alteração
$lastEditor = $contact->lastUpdatedBy();

// Verificar se um campo específico mudou
foreach ($history as $record) {
    if ($record->fieldChanged('email')) {
        $oldEmail = $record->getOldValue('email');
        $newEmail = $record->getNewValue('email');
    }
}
```

### Configurar Campos Auditáveis (Opcional)

[](#configurar-campos-auditáveis-opcional)

Por padrão, todos os campos `fillable` são auditados. Para personalizar:

```
class Contact extends Model
{
    protected $auditable = ['name', 'email', 'telephone']; // apenas estes
    protected $auditGuard = 'web'; // guard alternativo
}
```

---

🛠 Contribuição
--------------

[](#-contribuição)

Sinta-se à vontade para contribuir! Basta seguir estes passos:

1. Faça um fork do repositório
2. Crie uma branch (`feature/nova-funcionalidade`)
3. Faça um commit das suas alterações
4. Envie um Pull Request

---

📜 Licença
---------

[](#-licença)

Este projeto é distribuído sob a licença MIT. Veja o arquivo [LICENSE](LICENSE) para mais detalhes.

---

💡 **Desenvolvido por [Rise Tech](https://risetech.com.br)**

###  Health Score

44

—

FairBetter than 91% of packages

Maintenance92

Actively maintained with recent releases

Popularity11

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity56

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~31 days

Total

4

Last Release

60d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/160299136?v=4)[Rise Tech](/maintainers/risetechapps)[@risetechapps](https://github.com/risetechapps)

---

Top Contributors

[![risetechapps](https://avatars.githubusercontent.com/u/160299136?v=4)](https://github.com/risetechapps "risetechapps (51 commits)")

---

Tags

laravelcontactsrisetechapps

###  Code Quality

TestsPest

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/risetechapps-contact-for-laravel/health.svg)

```
[![Health](https://phpackages.com/badges/risetechapps-contact-for-laravel/health.svg)](https://phpackages.com/packages/risetechapps-contact-for-laravel)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3345.1M337](/packages/psalm-plugin-laravel)[renatomarinho/laravel-page-speed

Laravel Page Speed

2.5k1.7M11](/packages/renatomarinho-laravel-page-speed)[vinkius-labs/laravel-page-speed

Laravel Page Speed

2.5k9.6k1](/packages/vinkius-labs-laravel-page-speed)[emargareten/inertia-modal

Inertia Modal is a Laravel package that lets you implement backend-driven modal dialogs for Inertia apps.

90128.1k](/packages/emargareten-inertia-modal)[astrotomic/laravel-vcard

A fluent builder class for vCard files.

5332.8k](/packages/astrotomic-laravel-vcard)[linkxtr/laravel-qrcode

A clean, modern, and easy-to-use QR code generator for Laravel

3614.9k](/packages/linkxtr-laravel-qrcode)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
