arthem / config-file-bundle
Inject files from env vars in your Symfony configuration
Installs: 356
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 2
Forks: 0
Open Issues: 0
Type:symfony-bundle
Requires
- php: ^8.2
- symfony/config: ^6 || ^7
- symfony/dependency-injection: ^6 || ^7
- symfony/http-kernel: ^6 || ^7
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.16
- phpstan/phpstan: ^1.10
README
Motivations
In Symfony configuration, you can inject file content as parameter using env(file:FOO)
But some Symfony bundles expect you to provide file path whereas your infrastructure can only provide env variables. In some Docker deployments, it is really complicated to mount files and it's easier to deal with env.
This bundle generates files in the cache with your env var written in them, allowing you to write templates.
Let's see a Docker case!
# docker-compose.yaml services: symfony-app: environments: - JWT_PRIVATE_KEY
The default env var of docker compose can look like:
# .env JWT_PRIVATE_KEY="-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCN/VTNk1Sdr9mg ... tDMMHT4ch+pSmyyndMSeu+I+pjF5+cour3FrmmzZFzKivzj0EXbcb+LPUQKBgHWA WRv4Q33WAa3BFKqCZOKhfFY= -----END PRIVATE KEY----- "
You have a jwt_provider
bundle that requires a private_key_file
(yes, a file path!)
# config/packages/jwt_provider.yaml jwt_provider: private_key_file: "I don't have file, just a JWT_PRIVATE_KEY env var"
This is where the bundle helps you!
Installation
composer require arthem/config-file-bundle
Usage
Inlined configuration
You can directly write the expected content of your file with the following syntax:
param_value: | &file:<filename.ext> <content of your file>
example:
# config/packages/jwt_provider.yaml jwt_provider: private_key_file: | &file:jwt_private_key.pem %env(JWT_PRIVATE_KEY)%
this will:
- Generate the file
jwt_private_key-%hash%.pem
in the project cache directory. (%hash%
refers to the resolved content of the file) - Compile your configuration into:
# config/packages/jwt_provider.yaml jwt_provider: private_key_file: 'cache/dir/jwt_private_key-c131d7b5c6bd917a83e0cbea6296bf95.pem'
Provisioned configuration
The other way to generate files is to define them in the bundle extension config:
# config/packages/arthem_config_file.yaml arthem_config_file: files: service_account: extension: json content: | { "type": "service_account", "project_id": "my-project", "private_key_id": "%env(json_string:SERVICE_ACCOUNT_ID)%", "private_key": "%env(json_string:SERVICE_ACCOUNT_PRIVATE_KEY)%" } jwt_private_key: extension: pem content: '%env(JWT_SECRET_KEY)%' jwt_public_key: extension: pem content: '%env(JWT_PUBLIC_KEY)%'
Then inject files in your configuration:
# config/packages/jwt_provider.yaml jwt_provider: private_key_file: '%arthem_config_file.file.jwt_public_key%'
File content
Escaping values
This bundle also provides its JSON env var processor
{ "private_key_id": "%env(json_string:SERVICE_ACCOUNT_PRIVATE_KEY)%" }
This processor escapes JSON strings which can be useful for multiline env vars.