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:
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('[email protected]')->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, '[email protected]'));
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. 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. |
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 $type, array $items) | EloquentCollection | Zosúladí kontakty vlastníka jedné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():
$contact = Contacts::for($company)
->email('[email protected]') // 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).
- 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:
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
use RoundlyConsulting\Contacts\Models\Contact;
$updated = Contacts::update($contact, new ContactData(
ContactType::Email,
'[email protected]',
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 backupdate() 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
// 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' => '[email protected]',
]);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 kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
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.