Definície a validácia
Zaregistrujte známe atribúty s typom a validačnými pravidlami. Zaregistrované atribúty sa pri zápise overujú vždy a ukladajú sa v type z definície:
use RoundlyConsulting\Attributes\Facades\Attributes;
use RoundlyConsulting\Attributes\DataTransferObjects\AttributeDefinitionData;
use RoundlyConsulting\Attributes\Enums\AttributeType;
Attributes::define(new AttributeDefinitionData(
name: 'rating',
type: AttributeType::Integer,
rules: ['min:1', 'max:5'],
));
Attributes::for($product)->set('rating', 9); // throws InvalidAttributeValueExceptionRegistrácia definícií
Definície registrujte v metóde boot() service providera alebo ich zadajte cez konfiguračný kľúč definitions (pozrite Konfigurácia):
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Validation\Rule;
use RoundlyConsulting\Attributes\DataTransferObjects\AttributeDefinitionData;
use RoundlyConsulting\Attributes\Enums\AttributeType;
use RoundlyConsulting\Attributes\Facades\Attributes;
class AppServiceProvider extends ServiceProvider
{
public function boot(): void
{
Attributes::defineMany(
new AttributeDefinitionData('rating', AttributeType::Integer, rules: ['min:1', 'max:5']),
new AttributeDefinitionData('size', AttributeType::String_, rules: [Rule::in(['S', 'M', 'L'])]),
new AttributeDefinitionData('launched_at', AttributeType::DateTime),
new AttributeDefinitionData('tags', AttributeType::Array_, rules: ['max:10']),
);
}
}AttributeDefinitionData prijíma name, type, rules, default, required, unique a encrypted — všetko za type je voliteľné. Prípady AttributeType, ktoré kolidujú s kľúčovými slovami PHP, majú na konci podčiarkovník: String_, Float_ a Array_.
Ako validácia funguje
- Ako prvé sa uplatní pravidlo samotného typu — string, integer, numeric (float), boolean, array alebo date (datetime) — a za ním vaše pravidlá.
- Pravidlá môžu byť reťazce aj objekty pravidiel, presne ako vo validátore Laravelu; názov atribútu slúži v hláseniach ako označenie poľa.
- Hodnoty null sa nikdy nevalidujú.
- Nedefinované názvy sa nevalidujú vôbec — pokiaľ ich neodmietne prísny režim.
Prísny režim
Nastavte ATTRIBUTES_STRICT=true a každý nezaregistrovaný názov atribútu sa odmietne — zápis jeho hodnoty či metadát vyhodí UnknownAttributeException. Za zaregistrovaný sa považuje názov s globálnou definíciou (konfigurácia alebo Attributes::define()) alebo s definíciou v schéme modelu vlastníka:
// .env: ATTRIBUTES_STRICT=true
Attributes::define(new AttributeDefinitionData('color', AttributeType::String_));
Attributes::for($product)->set('color', 'white'); // registered: fine
Attributes::for($product)->set('nickname', 'Blue'); // throws UnknownAttributeExceptionAPI definícií
Metódy fasády pre definície delegujú na RoundlyConsulting\Attributes\Registry\AttributeRegistry, singleton v kontajneri, ktorý definície uchováva:
| Metóda | Účel |
|---|---|
define($definition) / defineMany(...$definitions) | Zaregistruje (alebo nahradí) definície. |
has($name) / get($name) / all() | Prehľad globálnych definícií. |
forget($name) / flush() | Zruší registráciu jednej definície alebo všetkých. |
resolveFor(?$owner, $name) | Definícia platná pre vlastníka — najprv schéma jeho modelu, potom globálna. |
definitionsFor($owner) | Globálne definície prekryté schémou modelu vlastníka. |
default($name, ?$owner = null) | Predvolená hodnota definície. |
requiredNames() | Názvy povinných globálnych definícií. |
validate($name, $value) / validateFor(?$owner, $name, $value) | Overí hodnotu; vyhodí InvalidAttributeValueException. |
assertUnique($owner, $name, $value) | Kontrola jedinečnosti; vyhodí DuplicateAttributeValueException. |
isStrict() / assertKnown($name, ?$owner = null) | Stav a kontrola prísneho režimu — s vlastníkom sa započíta aj schéma jeho modelu; vyhodí UnknownAttributeException. |
use RoundlyConsulting\Attributes\Facades\Attributes;
Attributes::has('rating'); // bool
Attributes::get('rating')?->rules; // ['min:1', 'max:5']
Attributes::all(); // array<string, AttributeDefinitionData>
Attributes::definitionsFor($product); // global + the model's own schema
Attributes::resolveFor($product, 'rating'); // the definition that applies to this owner
Attributes::default('retries', $product); // a definition's default value
Attributes::requiredNames(); // required names among global definitions
Attributes::validate('rating', 4); // throws InvalidAttributeValueException if invalid
Attributes::forget('rating'); // unregister one
Attributes::flush(); // unregister allPrejavte 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.