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

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 InvalidAttributeValueException

Registrá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 UnknownAttributeException

API 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 all

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.