Search by

nowo-tech / runtime-env-bundle

HecFranco

Store selected application environment variables in the database (encrypted at rest via DoctrineEncryptBundle) with an admin CRUD UI. FrankenPHP worker-safe.

Package info

github.com/nowo-tech/RuntimeEnvBundle

Documentation

Type:symfony-bundle

pkg:composer/nowo-tech/runtime-env-bundle

Fund package maintenance!

HecFranco

Statistics

Installs: 16

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 1

v1.4.1 2026-10-31 01:09 UTC

README

CI Packagist Version Packagist Downloads License PHP Symfony GitHub stars Coverage

⭐ Found this useful? Install from Packagist · Give it a star on GitHub so more developers can find it.

Database-backed application environment variables with admin CRUD. Values are encrypted at rest with nowo-tech/doctrine-encrypt-bundle. Designed for FrankenPHP worker (no $_ENV / putenv mutation; safe with or without kernel.reset / services_resetter).

FrankenPHP Friendly Worker Mode

This bundle is FrankenPHP worker mode friendly.

Bootstrap secrets (DATABASE_URL, APP_SECRET, encryptor key files, FRANKENPHP_MODE, …) stay in .env. This bundle is for agility on business/integration variables you want to edit without redeploy.

Manage panel (UiKit list page) listing runtime variables with masked, encrypted values, Edit / Delete row actions and pagination
Manage panel: encrypted at rest, values masked, paginated
Edit page (UiKit form page): the stored value is never rendered back; delete zone behind a confirm dialog
Edit: stored value never shown; delete behind a confirm dialog
Demo home page showing the value of DEMO_SAMPLE_VALUE read through RuntimeEnvBag
RuntimeEnvBag reads the stored value on the next request

Features

  • Doctrine entity RuntimeEnvVariable with #[Encrypted] value column
  • Admin CRUD at /_runtime_env (REQ-UI-002: ROLE_ADMIN by default), paginated, CSRF-protected deletes behind a confirm dialog
  • RuntimeEnvBag API + Twig runtime_env('KEY') — request-scoped memoization (worker-safe even when resetKernel is false) + kernel.reset
  • Configurable table_prefix (default runtime_env → table runtime_env_variables)
  • UiKit page contract (list / form scaffolds, one host theme for every Nowo bundle; no CDN, no inline JS)

Installation

composer require nowo-tech/runtime-env-bundle

Requires a configured DoctrineEncryptBundle profile (Halite recommended). See docs/INSTALLATION.md.

Register routes (Flex recipe copies this):

# config/routes/nowo_runtime_env.yaml
nowo_runtime_env:
    resource: .
    type: nowo_runtime_env

Requirements

  • PHP >= 8.2, < 8.6
  • Symfony 7.4, 8.0, or 8.1 (see composer.json; CI exercises 7.4, 8.0, and 8.1)
  • Doctrine ORM + Doctrine Bundle
  • nowo-tech/doctrine-encrypt-bundle (Halite recommended)
  • Twig 3.12+

Configuration

# config/packages/nowo_runtime_env.yaml
nowo_runtime_env:
    enabled: true
    table_prefix: runtime_env
    security:
        access_roles: [ROLE_ADMIN]
        allow_unauthenticated: false  # never true in production
    web_ui:
        enabled: true
        path_prefix: /_runtime_env
        list_page_size: 50

The manage pages follow the UiKit page contract: they render inside nowo_ui_kit.layouts.admin and use the host theme (nowo_ui_kit.css_framework, nowo_ui_kit.theme). Page map and override points: docs/TEMPLATES.md.

Full tree: docs/CONFIGURATION.md.

Usage

use Nowo\RuntimeEnvBundle\Service\RuntimeEnvBag;

public function __construct(private RuntimeEnvBag $runtimeEnv) {}

public function __invoke(): void
{
    $token = $this->runtimeEnv->get('MY_API_TOKEN');
}
{{ runtime_env('MY_API_TOKEN') }}

See docs/USAGE.md for more examples.

Development

make setup-hooks
make up
make test
make phpstan
make igor
make cs-check

Demo: cd demo/symfony8 && make up → http://localhost:8026 — see demo/README.md. The screenshots at the top come from this demo: refresh them with make -C demo/symfony8 demo-screenshots; make -C demo/symfony8 test-e2e runs the Playwright happy path.

Documentation

Additional documentation

Tests and coverage

  • Tests: PHPUnit (PHP) under tests/Unit/ and tests/Integration/ (FrankenPHP worker simulation)
  • Coverage:
    • PHP: 100%
    • TS/JS: N/A
    • Python: N/A
  • Badge / CI: PHPUnit coverage job on PHP 8.2 + Symfony 7.4

License

MIT. See LICENSE.

Author

Nowo.tech · Héctor Franco Aceituno