NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Contacts for Laravel

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ódaVraciaPopis
for(Model $owner)ContactBookAdresár kontaktov vlastníka — fluentné buildery, pridanie, synchronizácia, čítanie a export vCard.
verification()ContactVerificationPrístup k overovaniu: request(), confirm(), markVerified().
update(Contact $contact, ContactData $data)ContactPrepíše kontakt; príznak primárneho ho povýši, nová hodnota alebo druh zruší overenie. Spustí ContactUpdated.
delete(Contact $contact)voidSoft delete; zmazanie primárneho povýši ďalší kontakt (auto_primary). Spustí ContactDeleted.
setPrimary(Contact $contact)ContactPovýši kontakt a zosadí iný primárny kontakt vlastníka rovnakého druhu; spustí PrimaryContactChanged.
sharedWith(Connectable $owner)CollectionKontakty prepojené s vlastníkom (pozrite Príslušnosti a vzťahy).
validationRules(string $key = 'contacts')arrayPravidlá contacts.* pre opakovateľný formulár.
fake()ContactsFakeNahradí 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ódaVraciaPopis
email() / phone() / url() / address(string $value)PendingContactZačne fluentný kontakt daného druhu.
structuredAddress(AddressData|array $data)PendingContactZačne adresný kontakt so štruktúrovanou adresou.
type(ContactType|string $type)PendingContactZačne kontakt ľubovoľného druhu — ContactType alebo registrovaný vlastný druh.
add(ContactData $data)ContactPridá kontakt z DTO; spustí ContactAdded.
sync(ContactType $type, array $items)EloquentCollectionZosúladí kontakty vlastníka jedného druhu so zoznamom; odstránený primárny nahradí prvý synchronizovaný kontakt.
all()EloquentCollectionVšetky kontakty vlastníka podľa poradia.
ofType(ContactType|string $type)EloquentCollectionJeden druh podľa poradia.
primary(ContactType|string $type)?ContactPrimárny kontakt druhu alebo null.
vCard()stringVizitka vCard 3.0 s kontaktmi vlastníka.

Prístup k overovaniu

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

MetódaVraciaPopis
request(Contact $contact)stringVydá kód alebo token a vráti otvorený text; spustí ContactVerificationRequested.
confirm(Contact $contact, string $token)ContactPotvrdí token a označí kontakt ako overený; spustí ContactVerified.
markVerified(Contact $contact, ?CarbonInterface $at = null)ContactOznačí 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 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

// 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 kryptomien

Odoslaní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.