Modely z konfigurácie
Balíky umožňujú hostiteľom vymeniť modely cez config('<package>.models.*'). ModelResolver::for(string $key, ?string $default = null, ?string $base = null) vybaví zistenie aj overenie naraz: predvolená hodnota platí len pre nenastavený kľúč (chýbajúci, null alebo prázdny — '' či len medzery) a trieda musí existovať, byť Eloquent modelom a byť $base alebo jeho podtriedou. $base je predvolene $default — model balíka, ktorý hostiteľ rozširuje — inak Model. Čokoľvek iné vyhodí InvalidConfigurationException s názvom kľúča; nesprávna trieda sa nikdy potichu nenahradí modelom balíka:
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\PackageToolkit\Support\ModelResolver;
// Resolve + validate a model class from config: absent or blank → the packaged default; anything
// that isn't that class or a subclass of it throws (never a silent fall-back).
$class = ModelResolver::for('comments.models.comment', Comment::class); // class-string<Comment>
$model = ModelResolver::newModel('comments.models.comment', Comment::class); // a fresh instance
// The default is only a suggestion here — a host may name any Eloquent model:
$tenant = ModelResolver::for('comments.models.tenant', Team::class, base: Model::class);
// No default: the key is required, and any Eloquent model is accepted.
$class = ModelResolver::for('comments.models.comment');Ak je predvolená hodnota len návrhom, ktorý môže hostiteľ nahradiť nesúvisiacim modelom, odovzdajte base: Model::class. newModel() prijíma rovnaké argumenty a vráti novú inštanciu zistenej triedy. Model hostiteľa, ktorý nededí z modelu balíka — alebo názov neexistujúcej triedy — zlyhá takto:
// config('comments.models.comment') === App\Models\Post::class — not a Comment
ModelResolver::for('comments.models.comment', Comment::class);
// throws InvalidConfigurationException:
// Configuration value [comments.models.comment] must be a class-string of [<Comment's class>], [App\Models\Post] given.
// config('comments.models.comment') === 'App\Nope' — no such class
// throws the same message, with [App\Nope] given.Trait ResolvesModels
Pre triedy, ktoré z konfigurácie zisťujú viac modelov, obaľuje trait ResolvesModels ModelResolver do dvoch protected metód — modelClass() a newModel() — obe s rovnakými voliteľnými $default a $base a s rovnakými pravidlami:
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\PackageToolkit\Concerns\ResolvesModels;
final class CommentRepository
{
use ResolvesModels;
public function create(array $attributes): Model
{
$comment = $this->newModel('comments.models.comment', Comment::class);
$comment->fill($attributes)->save();
return $comment;
}
public function find(int|string $id): ?Model
{
return $this->modelClass('comments.models.comment', Comment::class)::query()->find($id);
}
}observesModel() v základnom provideri používa ten istý validátor — pozrite Väzby a observery.
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.