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
ActionExtensionContractPayloadExtensionContractQueryExtensionContractRuntimeHookContract
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 EloquentBuilder - 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