Modely a schéma
Šesť tabuliek, šesť modelov. Všetky podporujú soft delete a Team, Member, Invite a JoinRequest pretypujú meta na Collection; mass assignment je otvorený, pretože zapisovať sa má cez fasádu a jej akcie:
| Tabuľka | Model | Hlavné stĺpce |
|---|---|---|
teams | Team | name, is_public, owner morph (nullable), meta json |
team_members | Member | team_id, member morph, role, accepted_invite_id (pri zmazaní pozvánky null), meta, expires_at (index) — unikátne (team_id, member morph), vrátane mäkko zmazaných riadkov |
team_invites | Invite | team_id, code (unikátny), role, email (index), invited_by morph, meta, uses, max_uses, expires_at |
team_join_requests | JoinRequest | team_id, requester morph, requested_role, status (index), message, meta, responded_by morph, responded_at, expires_at |
team_roles | RoleDefinition | key (unikátny), name, permissions json, description — databázový driver rolí |
team_role_overrides | TeamRole | team_id, key, name, permissions json, description — unikátne (team_id, key) |
Riadky tabuliek odkazujúcich na teams sa kaskádovo zmažú, keď sa tím zmaže natrvalo (force delete). Morph stĺpce sa riadia podľa key_type — pozrite Konfigurácia.
Nahradenie modelu
Nasmerujte kľúč teams.models.* na vlastnú podtriedu — každá relácia aj akcia načíta triedu z konfigurácie. Trieda musí byť model z balíka alebo jeho podtrieda; čokoľvek iné vyhodí InvalidConfigurationException s názvom kľúča — nikdy sa potichu nenahradí modelom z balíka:
namespace App\Models;
use Illuminate\Database\Eloquent\Relations\HasMany;
use RoundlyConsulting\Teams\Models\Team as BaseTeam;
class Team extends BaseTeam
{
public function projects(): HasMany
{
return $this->hasMany(Project::class);
}
}// config/teams.php
'models' => [
'team' => App\Models\Team::class,
'member' => RoundlyConsulting\Teams\Models\Member::class,
'invite' => RoundlyConsulting\Teams\Models\Invite::class,
'team_role' => RoundlyConsulting\Teams\Models\TeamRole::class,
'join_request' => RoundlyConsulting\Teams\Models\JoinRequest::class,
],Vlastný role provider
Ak chcete roly načítavať odinakiaľ — napríklad z externej služby — zaregistrujte kontrakt RoleProvider nanovo po registrácii balíka, napríklad v metóde register() vášho AppServiceProvidera. Balík ho registruje ako scoped; urobte to isté, aby sa provider, ktorý si drží mapu rolí, vytvoril nanovo pre každý request a job vo fronte:
// app/Providers/AppServiceProvider.php → register()
use RoundlyConsulting\Teams\Roles\Contracts\RoleProvider;
// Scoped, like the package's own binding: a fresh provider per request or queued job.
$this->app->scoped(RoleProvider::class, fn () => new \App\Teams\MyRoleProvider());namespace RoundlyConsulting\Teams\Roles\Contracts;
interface RoleProvider
{
/**
* Define a role — an upsert on $key: registering a key again replaces its
* name, permissions and description, whichever provider backs it.
*
* @param list<string|Permission> $permissions
*/
public function register(string $key, string $name, array $permissions = [], string $description = ''): Role;
public function find(string $key): ?Role;
/** @return array<string, Role> */
public function all(): array;
}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.