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

Teams integruje šesť sesterských balíkov Roundly. Sú to pevné závislosti, takže ich funkcie sú na dodanom modeli Team vždy k dispozícii:

BalíkČo pridáva tímu
enums-for-laravelJoinRequestStatus a JoinPolicy získajú labels(), options(), validationRule(), values() a vyhľadávanie hodnôt.
options-for-laravelTypované nastavenia tímu — pravidlá vstupu, limit miest, predvolená rola, povinné schválenie.
contacts-for-laravelKontaktné a fakturačné e-maily, telefóny a URL s primárnym kontaktom pre každý typ.
addresses-for-laravelAdresár fakturačných, fyzických a korešpondenčných adries s typovaným vyhľadávaním.
approvals-for-laravelVoliteľné schvaľovanie žiadostí o pripojenie viacerými adminmi, s výsledkom prepísaným späť do žiadosti.
connections-for-laravelPrepojenia tím–tím a tím–používateľ s oprávneniami a expiráciou.

Každý má vlastné tabuľky — migrácie options, contacts, addresses, connections a approvals, ktoré ste publikovali pri inštalácii.

Schvaľovanie viacerými adminmi

Zapnite TEAMS_APPROVALS=true a žiadosť o pripojenie pošlite cez schvaľovací engine namiesto jedného schvaľovateľa. Natívna cesta joinRequests()->approve() / deny() zostáva nedotknutá:

use RoundlyConsulting\Approvals\Enums\ApprovalRule;
use RoundlyConsulting\Approvals\Facades\Approvals;
use RoundlyConsulting\Teams\Facades\Teams;

// .env → TEAMS_APPROVALS=true
$request = Teams::for($team)->joinRequests()
    ->requireApprovalFrom([$admin1, $admin2])
    ->rule(ApprovalRule::Quorum)
    ->quorum(2)
    ->open($user);   // opens pending; an ApprovalRequest is created

// Admins sign off through the approvals engine:
Approvals::for($request)->as($admin1)->approve();
Approvals::for($request)->as($admin2)->approve();   // quorum reached — the member is added

requireApprovalFrom(), rule() a quorum() vracajú nový handle, takže pripravený handle si môžete odložiť a použiť znova. Keď engine rozhodne, SyncJoinRequestStatusFromApproval prenesie výsledok do žiadosti cez Teams::for($team)->joinRequests() — takže ho Teams::fake() zaznamená: schválenie pridá člena a spustí JoinRequestApproved; zamietnutie označí žiadosť ako Denied a spustí JoinRequestDenied; zrušenie a expirácia nerobia nič. Žiadosť, ktorú už niekto vybavil ručne (alebo vypršala), si svoj výsledok ponechá — engine ho nikdy neprevráti. Listener koná, len kým je teams.approvals.enabled zapnuté. Bez rule() a quorum() platia teams.approvals.rule a .quorum; pri vypnutom schvaľovaní ide open() natívnou cestou.

Kontakty

use RoundlyConsulting\Contacts\Enums\ContactType;
use RoundlyConsulting\Teams\Facades\Teams;

// The team's ContactBook — the same as Contacts::for($team):
Teams::for($team)->contacts()->email('[email protected]')->label('billing')->primary()->add();
Teams::for($team)->contacts()->phone('+441234567891')->label('billing')->add();
Teams::for($team)->contacts()->url('https://status.example.com')->label('status')->add();
Teams::for($team)->contacts()->primary(ContactType::Email);   // Contact|null

// The HasContacts trait on Team works too:
$team->addEmail('[email protected]', 'support', primary: true);
$team->addPhone('+441234567890', 'ops');
$team->addUrl('https://example.com', 'website');
$team->primaryEmail();                                        // Contact|null

Adresy

use RoundlyConsulting\Addresses\DataTransferObjects\AddressData;
use RoundlyConsulting\Addresses\Enums\AddressType;
use RoundlyConsulting\Teams\Facades\Teams;

// The team's AddressBook — the same as Addresses::for($team):
Teams::for($team)->addresses()->add(new AddressData(
    city: 'London', street: '1 King St', postalCode: 'EC1A 1AA',
    countryIso: 'GB', type: AddressType::Billing, isPrimary: true,
));
Teams::for($team)->addresses()->primary(AddressType::Billing);

// The HasAddresses trait on Team works too:
$team->createAddress(city: 'Berlin', street: 'Example Str. 1', postalCode: '10115', countryIsoCode: 'DE');
$team->getPrimaryAddressOfType(AddressType::Billing);

contacts() a addresses() vám dajú ContactBook a AddressBook tímu, takže platia fasády týchto balíkov — aj ich fakes. Oba balíky majú v traite metódu addAddress(); na modeli Team vyhráva štruktúrovaná verzia z addresses a voľnotextová verzia z contacts je dostupná ako addContactAddress().

Prepojenia tímov

use RoundlyConsulting\Teams\Facades\Teams;
use RoundlyConsulting\Teams\Models\Team;

// The connections facade scoped to the team — the same as Connections::from($team):
Teams::for($team)->connections()->to($partnerTeam)->withPermissions('share:roster')->connect();
Teams::for($team)->connections()->to($partnerTeam)->disconnect();

// The HasConnections trait on Team works too:
$team->connectTo($partnerTeam, ['share:roster']);   // team ↔ team
$team->inviteConnection($partnerTeam);              // a pending invitation
$partnerTeam->acceptConnectionFrom($team);

$team->isConnectedTo($partnerTeam);
$team->connectablesOfType(Team::class);             // partner teams
$team->hasPermissionThroughConnection($partnerTeam, 'share:roster');

Team implementuje Connectable, takže sa môže prepojiť s inými tímami alebo s akýmkoľvek modelom typu Connectable, napríklad s používateľom, ktorý používa trait z balíka connections.

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.