Reference

Extensions

Extension contracts for the cases where the declarative path is not enough.

Flashboard exposes extension contracts for the 20 percent path.

Available contracts

  • ActionExtensionContract
  • PayloadExtensionContract
  • QueryExtensionContract
  • RuntimeHookContract

Registration points

Resources expose:

  • queryExtensions()
  • payloadExtensions()
  • actionExtensions()
  • runtimeHooks()

Examples

Query extension

<?php

use Illuminate\Database\Eloquent\Builder;
use Pepperfm\Flashboard\Contracts\Extensions\QueryExtensionContract;

final class TenantQueryExtension implements QueryExtensionContract
{
    public function extend(Builder $query): Builder
    {
        return $query->where('tenant_id', tenant('id'));
    }
}

Runtime hook

<?php

use Pepperfm\Flashboard\Contracts\Extensions\RuntimeHookContract;

final class AuditHook implements RuntimeHookContract
{
    public function handle(string $hook, array $context = []): void
    {
        logger()->warning('Flashboard runtime hook triggered', [
            'hook' => $hook,
            'payload_keys' => array_keys((array) ($context['payload'] ?? [])),
        ]);
    }
}

Guidance

  • prefer extensions over forks
  • keep extensions resource-scoped when possible
  • use relation field/manager modifyQueryUsing(...) callbacks for one-off relation option or record scoping; callbacks are server-only and must return the Eloquent Builder
  • reserve payload extensions for shape changes that cannot be expressed declaratively
  • avoid logging full hook contexts; resource form hooks redact passwords and upload objects, but extension logs should still stay minimal