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

Triedy metrík

Pre metriky, ktoré používate na viacerých miestach dashboardu, rozšírte základný typ a implementujte calculate(), ktorá vráti zodpovedajúci objekt výsledku:

TypRozšírtecalculate() vraciaVhodné pre
ValueRoundlyConsulting\Metrics\Types\Value\ValueValueResultJedno číslo, voliteľne oproti predchádzajúcemu obdobiu
TrendRoundlyConsulting\Metrics\Types\Trend\TrendTrendResultČasový rad (čiarový či plošný graf)
ProgressRoundlyConsulting\Metrics\Types\Progress\ProgressProgressResultAktuálna hodnota oproti cieľu (progress bar)
PartitionRoundlyConsulting\Metrics\Types\Partition\PartitionPartitionResultRozpad podľa skupín (koláčový či stĺpcový graf)

Value

use App\Models\User;
use RoundlyConsulting\Metrics\Types\Result;
use RoundlyConsulting\Metrics\Types\Value\Value;

final class RegisteredUsers extends Value
{
    protected function calculate(): Result
    {
        return $this->count(User::query());
    }
}

RegisteredUsers::make()->range('TODAY')->toArray();

Trend

use App\Models\User;
use RoundlyConsulting\Metrics\Types\Result;
use RoundlyConsulting\Metrics\Types\Trend\Trend;

final class RegisteredUsersTrend extends Trend
{
    protected function calculate(): Result
    {
        return $this->count(User::query(), 'created_at');
    }
}

RegisteredUsersTrend::make()->hourly()->range('TODAY')->toArray();

Progress

Metrika Progress porovnáva aktuálnu hodnotu s cieľom target (predvolene 100). Jej predvolené nastavenia definujte raz v setup():

use App\Models\Subscription;
use RoundlyConsulting\Metrics\Types\Progress\Progress;
use RoundlyConsulting\Metrics\Types\Result;

final class MonthlyRevenueGoal extends Progress
{
    protected function setup(): void
    {
        $this->target(10000)->range('MTD');
    }

    protected function calculate(): Result
    {
        return $this->sum(Subscription::query(), 'amount');
    }
}

shouldBeAvoided() použite, keď je cieľ stropom, pod ktorým chcete zostať — napríklad chybový rozpočet alebo limit výdavkov —, a nie métou, ktorú chcete dosiahnuť. Vo výsledku sa prejaví ako avoid, aby ho UI mohlo vhodne zafarbiť:

use App\Models\Incident;
use RoundlyConsulting\Metrics\Types\Progress\Progress;
use RoundlyConsulting\Metrics\Types\Result;

final class ErrorBudget extends Progress
{
    protected function setup(): void
    {
        $this->target(50)->shouldBeAvoided()->range('MTD');   // stay under 50 this month
    }

    protected function calculate(): Result
    {
        return $this->count(Incident::query());
    }
}

// result => [..., 'target' => 50.0, 'avoid' => true, ...]

Partition

use App\Models\User;
use RoundlyConsulting\Metrics\Types\Partition\Partition;
use RoundlyConsulting\Metrics\Types\Result;

final class UsersByPlan extends Partition
{
    protected function calculate(): Result
    {
        // count of users grouped by the `plan` column
        return $this->count(User::query(), 'plan');
    }
}

Predvolené nastavenia v setup()

setup() sa spúšťa v konštruktore, po predvolených hodnotách z konfigurácie. Prezentáciu a správanie nastavte tam raz namiesto opakovania pri každom volaní — fluent volania na inštancii majú stále prednosť:

use App\Models\Order;
use RoundlyConsulting\Metrics\Enums\Period;
use RoundlyConsulting\Metrics\Types\Result;
use RoundlyConsulting\Metrics\Types\Value\Value;

final class Revenue extends Value
{
    protected function setup(): void
    {
        $this->withChangeAgainstPreviousPeriod();

        $this->name('Revenue')
            ->description('Paid orders in the selected period')
            ->prefix('$')
            ->precision(2)
            ->range(Period::MonthToDate);
    }

    protected function calculate(): Result
    {
        return $this->sum(Order::query()->where('status', 'paid'), 'total');
    }
}

// setup() runs in the constructor, so call-site fluent calls still win:
Revenue::make()->range(Period::LastMonth)->toArray();

Spoločné fluent API

Každá metrika — triedna aj inline — dedí od abstraktnej triedy RoundlyConsulting\Metrics\Metric a ponúka:

MetódaÚčinok
name(string $name)Zobrazovaný názov; predvolene poľudštený názov triedy.
description(string $description)Voľný popis v obálke.
prefix(string $prefix) / suffix(string $suffix)Zobrazovaný prefix a sufix, napr. symbol meny alebo jednotka.
precision(int $precision = 0, RoundingMode $mode = RoundingMode::HalfAwayFromZero)Presnosť a spôsob zaokrúhľovania všetkých hodnôt.
range(Period|string $range, ?string $customRangeStart = null, ?string $customRangeEnd = null)Časové obdobie — pozri Časové obdobia.
timezone(?string $timezone)Vyhodnotí obdobia tejto metriky a označí jej intervaly trendu v explicitnom časovom pásme — pozri Časové obdobia.
ranges(): arrayDostupné kľúče a popisy období.
formatUsing(Closure $formatter)Pridá do výsledku naformátovanú hodnotu — pozri Formátovanie čísel.
cache(), cacheFor(), cacheKey(), dontCache()Cachovanie jednej metriky — pozri Cachovanie.
key(): ?stringKľúč z registra, pod ktorým bola metrika načítaná, alebo null pri ad-hoc metrikách.
make(mixed ...$arguments): staticStatický konštruktor.
result(): ResultTypovaný objekt výsledku — vypočítaný alebo obnovený z cache výsledkov.
toArray(): arrayVyhodnotí metriku a vráti obálku.
toResponse($request): JsonResponseObálka ako JSON odpoveď (Responsable).

precision() prijíma natívny PHP enum RoundingMode, napr. ->precision(2, RoundingMode::HalfEven). Predvolený názov metriky je poľudštený názov triedy (RegisteredUsers → „Registered Users“).

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.