---
title: "Fasáda Contacts — Contacts for Laravel | Roundly"
description: "Contacts::for($owner) pre adresár vlastníka, Contacts::verification() pre overovanie, ploché volania pre jeden kontakt — plus builder a ContactData."
url: https://roundly-consulting.com/sk/open-source/navody/contacts-for-laravel/fasada
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Contacts for Laravel](https://roundly-consulting.com/sk/open-source/navody/contacts-for-laravel.md)

# Fasáda Contacts

Fasáda Contacts je odporúčaný vstupný bod. Contacts::for($owner) vráti adresár kontaktov vlastníka, Contacts::verification() obsluhuje overovanie tokenom či kódom a operácie s jedným kontaktom sú ploché. Každý zápis prechádza vyhradenou akciou, takže normalizácia, validácia, správa primárnych kontaktov a udalosti sú rovnaké bez ohľadu na vstupný bod:

```php
use RoundlyConsulting\Contacts\DataTransferObjects\ContactData;
use RoundlyConsulting\Contacts\Enums\ContactType;
use RoundlyConsulting\Contacts\Facades\Contacts;

// Add — normalized + validated, primary guaranteed unique per kind.
Contacts::for($user)->email('a@b.com')->label('Work')->primary()->add();
Contacts::for($user)->phone('+421 900 000 000')->label('Mobile')->add();
Contacts::for($user)->type('whatsapp')->value('+421900123456')->add();   // a registered custom kind
Contacts::for($user)->add(new ContactData(ContactType::Url, 'example.com'));

// Read and export.
Contacts::for($user)->all();                        // ordered by position
Contacts::for($user)->ofType(ContactType::Email);
Contacts::for($user)->primary(ContactType::Email);  // ?Contact
Contacts::for($user)->vCard();                      // vCard 3.0 string

// One contact.
Contacts::update($contact, new ContactData(ContactType::Email, 'new@b.com'));
Contacts::setPrimary($contact);
Contacts::delete($contact);

// Verification.
$token = Contacts::verification()->request($contact);
Contacts::verification()->confirm($contact, $token);
Contacts::verification()->markVerified($contact);
```

## Metódy fasády

| Metóda | Vracia | Popis |
| --- | --- | --- |
| `for(Model $owner)` | `ContactBook` | Adresár kontaktov vlastníka — fluentné buildery, pridanie, synchronizácia, čítanie a export vCard. |
| `verification()` | `ContactVerification` | Prístup k overovaniu: request(), confirm(), markVerified(). |
| `update(Contact $contact, ContactData $data)` | `Contact` | Prepíše kontakt; príznak primárneho ho povýši, nová hodnota alebo druh zruší overenie, štruktúrovaná adresa nahradí tú, ktorú kontakt má. Spustí ContactUpdated. |
| `delete(Contact $contact)` | `void` | Soft delete; zmazanie primárneho povýši ďalší kontakt (auto\_primary). Spustí ContactDeleted. |
| `setPrimary(Contact $contact)` | `Contact` | Povýši kontakt a zosadí iný primárny kontakt vlastníka rovnakého druhu; spustí PrimaryContactChanged. Soft-zmazaný kontakt vyhodí PrimaryContactConflict. |
| `sharedWith(Connectable $owner)` | `Collection` | Kontakty prepojené s vlastníkom (pozrite Príslušnosti a vzťahy). |
| `validationRules(string $key = 'contacts')` | `array` | Pravidlá contacts.\* pre opakovateľný formulár. |
| `fake()` | `ContactsFake` | Nahradí manažéra zaznamenávajúcim fake (pozrite Testovanie). |

## Adresár kontaktov

Contacts::for($owner) — alebo $owner->contactBook() na modeli s HasContacts — vráti ContactBook obmedzený na daného vlastníka:

| Metóda | Vracia | Popis |
| --- | --- | --- |
| `email() / phone() / url() / address(string $value)` | `PendingContact` | Začne fluentný kontakt daného druhu. |
| `structuredAddress(AddressData\|array $data)` | `PendingContact` | Začne adresný kontakt so štruktúrovanou adresou. |
| `type(ContactType\|string $type)` | `PendingContact` | Začne kontakt ľubovoľného druhu — ContactType alebo registrovaný vlastný druh. |
| `add(ContactData $data)` | `Contact` | Pridá kontakt z DTO; spustí ContactAdded. |
| `sync(ContactType\|string $type, array $items)` | `EloquentCollection` | Zosúladí kontakty vlastníka jedného druhu — ContactType alebo registrovaného vlastného druhu — so zoznamom; odstránený primárny nahradí prvý synchronizovaný kontakt. |
| `all()` | `EloquentCollection` | Všetky kontakty vlastníka podľa poradia. |
| `ofType(ContactType\|string $type)` | `EloquentCollection` | Jeden druh podľa poradia. |
| `primary(ContactType\|string $type)` | `?Contact` | Primárny kontakt druhu alebo null. |
| `vCard()` | `string` | Vizitka vCard 3.0 s kontaktmi vlastníka. |

## Prístup k overovaniu

Contacts::verification() vráti ContactVerification (pozrite Overovanie):

| Metóda | Vracia | Popis |
| --- | --- | --- |
| `request(Contact $contact)` | `string` | Vydá kód alebo token a vráti otvorený text; spustí ContactVerificationRequested. |
| `confirm(Contact $contact, string $token)` | `Contact` | Potvrdí token a označí kontakt ako overený; spustí ContactVerified. |
| `markVerified(Contact $contact, ?CarbonInterface $at = null)` | `Contact` | Označí kontakt ako overený bez tokenu (idempotentne); spustí ContactVerified. |

## Fluentný builder

Metódy adresára email(), phone(), url(), address(), structuredAddress() a type() začnú PendingContact. Zreťazte settery a zavolajte add():

```php
$contact = Contacts::for($company)
    ->email('Sales@Example.com')      // or ->phone() / ->url() / ->address()
    ->label('Sales')                  // free-text label for this contact
    ->name('Northwind sales desk')    // display name
    ->category('Suppliers')           // group contacts
    ->meta(['hours' => '9-17'])       // arbitrary JSON metadata
    ->primary()                       // ->primary(false) to opt out
    ->add();                          // terminal: validates, saves, returns Contact

// Explicit type + value
Contacts::for($company)->type(ContactType::Social)->value('@northwind')->add();
```

- email(), phone(), url(), address() — nastavia druh aj hodnotu jedným volaním.
- type(ContactType|string) + value(string) — nastavia ich samostatne; registrovaný vlastný druh si zachová svoj surový názov a bez typu je druh custom.
- label(), name(), category(), meta(array) — popisné polia.
- primary(bool $primary = true) — vyžiada primárny stav.
- structuredAddress(AddressData|array) — pripojí štruktúrovanú adresu (pozrite Štruktúrované adresy). Builder bez zvoleného druhu sa stane adresou; explicitne zvolený iný druh — type('whatsapp'), email() — add() odmietne s InvalidContactValue bez ohľadu na poradie volaní.
- add() — terminálne volanie: zvaliduje, uloží a vráti Contact.

## ContactData

ContactData je readonly DTO, ktoré prijíma každý zápis. Vytvoríte ho pomenovanými argumentmi alebo z poľa; normalized() vráti normalizovanú kópiu:

```php
use RoundlyConsulting\Contacts\DataTransferObjects\ContactData;
use RoundlyConsulting\Contacts\Enums\ContactType;

$data = new ContactData(
    type: ContactType::Phone,
    value: '+421 900 000 000',
    label: 'Office',
    name: null,
    category: 'Headquarters',
    isPrimary: false,
    position: null,           // null = next free position within the kind
    meta: ['ext' => '204'],
    kind: null,               // null = the type's own value; set it for custom kinds
);

$data = ContactData::fromArray([
    'type' => 'phone',        // ContactType or string
    'value' => '+421 900 000 000',
    'is_primary' => true,     // or 'isPrimary'
]);

$data->normalized()->value;   // '+421900000000'
```

## Úprava a mazanie

```php
use RoundlyConsulting\Contacts\Models\Contact;

$updated = Contacts::update($contact, new ContactData(
    ContactType::Email,
    'jane.doe@example.com',
    label: 'Work',
));

$updated->isVerified();                        // false — a new value needs a new verification

Contacts::delete($contact);                    // soft delete + ContactDeleted
Contact::withTrashed()->find($contact->id)->restore();   // addresses + connections are back
```

update() hodnotu znova normalizuje a zvaliduje. Druh, hodnota, popis, kategória a meta sa nahradia hodnotami z DTO — null v popise či kategórii ich vymaže — kým name a position sa zmenia, len ak sú nastavené. Zmena hodnoty alebo druhu zruší overenie a zneplatní čakajúci token. isPrimary: true kontakt povýši.

Presun kontaktu do iného druhu zachová jeden primárny kontakt na druh: primárny kontakt, ktorý vstúpi do druhu s vlastným primárnym, sa zosadí (pokiaľ isPrimary nežiada opak — vtedy sa zosadí ten druhý). Pri zapnutom auto\_primary druh, ktorý opustil, povýši svoj ďalší kontakt a druh bez primárneho, do ktorého vstúpil, nejaký dostane. Zmazanie primárneho kontaktu povýši ďalší kontakt jeho druhu rovnako.

## Nízkoúrovňový prístup

```php
// The raw relation still works — but it skips normalization, validation,
// auto-primary and events. Prefer the trait, the facade or the builder.
$user->contacts()->create([
    'type' => 'email',
    'name' => 'Jane Doe',
    'value' => 'jane@example.com',
]);
```

Relácia contacts(), scopy, cast meta na kolekciu aj priame volania create() naďalej fungujú. Normalizácia, validácia a automatický primárny kontakt sa uplatnia len cez akcie, fasádu a pomocné metódy traitu. Zrušenie overenia pri zmene hodnoty platí všade, vrátane priamych zápisov.

## Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

[Ďalšie spôsoby podpory vrátane kryptomien](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/contacts-for-laravel.md)
