PHPackages                             andydefer/laravel-addresses - 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. andydefer/laravel-addresses

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

andydefer/laravel-addresses
===========================

Laravel package providing polymorphic addresses with Repository pattern, DTOs, Enums, and Value Objects.

v2.0.0(today)00MITPHPPHP ^8.2

Since Jun 19Pushed todayCompare

[ Source](https://github.com/andydefer/laravel-addresses)[ Packagist](https://packagist.org/packages/andydefer/laravel-addresses)[ RSS](/packages/andydefer-laravel-addresses/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (12)Versions (3)Used By (0)

Laravel Addresses
=================

[](#laravel-addresses)

> Gestion d'adresses polymorphiques pour applications Laravel

[![Latest Version](https://camo.githubusercontent.com/82e259a793c323d26b04ad2c7e7786df3e695ec808b5c7a1cedeb46d0cf6bcf3/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f616e647964656665722f6c61726176656c2d6164647265737365732e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/andydefer/laravel-addresses)[![Total Downloads](https://camo.githubusercontent.com/547c2e9418dcf6ef787d3d502f12f3448078f5d5634a39acfc29d1e73f88d51e/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f616e647964656665722f6c61726176656c2d6164647265737365732e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/andydefer/laravel-addresses)[![PHP Version](https://camo.githubusercontent.com/beebe4a7a7052da7b7f1596516a3d56ad384b6742517a6b56fb0bc77b82b5927/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f616e647964656665722f6c61726176656c2d6164647265737365732e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/andydefer/laravel-addresses)[![License](https://camo.githubusercontent.com/48fca7911a640bee16a6cd9cc0348969cf0a5761123db56d7afffb01cc565b10/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f616e647964656665722f6c61726176656c2d6164647265737365732e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/andydefer/laravel-addresses)

Un package Laravel complet pour gérer des adresses polymorphiques avec le pattern Repository, des DTOs, des Value Objects et une gestion des adresses principales.

---

✨ Fonctionnalités
-----------------

[](#-fonctionnalités)

- ✅ **Adresses polymorphiques** - Attachez des adresses à n'importe quel modèle Eloquent
- ✅ **Types d'adresses multiples** - PRINCIPALE, FACTURATION, LIVRAISON, PROFESSIONNELLE, AUTRE
- ✅ **Gestion de l'adresse principale** - Définissez et récupérez l'adresse principale
- ✅ **Pattern Repository** - Séparation propre de la logique d'accès aux données
- ✅ **Support des DTOs** - Objets de transfert de données typés
- ✅ **Value Objects** - Pays, Code postal, Coordonnées, Date/Heure
- ✅ **Support des métadonnées** - Stockez des données supplémentaires au format JSON
- ✅ **Suppression douce** - Suppression sécurisée avec possibilité de restauration
- ✅ **Filtrage avancé** - Filtrez par type, ville, pays, code postal
- ✅ **Mises à jour brutes** - Mettez à jour avec support des valeurs NULL
- ✅ **Tests complets** - Couverture complète des tests d'intégration

---

📦 Installation
--------------

[](#-installation)

Installez le package via Composer :

```
composer require andydefer/laravel-addresses
```

### Publier les migrations

[](#publier-les-migrations)

```
php artisan vendor:publish --tag=Addresses-migrations
```

### Exécuter les migrations

[](#exécuter-les-migrations)

```
php artisan migrate
```

---

⚙️ Configuration
----------------

[](#️-configuration)

Le package est automatiquement découvert par Laravel. Aucune configuration supplémentaire n'est requise.

Si vous devez personnaliser le Service Provider, ajoutez-le manuellement dans `config/app.php` :

```
'providers' => [
    // ...
    AndyDefer\LaravelAddresses\AddressesServiceProvider::class,
],
```

---

📖 Utilisation
-------------

[](#-utilisation)

### Ajouter une adresse

[](#ajouter-une-adresse)

```
use AndyDefer\LaravelAddresses\Services\AddressService;
use AndyDefer\LaravelAddresses\Records\AddressRecord;
use AndyDefer\LaravelAddresses\Enums\AddressType;
use AndyDefer\PhpVo\Enums\Country;
use AndyDefer\PhpVo\ValueObjects\PostalCodeVO;

class UserController extends Controller
{
    public function store(AddressService $addressService)
    {
        $user = User::find(1);

        $record = AddressRecord::from([
            'street' => '123 Rue Principale',
            'city' => 'Paris',
            'country' => Country::FR,
            'postal_code' => PostalCodeVO::from('75001'),
            'address_type' => AddressType::PRIMARY,
        ]);

        $address = $addressService->add($user, $record);

        return $address;
    }
}
```

### Récupérer des adresses

[](#récupérer-des-adresses)

#### Toutes les adresses

[](#toutes-les-adresses)

```
$addresses = $addressService->all($user);
```

#### Par type

[](#par-type)

```
$billingAddresses = $addressService->byType($user, AddressType::BILLING);
```

#### Adresse principale

[](#adresse-principale)

```
$primary = $addressService->primary($user);
```

#### Trouver par ID

[](#trouver-par-id)

```
$address = $addressService->find($addressId);
```

#### Compter les adresses

[](#compter-les-adresses)

```
$count = $addressService->count($user);
```

#### Vérifier si un type existe

[](#vérifier-si-un-type-existe)

```
$hasShipping = $addressService->hasType($user, AddressType::SHIPPING);
```

### Mettre à jour une adresse

[](#mettre-à-jour-une-adresse)

#### Mise à jour avec un Record (DTO)

[](#mise-à-jour-avec-un-record-dto)

```
$updateRecord = AddressRecord::from([
    'street' => '456 Nouvelle Rue',
    'city' => 'Lyon',
    'country' => Country::FR,
    'postal_code' => PostalCodeVO::from('69001'),
]);

$updated = $addressService->update($addressId, $updateRecord);
```

#### Mise à jour avec des données brutes (incluant NULL)

[](#mise-à-jour-avec-des-données-brutes-incluant-null)

Utilisez `updateRaw()` lorsque vous devez définir des champs à `NULL` dans la base de données :

```
// Définir les métadonnées à NULL
$updated = $addressService->updateRaw($addressId, [
    'metadata' => null,
]);

// Définir les coordonnées à NULL
$updated = $addressService->updateRaw($addressId, [
    'geo_coordinates' => null,
]);

// Mise à jour partielle
$updated = $addressService->updateRaw($addressId, [
    'street' => 'Rue Mise à Jour',
    'address_type' => AddressType::BILLING->value,
]);
```

### Supprimer une adresse

[](#supprimer-une-adresse)

```
$deleted = $addressService->delete($addressId);
// Retourne true si supprimé, false sinon
```

### Gestion de l'adresse principale

[](#gestion-de-ladresse-principale)

#### Définir une adresse comme principale

[](#définir-une-adresse-comme-principale)

```
$addressService->setPrimary($user, $addressId);
```

> **Note :** Cela rétrogradera automatiquement l'ancienne adresse principale en `AddressType::OTHER`.

#### Récupérer l'adresse principale

[](#récupérer-ladresse-principale)

```
$primary = $addressService->primary($user);
```

---

🔍 Filtrer les adresses
----------------------

[](#-filtrer-les-adresses)

Utilisez `AddressFilterRecord` pour un filtrage avancé :

```
use AndyDefer\LaravelAddresses\Records\AddressFilterRecord;
use AndyDefer\Repository\Records\FindByRecord;

$filter = new AddressFilterRecord(
    addressable_type: 'App\Models\User',
    addressable_id: 1,
    address_type: AddressType::BILLING,
    city: 'Paris',
    country: Country::FR,
    postal_code: '75001'
);

$findByRecord = new FindByRecord(
    filters: $filter,
    limit: 10,
    offset: 0,
    order_by: 'created_at',
    order_direction: 'desc'
);

$addresses = $addressRepository->findBy($findByRecord);
```

---

📚 Référence de l'API
--------------------

[](#-référence-de-lapi)

### AddressService

[](#addressservice)

MéthodeDescriptionRetourne`add(Model $addressable, AddressRecord $record)`Créer une nouvelle adresse`Model``update(int $addressId, AddressRecord $record)`Mettre à jour une adresse avec DTO`Model``updateRaw(int $addressId, array $data)`Mettre à jour avec données brutes (NULL)`Model``delete(int $addressId)`Supprimer une adresse`bool``all(Model $addressable)`Récupérer toutes les adresses`Collection``byType(Model $addressable, AddressType $type)`Récupérer les adresses par type`Collection``primary(Model $addressable)`Récupérer l'adresse principale`?Model``setPrimary(Model $addressable, int $addressId)`Définir l'adresse principale`void``find(int $addressId)`Trouver une adresse par ID`?Model``count(Model $addressable)`Compter les adresses`int``hasType(Model $addressable, AddressType $type)`Vérifier si un type existe`bool`### AddressType Enum

[](#addresstype-enum)

CasValeur`AddressType::PRIMARY``'primary'``AddressType::BILLING``'billing'``AddressType::SHIPPING``'shipping'``AddressType::WORK``'work'``AddressType::OTHER``'other'`---

🎯 Value Objects
---------------

[](#-value-objects)

Le package supporte les Value Objects suivants de `andydefer/php-vo` :

Value ObjectDescriptionExemple`Country`Enum des pays`Country::FR`, `Country::US``PostalCodeVO`Code postal`PostalCodeVO::from('75001')``CoordinatesVO`Coordonnées géographiques`CoordinatesVO::from(['latitude' => 48.8566, 'longitude' => 2.3522])``DateTimeVO`Date/heure`DateTimeVO::from('2024-01-01 12:00:00')`### Accesseurs dans le modèle Address

[](#accesseurs-dans-le-modèle-address)

Le modèle `Address` fournit des accesseurs pratiques :

```
$address = Address::find(1);

// Accès sous forme de Value Objects
$postalCode = $address->postalCode;      // PostalCodeVO
$coordinates = $address->coordinates;     // CoordinatesVO
$metadata = $address->metadata;           // StrictDataObject
$createdAt = $address->createdAt;         // DateTimeVO
$updatedAt = $address->updatedAt;         // DateTimeVO
$deletedAt = $address->deletedAt;         // DateTimeVO
```

---

🧪 Tests
-------

[](#-tests)

### Exécuter les tests

[](#exécuter-les-tests)

```
composer test
```

### Exécuter uniquement les tests unitaires

[](#exécuter-uniquement-les-tests-unitaires)

```
composer test-unit
```

### Exécuter uniquement les tests d'intégration

[](#exécuter-uniquement-les-tests-dintégration)

```
composer test-integration
```

### Configuration des tests

[](#configuration-des-tests)

Le package utilise `orchestra/testbench` pour les tests d'intégration avec une base de données SQLite en mémoire.

---

📝 Schéma de la base de données
------------------------------

[](#-schéma-de-la-base-de-données)

```
CREATE TABLE addresses (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    addressable_type VARCHAR(255) NOT NULL,
    addressable_id BIGINT UNSIGNED NOT NULL,
    street VARCHAR(255) NULL,
    city VARCHAR(255) NULL,
    country VARCHAR(2) NULL,
    postal_code VARCHAR(20) NULL,
    geo_coordinates JSON NULL,
    address_type VARCHAR(20) NULL,
    metadata JSON NULL,
    created_at TIMESTAMP NULL,
    updated_at TIMESTAMP NULL,
    deleted_at TIMESTAMP NULL,

    INDEX idx_addressable (addressable_type, addressable_id),
    INDEX idx_address_type (addressable_type, addressable_id, address_type),
    INDEX idx_country (country),
    INDEX idx_postal_code (postal_code)
);
```

---

🔧 Développement
---------------

[](#-développement)

### Style de code

[](#style-de-code)

```
./vendor/bin/pint
```

### Analyse statique

[](#analyse-statique)

```
./vendor/bin/phpstan analyse
./vendor/bin/psalm
```

---

📄 Journal des modifications
---------------------------

[](#-journal-des-modifications)

Veuillez consulter le [CHANGELOG](CHANGELOG.md) pour plus d'informations sur les modifications récentes.

---

🤝 Contribuer
------------

[](#-contribuer)

Veuillez consulter [CONTRIBUTING](CONTRIBUTING.md) pour plus de détails.

### Flux de développement

[](#flux-de-développement)

1. Forkez le dépôt
2. Créez une branche de fonctionnalité (`git checkout -b feature/amazing-feature`)
3. Apportez vos modifications
4. Exécutez les tests (`composer test`)
5. Committez vos modifications (`git commit -m 'Ajouter une fonctionnalité géniale'`)
6. Poussez vers la branche (`git push origin feature/amazing-feature`)
7. Ouvrez une Pull Request

---

📦 Dépendances
-------------

[](#-dépendances)

- [`andydefer/php-vo`](https://github.com/andydefer/php-vo) - Value Objects
- [`andydefer/laravel-repository`](https://github.com/andydefer/laravel-repository) - Implémentation du pattern Repository

---

👨‍💻 Auteur
----------

[](#‍-auteur)

**Andy Kani**

- GitHub: [@andydefer](https://github.com/andydefer)
- Email:

---

📄 Licence
---------

[](#-licence)

La licence MIT (MIT). Veuillez consulter le [Fichier de licence](LICENSE.md) pour plus d'informations.

---

⭐ Support
---------

[](#-support)

Si vous trouvez ce package utile, n'hésitez pas à lui donner une ⭐ sur GitHub !

---

###  Health Score

40

—

FairBetter than 86% of packages

Maintenance100

Actively maintained with recent releases

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity47

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 ~0 days

Total

2

Last Release

0d ago

Major Versions

v1.0.0 → v2.0.02026-06-19

### Community

Maintainers

![](https://www.gravatar.com/avatar/2170ec3fbad9eb4b002661ab4f58b1cc374eae4293b92904c6a74bc2818bd570?d=identicon)[andydefer](/maintainers/andydefer)

---

Top Contributors

[![andydefer](https://avatars.githubusercontent.com/u/124321745?v=4)](https://github.com/andydefer "andydefer (2 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan, Psalm, Rector

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/andydefer-laravel-addresses/health.svg)

```
[![Health](https://phpackages.com/badges/andydefer-laravel-addresses/health.svg)](https://phpackages.com/packages/andydefer-laravel-addresses)
```

###  Alternatives

[markwalet/nova-modal-response

A Laravel Nova asset for Modal responses on an action.

17818.7k](/packages/markwalet-nova-modal-response)[crumbls/layup

A visual page builder plugin for Filament 5 — Divi-style grid layouts with extensible widgets.

591.7k1](/packages/crumbls-layup)[tomshaw/electricgrid

A feature-rich Livewire package designed for projects that require dynamic, interactive data tables.

119.2k](/packages/tomshaw-electricgrid)

PHPackages © 2026

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