Set up API Platform

This commit is contained in:
myrmidex 2026-06-14 21:55:14 +02:00
parent a4b0aef7c7
commit 4964172ae9
21 changed files with 6021 additions and 13 deletions

14
.env
View file

@ -25,3 +25,17 @@ APP_SHARE_DIR=var/share
# See https://symfony.com/doc/current/routing.html#generating-urls-in-commands
DEFAULT_URI=http://localhost
###< symfony/routing ###
###> doctrine/doctrine-bundle ###
# Format described at https://www.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
# IMPORTANT: You MUST configure your server version, either here or in config/packages/doctrine.yaml
#
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/data_%kernel.environment%.db"
# DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=8.0.32&charset=utf8mb4"
# DATABASE_URL="mysql://app:!ChangeMe!@127.0.0.1:3306/app?serverVersion=10.11.2-MariaDB&charset=utf8mb4"
DATABASE_URL="postgresql://buckets:buckets@db:5432/buckets?serverVersion=16&charset=utf8"
###< doctrine/doctrine-bundle ###
###> nelmio/cors-bundle ###
CORS_ALLOW_ORIGIN='^https?://(localhost|127\.0\.0\.1)(:[0-9]+)?$'
###< nelmio/cors-bundle ###

View file

@ -7,15 +7,29 @@
"php": ">=8.4",
"ext-ctype": "*",
"ext-iconv": "*",
"api-platform/doctrine-orm": "^4.3",
"api-platform/symfony": "^4.3",
"doctrine/doctrine-bundle": "^3.2",
"doctrine/doctrine-migrations-bundle": "^4.0",
"doctrine/orm": "^3.6",
"nelmio/cors-bundle": "^2.6",
"phpdocumentor/reflection-docblock": "^6.0",
"phpstan/phpdoc-parser": "^2.3",
"symfony/asset": "8.1.*",
"symfony/console": "8.1.*",
"symfony/dotenv": "8.1.*",
"symfony/expression-language": "8.1.*",
"symfony/flex": "^2",
"symfony/framework-bundle": "8.1.*",
"symfony/property-access": "8.1.*",
"symfony/property-info": "8.1.*",
"symfony/runtime": "8.1.*",
"symfony/security-bundle": "8.1.*",
"symfony/serializer": "8.1.*",
"symfony/twig-bundle": "8.1.*",
"symfony/validator": "8.1.*",
"symfony/yaml": "8.1.*"
},
"require-dev": {
},
"config": {
"allow-plugins": {
"php-http/discovery": true,

4801
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -2,4 +2,10 @@
return [
Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true],
Nelmio\CorsBundle\NelmioCorsBundle::class => ['all' => true],
ApiPlatform\Symfony\Bundle\ApiPlatformBundle::class => ['all' => true],
];

View file

@ -0,0 +1,7 @@
api_platform:
title: Hello API Platform
version: 1.0.0
defaults:
stateless: true
cache_headers:
vary: ['Content-Type', 'Authorization', 'Origin']

View file

@ -0,0 +1,46 @@
doctrine:
dbal:
url: '%env(resolve:DATABASE_URL)%'
# IMPORTANT: You MUST configure your server version,
# either here or in the DATABASE_URL env var (see .env file)
#server_version: '16'
profiling_collect_backtrace: '%kernel.debug%'
orm:
validate_xml_mapping: true
naming_strategy: doctrine.orm.naming_strategy.underscore
identity_generation_preferences:
Doctrine\DBAL\Platforms\PostgreSQLPlatform: identity
auto_mapping: true
mappings:
App:
type: attribute
is_bundle: false
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: App
when@test:
doctrine:
dbal:
# "TEST_TOKEN" is typically set by ParaTest
dbname_suffix: '_test%env(default::TEST_TOKEN)%'
when@prod:
doctrine:
orm:
query_cache_driver:
type: pool
pool: doctrine.system_cache_pool
result_cache_driver:
type: pool
pool: doctrine.result_cache_pool
framework:
cache:
pools:
doctrine.result_cache_pool:
adapter: cache.app
doctrine.system_cache_pool:
adapter: cache.system

View file

@ -0,0 +1,6 @@
doctrine_migrations:
migrations_paths:
# namespace is arbitrary but should be different from App\Migrations
# as migrations classes should NOT be autoloaded
'DoctrineMigrations': '%kernel.project_dir%/migrations'
enable_profiler: false

View file

@ -0,0 +1,10 @@
nelmio_cors:
defaults:
origin_regex: true
allow_origin: ['%env(CORS_ALLOW_ORIGIN)%']
allow_methods: ['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE']
allow_headers: ['Content-Type', 'Authorization']
expose_headers: ['Link']
max_age: 3600
paths:
'^/': null

View file

@ -0,0 +1,3 @@
framework:
property_info:
with_constructor_extractor: true

View file

@ -0,0 +1,39 @@
security:
# https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords
password_hashers:
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
# https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider
providers:
users_in_memory: { memory: null }
firewalls:
dev:
# Ensure dev tools and static assets are always allowed
pattern: ^/(_profiler|_wdt|assets|build)/
security: false
main:
lazy: true
provider: users_in_memory
# Activate different ways to authenticate:
# https://symfony.com/doc/current/security.html#the-firewall
# https://symfony.com/doc/current/security/impersonating_user.html
# switch_user: true
# Note: Only the *first* matching rule is applied
access_control:
# - { path: ^/admin, roles: ROLE_ADMIN }
# - { path: ^/profile, roles: ROLE_USER }
when@test:
security:
password_hashers:
# Password hashers are resource-intensive by design to ensure security.
# In tests, it's safe to reduce their cost to improve performance.
Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface:
algorithm: auto
cost: 4 # Lowest possible value for bcrypt
time_cost: 3 # Lowest possible value for argon
memory_cost: 10 # Lowest possible value for argon

View file

@ -0,0 +1,6 @@
twig:
file_name_pattern: '*.twig'
when@test:
twig:
strict_variables: true

View file

@ -0,0 +1,11 @@
framework:
validation:
# Enables validator auto-mapping support.
# For instance, basic validation constraints will be inferred from Doctrine's metadata.
#auto_mapping:
# App\Entity\: []
when@test:
framework:
validation:
not_compromised_password: false

View file

@ -37,7 +37,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* @psalm-type ArgumentsType = list<mixed>|array<string, mixed>
* @psalm-type CallType = array<string, ArgumentsType>|array{0:string, 1?:ArgumentsType, 2?:bool}|array{method:string, arguments?:ArgumentsType, returns_clone?:bool}
* @psalm-type TagsType = list<string|array<string, array<string, mixed>>> // arrays inside the list must have only one element, with the tag name as the key
* @psalm-type CallbackType = string|array{0:string|ReferenceConfigurator,1:string}|\Closure|ReferenceConfigurator
* @psalm-type CallbackType = string|array{0:string|ReferenceConfigurator,1:string}|\Closure|ReferenceConfigurator|ExpressionConfigurator
* @psalm-type DeprecationType = array{package: string, version: string, message?: string}
* @psalm-type DefaultsType = array{
* public?: bool,
@ -267,7 +267,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* formats?: array<string, string|list<scalar|Param|null>>,
* },
* assets?: bool|array{ // Assets configuration
* enabled?: bool|Param, // Default: false
* enabled?: bool|Param, // Default: true
* strict_mode?: bool|Param, // Throw an exception if an entry is missing from the manifest.json. // Default: false
* version_strategy?: scalar|Param|null, // Default: null
* version?: scalar|Param|null, // Default: null
@ -333,7 +333,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* }>,
* },
* validation?: bool|array{ // Validation configuration
* enabled?: bool|Param, // Default: false
* enabled?: bool|Param, // Default: true
* enable_attributes?: bool|Param, // Default: true
* static_method?: string|list<scalar|Param|null>,
* translation_domain?: scalar|Param|null, // Default: "validators"
@ -352,7 +352,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* }>,
* },
* serializer?: bool|array{ // Serializer configuration
* enabled?: bool|Param, // Default: false
* enabled?: bool|Param, // Default: true
* enable_attributes?: bool|Param, // Default: true
* name_converter?: scalar|Param|null,
* circular_reference_handler?: scalar|Param|null,
@ -369,7 +369,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* }>,
* },
* property_access?: bool|array{ // Property access configuration
* enabled?: bool|Param, // Default: false
* enabled?: bool|Param, // Default: true
* magic_call?: bool|Param, // Default: false
* magic_get?: bool|Param, // Default: true
* magic_set?: bool|Param, // Default: true
@ -377,11 +377,11 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* throw_exception_on_invalid_property_path?: bool|Param, // Default: true
* },
* type_info?: bool|array{ // Type info configuration
* enabled?: bool|Param, // Default: false
* enabled?: bool|Param, // Default: true
* aliases?: array<string, scalar|Param|null>,
* },
* property_info?: bool|array{ // Property info configuration
* enabled?: bool|Param, // Default: false
* enabled?: bool|Param, // Default: true
* with_constructor_extractor?: bool|Param, // Registers the constructor extractor. // Default: true
* },
* cache?: array{ // Cache configuration
@ -416,7 +416,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* log_channel?: scalar|Param|null, // The channel of log message. Null to let Symfony decide. // Default: null
* }>,
* web_link?: bool|array{ // Web links configuration
* enabled?: bool|Param, // Default: false
* enabled?: bool|Param, // Default: true
* },
* lock?: bool|string|array{ // Lock configuration
* enabled?: bool|Param, // Default: false
@ -646,7 +646,7 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* }>,
* },
* uid?: bool|array{ // Uid configuration
* enabled?: bool|Param, // Default: false
* enabled?: bool|Param, // Default: true
* default_uuid_version?: 7|6|4|1|Param, // Default: 7
* name_based_uuid_version?: 5|3|Param, // Default: 5
* name_based_uuid_namespace?: scalar|Param|null,
@ -701,28 +701,926 @@ use Symfony\Component\Config\Loader\ParamConfigurator as Param;
* },
* },
* }
* @psalm-type TwigConfig = array{
* form_themes?: list<scalar|Param|null>,
* globals?: array<string, array{ // Default: []
* id?: scalar|Param|null,
* type?: scalar|Param|null,
* value?: mixed,
* }>,
* autoescape_service?: scalar|Param|null, // Default: null
* autoescape_service_method?: scalar|Param|null, // Default: null
* cache?: scalar|Param|null, // Default: true
* charset?: scalar|Param|null, // Default: "%kernel.charset%"
* debug?: bool|Param, // Default: "%kernel.debug%"
* strict_variables?: bool|Param, // Default: "%kernel.debug%"
* auto_reload?: scalar|Param|null,
* optimizations?: int|Param,
* default_path?: scalar|Param|null, // The default path used to load templates. // Default: "%kernel.project_dir%/templates"
* file_name_pattern?: string|list<scalar|Param|null>,
* paths?: array<string, mixed>,
* date?: array{ // The default format options used by the date filter.
* format?: scalar|Param|null, // Default: "F j, Y H:i"
* interval_format?: scalar|Param|null, // Default: "%d days"
* timezone?: scalar|Param|null, // The timezone used when formatting dates, when set to null, the timezone returned by date_default_timezone_get() is used. // Default: null
* },
* number_format?: array{ // The default format options for the number_format filter.
* decimals?: int|Param, // Default: 0
* decimal_point?: scalar|Param|null, // Default: "."
* thousands_separator?: scalar|Param|null, // Default: ","
* },
* mailer?: array{
* html_to_text_converter?: scalar|Param|null, // A service implementing the "Symfony\Component\Mime\HtmlToTextConverter\HtmlToTextConverterInterface". // Default: null
* },
* }
* @psalm-type SecurityConfig = array{
* access_denied_url?: scalar|Param|null, // Default: null
* session_fixation_strategy?: "none"|"migrate"|"invalidate"|Param, // Default: "migrate"
* expose_security_errors?: \Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::None|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::AccountStatus|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::All|Param, // Default: "none"
* erase_credentials?: bool|Param, // Deprecated: Setting the "security.erase_credentials.erase_credentials" configuration option is deprecated. It will be removed in Symfony 9.0, as the "eraseCredentials()" method was removed in Symfony 8.0. // Default: true
* access_decision_manager?: array{
* strategy?: "affirmative"|"consensus"|"unanimous"|"priority"|Param,
* service?: scalar|Param|null,
* strategy_service?: scalar|Param|null,
* allow_if_all_abstain?: bool|Param, // Default: false
* allow_if_equal_granted_denied?: bool|Param, // Default: true
* },
* password_hashers?: array<string, string|array{ // Default: []
* algorithm?: scalar|Param|null,
* migrate_from?: string|list<scalar|Param|null>,
* hash_algorithm?: scalar|Param|null, // Name of hashing algorithm for PBKDF2 (i.e. sha256, sha512, etc..) See hash_algos() for a list of supported algorithms. // Default: "sha512"
* key_length?: scalar|Param|null, // Default: 40
* ignore_case?: bool|Param, // Default: false
* encode_as_base64?: bool|Param, // Default: true
* iterations?: scalar|Param|null, // Default: 5000
* cost?: int|Param, // Default: null
* memory_cost?: scalar|Param|null, // Default: null
* time_cost?: scalar|Param|null, // Default: null
* id?: scalar|Param|null,
* }>,
* providers?: array<string, array{ // Default: []
* id?: scalar|Param|null,
* chain?: array{
* providers?: string|list<scalar|Param|null>,
* },
* memory?: array{
* users?: array<string, array{ // Default: []
* password?: scalar|Param|null, // Default: null
* roles?: string|list<scalar|Param|null>,
* }>,
* },
* ldap?: array{
* service?: scalar|Param|null,
* base_dn?: scalar|Param|null,
* search_dn?: scalar|Param|null, // Default: null
* search_password?: scalar|Param|null, // Default: null
* extra_fields?: list<scalar|Param|null>,
* default_roles?: string|list<scalar|Param|null>,
* role_fetcher?: scalar|Param|null, // Default: null
* uid_key?: scalar|Param|null, // Default: "sAMAccountName"
* filter?: scalar|Param|null, // Default: "({uid_key}={user_identifier})"
* password_attribute?: scalar|Param|null, // Default: null
* },
* entity?: array{
* class?: scalar|Param|null, // The full entity class name of your user class.
* property?: scalar|Param|null, // Default: null
* manager_name?: scalar|Param|null, // Default: null
* },
* }>,
* firewalls?: array<string, array{ // Default: []
* pattern?: scalar|Param|null,
* host?: scalar|Param|null,
* methods?: string|list<scalar|Param|null>,
* security?: bool|Param, // Default: true
* user_checker?: scalar|Param|null, // The UserChecker to use when authenticating users in this firewall. // Default: "security.user_checker"
* request_matcher?: scalar|Param|null,
* access_denied_url?: scalar|Param|null,
* access_denied_handler?: scalar|Param|null,
* entry_point?: scalar|Param|null, // An enabled authenticator name or a service id that implements "Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface".
* provider?: scalar|Param|null,
* stateless?: bool|Param, // Default: false
* lazy?: bool|Param, // Default: false
* context?: scalar|Param|null,
* logout?: array{
* enable_csrf?: bool|Param|null, // Default: null
* csrf_token_id?: scalar|Param|null, // Default: "logout"
* csrf_parameter?: scalar|Param|null, // Default: "_csrf_token"
* csrf_token_manager?: scalar|Param|null,
* path?: scalar|Param|null, // Default: "/logout"
* target?: scalar|Param|null, // Default: "/"
* invalidate_session?: bool|Param, // Default: true
* clear_site_data?: string|list<"*"|"cache"|"cookies"|"storage"|"clientHints"|"executionContexts"|"prefetchCache"|"prerenderCache"|Param>,
* delete_cookies?: string|array<string, array{ // Default: []
* path?: scalar|Param|null, // Default: null
* domain?: scalar|Param|null, // Default: null
* secure?: scalar|Param|null, // Default: false
* samesite?: scalar|Param|null, // Default: null
* partitioned?: scalar|Param|null, // Default: false
* }>,
* },
* switch_user?: array{
* provider?: scalar|Param|null,
* parameter?: scalar|Param|null, // Default: "_switch_user"
* role?: scalar|Param|null, // Default: "ROLE_ALLOWED_TO_SWITCH"
* target_route?: scalar|Param|null, // Default: null
* },
* required_badges?: list<scalar|Param|null>,
* custom_authenticators?: list<scalar|Param|null>,
* login_throttling?: array{
* limiter?: scalar|Param|null, // A service id implementing "Symfony\Component\HttpFoundation\RateLimiter\RequestRateLimiterInterface".
* max_attempts?: int|Param, // Default: 5
* interval?: scalar|Param|null, // Default: "1 minute"
* lock_factory?: scalar|Param|null, // The service ID of the lock factory used by the login rate limiter (or null to disable locking). // Default: null
* cache_pool?: string|Param, // The cache pool to use for storing the limiter state // Default: "cache.rate_limiter"
* storage_service?: string|Param, // The service ID of a custom storage implementation, this precedes any configured "cache_pool" // Default: null
* },
* x509?: array{
* provider?: scalar|Param|null,
* user?: scalar|Param|null, // Default: "SSL_CLIENT_S_DN_Email"
* credentials?: scalar|Param|null, // Default: "SSL_CLIENT_S_DN"
* user_identifier?: scalar|Param|null, // Default: "emailAddress"
* },
* remote_user?: array{
* provider?: scalar|Param|null,
* user?: scalar|Param|null, // Default: "REMOTE_USER"
* },
* login_link?: array{
* check_route?: scalar|Param|null, // Route that will validate the login link - e.g. "app_login_link_verify".
* check_post_only?: scalar|Param|null, // If true, only HTTP POST requests to "check_route" will be handled by the authenticator. // Default: false
* signature_properties?: list<scalar|Param|null>,
* lifetime?: int|Param, // The lifetime of the login link in seconds. // Default: 600
* max_uses?: int|Param, // Max number of times a login link can be used - null means unlimited within lifetime. // Default: null
* used_link_cache?: scalar|Param|null, // Cache service id used to expired links of max_uses is set.
* success_handler?: scalar|Param|null, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface.
* failure_handler?: scalar|Param|null, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface.
* provider?: scalar|Param|null, // The user provider to load users from.
* secret?: scalar|Param|null, // Default: "%kernel.secret%"
* always_use_default_target_path?: bool|Param, // Default: false
* default_target_path?: scalar|Param|null, // Default: "/"
* login_path?: scalar|Param|null, // Default: "/login"
* target_path_parameter?: scalar|Param|null, // Default: "_target_path"
* use_referer?: bool|Param, // Default: false
* failure_path?: scalar|Param|null, // Default: null
* failure_forward?: bool|Param, // Default: false
* failure_path_parameter?: scalar|Param|null, // Default: "_failure_path"
* },
* form_login?: array{
* provider?: scalar|Param|null,
* remember_me?: bool|Param, // Default: true
* success_handler?: scalar|Param|null,
* failure_handler?: scalar|Param|null,
* check_path?: scalar|Param|null, // Default: "/login_check"
* use_forward?: bool|Param, // Default: false
* login_path?: scalar|Param|null, // Default: "/login"
* username_parameter?: scalar|Param|null, // Default: "_username"
* password_parameter?: scalar|Param|null, // Default: "_password"
* csrf_parameter?: scalar|Param|null, // Default: "_csrf_token"
* csrf_token_id?: scalar|Param|null, // Default: "authenticate"
* enable_csrf?: bool|Param, // Default: false
* post_only?: bool|Param, // Default: true
* form_only?: bool|Param, // Default: false
* always_use_default_target_path?: bool|Param, // Default: false
* default_target_path?: scalar|Param|null, // Default: "/"
* target_path_parameter?: scalar|Param|null, // Default: "_target_path"
* use_referer?: bool|Param, // Default: false
* failure_path?: scalar|Param|null, // Default: null
* failure_forward?: bool|Param, // Default: false
* failure_path_parameter?: scalar|Param|null, // Default: "_failure_path"
* },
* form_login_ldap?: array{
* provider?: scalar|Param|null,
* remember_me?: bool|Param, // Default: true
* success_handler?: scalar|Param|null,
* failure_handler?: scalar|Param|null,
* check_path?: scalar|Param|null, // Default: "/login_check"
* use_forward?: bool|Param, // Default: false
* login_path?: scalar|Param|null, // Default: "/login"
* username_parameter?: scalar|Param|null, // Default: "_username"
* password_parameter?: scalar|Param|null, // Default: "_password"
* csrf_parameter?: scalar|Param|null, // Default: "_csrf_token"
* csrf_token_id?: scalar|Param|null, // Default: "authenticate"
* enable_csrf?: bool|Param, // Default: false
* post_only?: bool|Param, // Default: true
* form_only?: bool|Param, // Default: false
* always_use_default_target_path?: bool|Param, // Default: false
* default_target_path?: scalar|Param|null, // Default: "/"
* target_path_parameter?: scalar|Param|null, // Default: "_target_path"
* use_referer?: bool|Param, // Default: false
* failure_path?: scalar|Param|null, // Default: null
* failure_forward?: bool|Param, // Default: false
* failure_path_parameter?: scalar|Param|null, // Default: "_failure_path"
* service?: scalar|Param|null, // Default: "ldap"
* dn_string?: scalar|Param|null, // Default: "{user_identifier}"
* query_string?: scalar|Param|null,
* search_dn?: scalar|Param|null, // Default: ""
* search_password?: scalar|Param|null, // Default: ""
* },
* json_login?: array{
* provider?: scalar|Param|null,
* remember_me?: bool|Param, // Default: true
* success_handler?: scalar|Param|null,
* failure_handler?: scalar|Param|null,
* check_path?: scalar|Param|null, // Default: "/login_check"
* use_forward?: bool|Param, // Default: false
* login_path?: scalar|Param|null, // Default: "/login"
* username_path?: scalar|Param|null, // Default: "username"
* password_path?: scalar|Param|null, // Default: "password"
* },
* json_login_ldap?: array{
* provider?: scalar|Param|null,
* remember_me?: bool|Param, // Default: true
* success_handler?: scalar|Param|null,
* failure_handler?: scalar|Param|null,
* check_path?: scalar|Param|null, // Default: "/login_check"
* use_forward?: bool|Param, // Default: false
* login_path?: scalar|Param|null, // Default: "/login"
* username_path?: scalar|Param|null, // Default: "username"
* password_path?: scalar|Param|null, // Default: "password"
* service?: scalar|Param|null, // Default: "ldap"
* dn_string?: scalar|Param|null, // Default: "{user_identifier}"
* query_string?: scalar|Param|null,
* search_dn?: scalar|Param|null, // Default: ""
* search_password?: scalar|Param|null, // Default: ""
* },
* access_token?: array{
* provider?: scalar|Param|null,
* remember_me?: bool|Param, // Default: true
* success_handler?: scalar|Param|null,
* failure_handler?: scalar|Param|null,
* realm?: scalar|Param|null, // Default: null
* token_extractors?: string|list<scalar|Param|null>,
* token_handler?: string|array{
* id?: scalar|Param|null,
* oidc_user_info?: string|array{
* base_uri?: scalar|Param|null, // Base URI of the userinfo endpoint on the OIDC server, or the OIDC server URI to use the discovery (require "discovery" to be configured).
* discovery?: array{ // Enable the OIDC discovery.
* cache?: array{
* id?: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration.
* },
* },
* claim?: scalar|Param|null, // Claim which contains the user identifier (e.g. sub, email, etc.). // Default: "sub"
* client?: scalar|Param|null, // HttpClient service id to use to call the OIDC server.
* },
* oidc?: array{
* discovery?: array{ // Enable the OIDC discovery.
* base_uri?: string|list<scalar|Param|null>,
* cache?: array{
* id?: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration.
* },
* enforce_key_usage_verification?: bool|Param, // When enabled (default), only keys explicitly designated for signature (via "use":"sig" or a "key_ops" entry containing "sign"/"verify") are accepted. When disabled, keys without any usage designation are also accepted; keys explicitly restricted to encryption are still rejected. // Default: true
* },
* claim?: scalar|Param|null, // Claim which contains the user identifier (e.g.: sub, email..). // Default: "sub"
* audience?: scalar|Param|null, // Audience set in the token, for validation purpose.
* issuers?: list<scalar|Param|null>,
* algorithms?: list<scalar|Param|null>,
* keyset?: scalar|Param|null, // JSON-encoded JWKSet used to sign the token (must contain a list of valid public keys).
* encryption?: bool|array{
* enabled?: bool|Param, // Default: false
* enforce?: bool|Param, // When enabled, the token shall be encrypted. // Default: false
* algorithms?: list<scalar|Param|null>,
* keyset?: scalar|Param|null, // JSON-encoded JWKSet used to decrypt the token (must contain a list of valid private keys).
* },
* },
* cas?: array{
* validation_url?: scalar|Param|null, // CAS server validation URL
* prefix?: scalar|Param|null, // CAS prefix // Default: "cas"
* http_client?: scalar|Param|null, // HTTP Client service // Default: null
* },
* oauth2?: scalar|Param|null,
* },
* },
* http_basic?: array{
* provider?: scalar|Param|null,
* realm?: scalar|Param|null, // Default: "Secured Area"
* },
* http_basic_ldap?: array{
* provider?: scalar|Param|null,
* realm?: scalar|Param|null, // Default: "Secured Area"
* service?: scalar|Param|null, // Default: "ldap"
* dn_string?: scalar|Param|null, // Default: "{user_identifier}"
* query_string?: scalar|Param|null,
* search_dn?: scalar|Param|null, // Default: ""
* search_password?: scalar|Param|null, // Default: ""
* },
* remember_me?: array{
* secret?: scalar|Param|null, // Default: "%kernel.secret%"
* service?: scalar|Param|null,
* user_providers?: string|list<scalar|Param|null>,
* catch_exceptions?: bool|Param, // Default: true
* signature_properties?: list<scalar|Param|null>,
* token_provider?: string|array{
* service?: scalar|Param|null, // The service ID of a custom remember-me token provider.
* doctrine?: bool|array{
* enabled?: bool|Param, // Default: false
* connection?: scalar|Param|null, // Default: null
* },
* },
* token_verifier?: scalar|Param|null, // The service ID of a custom rememberme token verifier.
* name?: scalar|Param|null, // Default: "REMEMBERME"
* lifetime?: int|Param, // Default: 31536000
* path?: scalar|Param|null, // Default: "/"
* domain?: scalar|Param|null, // Default: null
* secure?: true|false|"auto"|Param, // Default: false
* httponly?: bool|Param, // Default: true
* samesite?: null|"lax"|"strict"|"none"|Param, // Default: null
* always_remember_me?: bool|Param, // Default: false
* remember_me_parameter?: scalar|Param|null, // Default: "_remember_me"
* },
* }>,
* access_control?: list<array{ // Default: []
* request_matcher?: scalar|Param|null, // Default: null
* requires_channel?: scalar|Param|null, // Default: null
* path?: scalar|Param|null, // Use the urldecoded format. // Default: null
* host?: scalar|Param|null, // Default: null
* port?: int|Param, // Default: null
* ips?: string|list<scalar|Param|null>,
* attributes?: array<string, scalar|Param|null>,
* route?: scalar|Param|null, // Default: null
* methods?: string|list<scalar|Param|null>,
* allow_if?: scalar|Param|null, // Default: null
* roles?: string|list<scalar|Param|null>,
* }>,
* role_hierarchy?: array<string, string|list<scalar|Param|null>>,
* }
* @psalm-type DoctrineConfig = array{
* dbal?: array{
* default_connection?: scalar|Param|null,
* types?: array<string, string|array{ // Default: []
* class?: scalar|Param|null,
* }>,
* driver_schemes?: array<string, scalar|Param|null>,
* connections?: array<string, array{ // Default: []
* url?: scalar|Param|null, // A URL with connection information; any parameter value parsed from this string will override explicitly set parameters
* dbname?: scalar|Param|null,
* host?: scalar|Param|null, // Defaults to "localhost" at runtime.
* port?: scalar|Param|null, // Defaults to null at runtime.
* user?: scalar|Param|null, // Defaults to "root" at runtime.
* password?: scalar|Param|null, // Defaults to null at runtime.
* dbname_suffix?: scalar|Param|null, // Adds the given suffix to the configured database name, this option has no effects for the SQLite platform
* application_name?: scalar|Param|null,
* charset?: scalar|Param|null,
* path?: scalar|Param|null,
* memory?: bool|Param,
* unix_socket?: scalar|Param|null, // The unix socket to use for MySQL
* persistent?: bool|Param, // True to use as persistent connection for the ibm_db2 driver
* protocol?: scalar|Param|null, // The protocol to use for the ibm_db2 driver (default to TCPIP if omitted)
* service?: bool|Param, // True to use SERVICE_NAME as connection parameter instead of SID for Oracle
* servicename?: scalar|Param|null, // Overrules dbname parameter if given and used as SERVICE_NAME or SID connection parameter for Oracle depending on the service parameter.
* sessionMode?: scalar|Param|null, // The session mode to use for the oci8 driver
* server?: scalar|Param|null, // The name of a running database server to connect to for SQL Anywhere.
* default_dbname?: scalar|Param|null, // Override the default database (postgres) to connect to for PostgreSQL connection.
* sslmode?: scalar|Param|null, // Determines whether or with what priority a SSL TCP/IP connection will be negotiated with the server for PostgreSQL.
* sslrootcert?: scalar|Param|null, // The name of a file containing SSL certificate authority (CA) certificate(s). If the file exists, the server's certificate will be verified to be signed by one of these authorities.
* sslcert?: scalar|Param|null, // The path to the SSL client certificate file for PostgreSQL.
* sslkey?: scalar|Param|null, // The path to the SSL client key file for PostgreSQL.
* sslcrl?: scalar|Param|null, // The file name of the SSL certificate revocation list for PostgreSQL.
* pooled?: bool|Param, // True to use a pooled server with the oci8/pdo_oracle driver
* MultipleActiveResultSets?: bool|Param, // Configuring MultipleActiveResultSets for the pdo_sqlsrv driver
* instancename?: scalar|Param|null, // Optional parameter, complete whether to add the INSTANCE_NAME parameter in the connection. It is generally used to connect to an Oracle RAC server to select the name of a particular instance.
* connectstring?: scalar|Param|null, // Complete Easy Connect connection descriptor, see https://docs.oracle.com/database/121/NETAG/naming.htm.When using this option, you will still need to provide the user and password parameters, but the other parameters will no longer be used. Note that when using this parameter, the getHost and getPort methods from Doctrine\DBAL\Connection will no longer function as expected.
* driver?: scalar|Param|null, // Default: "pdo_mysql"
* auto_commit?: bool|Param,
* schema_filter?: scalar|Param|null,
* logging?: bool|Param, // Default: true
* profiling?: bool|Param, // Default: true
* profiling_collect_backtrace?: bool|Param, // Enables collecting backtraces when profiling is enabled // Default: false
* profiling_collect_schema_errors?: bool|Param, // Enables collecting schema errors when profiling is enabled // Default: true
* server_version?: scalar|Param|null,
* idle_connection_ttl?: int|Param, // Default: 600
* driver_class?: scalar|Param|null,
* wrapper_class?: scalar|Param|null,
* keep_replica?: bool|Param,
* options?: array<string, mixed>,
* mapping_types?: array<string, scalar|Param|null>,
* default_table_options?: array<string, scalar|Param|null>,
* schema_manager_factory?: scalar|Param|null, // Default: "doctrine.dbal.default_schema_manager_factory"
* result_cache?: scalar|Param|null,
* replicas?: array<string, array{ // Default: []
* url?: scalar|Param|null, // A URL with connection information; any parameter value parsed from this string will override explicitly set parameters
* dbname?: scalar|Param|null,
* host?: scalar|Param|null, // Defaults to "localhost" at runtime.
* port?: scalar|Param|null, // Defaults to null at runtime.
* user?: scalar|Param|null, // Defaults to "root" at runtime.
* password?: scalar|Param|null, // Defaults to null at runtime.
* dbname_suffix?: scalar|Param|null, // Adds the given suffix to the configured database name, this option has no effects for the SQLite platform
* application_name?: scalar|Param|null,
* charset?: scalar|Param|null,
* path?: scalar|Param|null,
* memory?: bool|Param,
* unix_socket?: scalar|Param|null, // The unix socket to use for MySQL
* persistent?: bool|Param, // True to use as persistent connection for the ibm_db2 driver
* protocol?: scalar|Param|null, // The protocol to use for the ibm_db2 driver (default to TCPIP if omitted)
* service?: bool|Param, // True to use SERVICE_NAME as connection parameter instead of SID for Oracle
* servicename?: scalar|Param|null, // Overrules dbname parameter if given and used as SERVICE_NAME or SID connection parameter for Oracle depending on the service parameter.
* sessionMode?: scalar|Param|null, // The session mode to use for the oci8 driver
* server?: scalar|Param|null, // The name of a running database server to connect to for SQL Anywhere.
* default_dbname?: scalar|Param|null, // Override the default database (postgres) to connect to for PostgreSQL connection.
* sslmode?: scalar|Param|null, // Determines whether or with what priority a SSL TCP/IP connection will be negotiated with the server for PostgreSQL.
* sslrootcert?: scalar|Param|null, // The name of a file containing SSL certificate authority (CA) certificate(s). If the file exists, the server's certificate will be verified to be signed by one of these authorities.
* sslcert?: scalar|Param|null, // The path to the SSL client certificate file for PostgreSQL.
* sslkey?: scalar|Param|null, // The path to the SSL client key file for PostgreSQL.
* sslcrl?: scalar|Param|null, // The file name of the SSL certificate revocation list for PostgreSQL.
* pooled?: bool|Param, // True to use a pooled server with the oci8/pdo_oracle driver
* MultipleActiveResultSets?: bool|Param, // Configuring MultipleActiveResultSets for the pdo_sqlsrv driver
* instancename?: scalar|Param|null, // Optional parameter, complete whether to add the INSTANCE_NAME parameter in the connection. It is generally used to connect to an Oracle RAC server to select the name of a particular instance.
* connectstring?: scalar|Param|null, // Complete Easy Connect connection descriptor, see https://docs.oracle.com/database/121/NETAG/naming.htm.When using this option, you will still need to provide the user and password parameters, but the other parameters will no longer be used. Note that when using this parameter, the getHost and getPort methods from Doctrine\DBAL\Connection will no longer function as expected.
* }>,
* }>,
* },
* orm?: array{
* default_entity_manager?: scalar|Param|null,
* enable_native_lazy_objects?: bool|Param, // Deprecated: The "enable_native_lazy_objects" option is deprecated and will be removed in DoctrineBundle 4.0, as native lazy objects are now always enabled. // Default: true
* controller_resolver?: bool|array{
* enabled?: bool|Param, // Default: true
* auto_mapping?: bool|Param, // Deprecated: The "doctrine.orm.controller_resolver.auto_mapping.auto_mapping" option is deprecated and will be removed in DoctrineBundle 4.0, as it only accepts `false` since 3.0. // Set to true to enable using route placeholders as lookup criteria when the primary key doesn't match the argument name // Default: false
* evict_cache?: bool|Param, // Set to true to fetch the entity from the database instead of using the cache, if any // Default: false
* },
* entity_managers?: array<string, array{ // Default: []
* query_cache_driver?: string|array{
* type?: scalar|Param|null, // Default: null
* id?: scalar|Param|null,
* pool?: scalar|Param|null,
* },
* metadata_cache_driver?: string|array{
* type?: scalar|Param|null, // Default: null
* id?: scalar|Param|null,
* pool?: scalar|Param|null,
* },
* result_cache_driver?: string|array{
* type?: scalar|Param|null, // Default: null
* id?: scalar|Param|null,
* pool?: scalar|Param|null,
* },
* entity_listeners?: array{
* entities?: array<string, array{ // Default: []
* listeners?: array<string, array{ // Default: []
* events?: list<array{ // Default: []
* type?: scalar|Param|null,
* method?: scalar|Param|null, // Default: null
* }>,
* }>,
* }>,
* },
* connection?: scalar|Param|null,
* class_metadata_factory_name?: scalar|Param|null, // Default: "Doctrine\\ORM\\Mapping\\ClassMetadataFactory"
* default_repository_class?: scalar|Param|null, // Default: "Doctrine\\ORM\\EntityRepository"
* auto_mapping?: scalar|Param|null, // Default: false
* naming_strategy?: scalar|Param|null, // Default: "doctrine.orm.naming_strategy.default"
* quote_strategy?: scalar|Param|null, // Default: "doctrine.orm.quote_strategy.default"
* typed_field_mapper?: scalar|Param|null, // Default: "doctrine.orm.typed_field_mapper.default"
* entity_listener_resolver?: scalar|Param|null, // Default: null
* fetch_mode_subselect_batch_size?: scalar|Param|null,
* repository_factory?: scalar|Param|null, // Default: "doctrine.orm.container_repository_factory"
* schema_ignore_classes?: list<scalar|Param|null>,
* validate_xml_mapping?: bool|Param, // Set to "true" to opt-in to the new mapping driver mode that was added in Doctrine ORM 2.14 and will be mandatory in ORM 3.0. See https://github.com/doctrine/orm/pull/6728. // Default: false
* second_level_cache?: array{
* region_cache_driver?: string|array{
* type?: scalar|Param|null, // Default: null
* id?: scalar|Param|null,
* pool?: scalar|Param|null,
* },
* region_lock_lifetime?: scalar|Param|null, // Default: 60
* log_enabled?: bool|Param, // Default: true
* region_lifetime?: scalar|Param|null, // Default: 3600
* enabled?: bool|Param, // Default: true
* factory?: scalar|Param|null,
* regions?: array<string, array{ // Default: []
* cache_driver?: string|array{
* type?: scalar|Param|null, // Default: null
* id?: scalar|Param|null,
* pool?: scalar|Param|null,
* },
* lock_path?: scalar|Param|null, // Default: "%kernel.cache_dir%/doctrine/orm/slc/filelock"
* lock_lifetime?: scalar|Param|null, // Default: 60
* type?: scalar|Param|null, // Default: "default"
* lifetime?: scalar|Param|null, // Default: null
* service?: scalar|Param|null,
* name?: scalar|Param|null,
* }>,
* loggers?: array<string, array{ // Default: []
* name?: scalar|Param|null,
* service?: scalar|Param|null,
* }>,
* },
* hydrators?: array<string, scalar|Param|null>,
* mappings?: array<string, bool|string|array{ // Default: []
* mapping?: scalar|Param|null, // Default: true
* type?: scalar|Param|null,
* dir?: scalar|Param|null,
* alias?: scalar|Param|null,
* prefix?: scalar|Param|null,
* is_bundle?: bool|Param,
* }>,
* dql?: array{
* string_functions?: array<string, scalar|Param|null>,
* numeric_functions?: array<string, scalar|Param|null>,
* datetime_functions?: array<string, scalar|Param|null>,
* },
* filters?: array<string, string|array{ // Default: []
* class?: scalar|Param|null,
* enabled?: bool|Param, // Default: false
* parameters?: array<string, mixed>,
* }>,
* identity_generation_preferences?: array<string, scalar|Param|null>,
* }>,
* resolve_target_entities?: array<string, scalar|Param|null>,
* },
* }
* @psalm-type DoctrineMigrationsConfig = array{
* enable_service_migrations?: bool|Param, // Whether to enable fetching migrations from the service container. // Default: false
* migrations_paths?: array<string, scalar|Param|null>,
* services?: array<string, scalar|Param|null>,
* factories?: array<string, scalar|Param|null>,
* storage?: array{ // Storage to use for migration status metadata.
* table_storage?: array{ // The default metadata storage, implemented as a table in the database.
* table_name?: scalar|Param|null, // Default: null
* version_column_name?: scalar|Param|null, // Default: null
* version_column_length?: scalar|Param|null, // Default: null
* executed_at_column_name?: scalar|Param|null, // Default: null
* execution_time_column_name?: scalar|Param|null, // Default: null
* },
* },
* migrations?: list<scalar|Param|null>,
* connection?: scalar|Param|null, // Connection name to use for the migrations database. // Default: null
* em?: scalar|Param|null, // Entity manager name to use for the migrations database (available when doctrine/orm is installed). // Default: null
* all_or_nothing?: scalar|Param|null, // Run all migrations in a transaction. // Default: false
* check_database_platform?: scalar|Param|null, // Adds an extra check in the generated migrations to allow execution only on the same platform as they were initially generated on. // Default: true
* custom_template?: scalar|Param|null, // Custom template path for generated migration classes. // Default: null
* organize_migrations?: scalar|Param|null, // Organize migrations mode. Possible values are: "BY_YEAR", "BY_YEAR_AND_MONTH", false // Default: false
* enable_profiler?: bool|Param, // Whether or not to enable the profiler collector to calculate and visualize migration status. This adds some queries overhead. // Default: false
* transactional?: bool|Param, // Whether or not to wrap migrations in a single transaction. // Default: true
* }
* @psalm-type NelmioCorsConfig = array{
* defaults?: array{
* allow_credentials?: bool|Param, // Default: false
* allow_origin?: list<scalar|Param|null>,
* allow_headers?: list<scalar|Param|null>,
* allow_methods?: list<scalar|Param|null>,
* allow_private_network?: bool|Param, // Default: false
* expose_headers?: list<scalar|Param|null>,
* max_age?: scalar|Param|null, // Default: 0
* hosts?: list<scalar|Param|null>,
* origin_regex?: bool|Param, // Default: false
* forced_allow_origin_value?: scalar|Param|null, // Default: null
* skip_same_as_origin?: bool|Param, // Default: true
* },
* paths?: array<string, array{ // Default: []
* allow_credentials?: bool|Param,
* allow_origin?: list<scalar|Param|null>,
* allow_headers?: list<scalar|Param|null>,
* allow_methods?: list<scalar|Param|null>,
* allow_private_network?: bool|Param,
* expose_headers?: list<scalar|Param|null>,
* max_age?: scalar|Param|null, // Default: 0
* hosts?: list<scalar|Param|null>,
* origin_regex?: bool|Param,
* forced_allow_origin_value?: scalar|Param|null, // Default: null
* skip_same_as_origin?: bool|Param,
* }>,
* }
* @psalm-type ApiPlatformConfig = array{
* title?: scalar|Param|null, // The title of the API. // Default: ""
* description?: scalar|Param|null, // The description of the API. // Default: ""
* version?: scalar|Param|null, // The version of the API. // Default: "0.0.0"
* show_webby?: bool|Param, // If true, show Webby on the documentation page // Default: true
* use_symfony_listeners?: bool|Param, // Uses Symfony event listeners instead of the ApiPlatform\Symfony\Controller\MainController. // Default: false
* name_converter?: scalar|Param|null, // Specify a name converter to use. // Default: null
* asset_package?: scalar|Param|null, // Specify an asset package name to use. // Default: null
* path_segment_name_generator?: scalar|Param|null, // Specify a path name generator to use. // Default: "api_platform.metadata.path_segment_name_generator.underscore"
* inflector?: scalar|Param|null, // Specify an inflector to use. // Default: "api_platform.metadata.inflector"
* validator?: array{
* serialize_payload_fields?: mixed, // Set to null to serialize all payload fields when a validation error is thrown, or set the fields you want to include explicitly. // Default: []
* query_parameter_validation?: bool|Param, // Deprecated: Will be removed in API Platform 5.0. // Default: true
* },
* jsonapi?: array{
* use_iri_as_id?: bool|Param, // Set to false to use entity identifiers instead of IRIs as the "id" field in JSON:API responses. // Default: true
* allow_client_generated_id?: bool|Param, // Allow client-generated IDs on JSON:API POST per https://jsonapi.org/format/#crud-creating-client-ids. Off by default to prevent id spoofing on public endpoints. // Default: false
* },
* eager_loading?: bool|array{
* enabled?: bool|Param, // Default: true
* fetch_partial?: bool|Param, // Fetch only partial data according to serialization groups. If enabled, Doctrine ORM entities will not work as expected if any of the other fields are used. // Default: false
* max_joins?: int|Param, // Max number of joined relations before EagerLoading throws a RuntimeException // Default: 30
* force_eager?: bool|Param, // Force join on every relation. If disabled, it will only join relations having the EAGER fetch mode. // Default: true
* },
* handle_symfony_errors?: bool|Param, // Allows to handle symfony exceptions. // Default: false
* enable_swagger?: bool|Param, // Enable the Swagger documentation and export. // Default: true
* enable_json_streamer?: bool|Param, // Enable json streamer. // Default: false
* enable_swagger_ui?: bool|Param, // Enable Swagger UI // Default: true
* enable_re_doc?: bool|Param, // Enable ReDoc // Default: true
* enable_scalar?: bool|Param, // Enable Scalar API Reference // Default: true
* enable_entrypoint?: bool|Param, // Enable the entrypoint // Default: true
* enable_docs?: bool|Param, // Enable the docs // Default: true
* enable_profiler?: bool|Param, // Enable the data collector and the WebProfilerBundle integration. // Default: true
* enable_phpdoc_parser?: bool|Param, // Enable resource metadata collector using PHPStan PhpDocParser. // Default: true
* enable_link_security?: bool|Param, // Deprecated: This option is always enabled and will be removed in API Platform 5.0. // Enable security for Links (sub resources). // Default: true
* collection?: array{
* exists_parameter_name?: scalar|Param|null, // The name of the query parameter to filter on nullable field values. // Default: "exists"
* order?: scalar|Param|null, // The default order of results. // Default: "ASC"
* order_parameter_name?: scalar|Param|null, // The name of the query parameter to order results. // Default: "order"
* order_nulls_comparison?: "nulls_smallest"|"nulls_largest"|"nulls_always_first"|"nulls_always_last"|Param|null, // The nulls comparison strategy. // Default: null
* pagination?: bool|array{
* enabled?: bool|Param, // Default: true
* page_parameter_name?: scalar|Param|null, // The default name of the parameter handling the page number. // Default: "page"
* enabled_parameter_name?: scalar|Param|null, // The name of the query parameter to enable or disable pagination. // Default: "pagination"
* items_per_page_parameter_name?: scalar|Param|null, // The name of the query parameter to set the number of items per page. // Default: "itemsPerPage"
* partial_parameter_name?: scalar|Param|null, // The name of the query parameter to enable or disable partial pagination. // Default: "partial"
* },
* },
* mapping?: array{
* imports?: list<scalar|Param|null>,
* paths?: list<scalar|Param|null>,
* },
* resource_class_directories?: list<scalar|Param|null>,
* serializer?: array{
* hydra_prefix?: bool|Param, // Use the "hydra:" prefix. // Default: false
* },
* doctrine?: bool|array{
* enabled?: bool|Param, // Default: true
* },
* doctrine_mongodb_odm?: bool|array{
* enabled?: bool|Param, // Default: false
* },
* oauth?: bool|array{
* enabled?: bool|Param, // Default: false
* clientId?: scalar|Param|null, // The oauth client id. // Default: ""
* clientSecret?: scalar|Param|null, // The OAuth client secret. Never use this parameter in your production environment. It exposes crucial security information. This feature is intended for dev/test environments only. Enable "oauth.pkce" instead // Default: ""
* pkce?: bool|Param, // Enable the oauth PKCE. // Default: false
* type?: scalar|Param|null, // The oauth type. // Default: "oauth2"
* flow?: scalar|Param|null, // The oauth flow grant type. // Default: "application"
* tokenUrl?: scalar|Param|null, // The oauth token url. // Default: ""
* authorizationUrl?: scalar|Param|null, // The oauth authentication url. // Default: ""
* refreshUrl?: scalar|Param|null, // The oauth refresh url. // Default: ""
* scopes?: list<scalar|Param|null>,
* },
* graphql?: bool|array{
* enabled?: bool|Param, // Default: false
* default_ide?: scalar|Param|null, // Default: "graphiql"
* graphiql?: bool|array{
* enabled?: bool|Param, // Default: false
* },
* introspection?: bool|array{
* enabled?: bool|Param, // Default: true
* },
* max_query_depth?: int|Param, // Default: 20
* graphql_playground?: bool|array{ // Deprecated: The "graphql_playground" configuration is deprecated and will be ignored.
* enabled?: bool|Param, // Default: false
* },
* max_query_complexity?: int|Param, // Default: 500
* nesting_separator?: scalar|Param|null, // The separator to use to filter nested fields. // Default: "_"
* collection?: array{
* pagination?: bool|array{
* enabled?: bool|Param, // Default: true
* },
* },
* },
* swagger?: array{
* persist_authorization?: bool|Param, // Persist the SwaggerUI Authorization in the localStorage. // Default: false
* versions?: list<scalar|Param|null>,
* api_keys?: array<string, array{ // Default: []
* name?: scalar|Param|null, // The name of the header or query parameter containing the api key.
* type?: "query"|"header"|Param, // Whether the api key should be a query parameter or a header.
* }>,
* http_auth?: array<string, array{ // Default: []
* scheme?: scalar|Param|null, // The OpenAPI HTTP auth scheme, for example "bearer"
* bearerFormat?: scalar|Param|null, // The OpenAPI HTTP bearer format
* }>,
* swagger_ui_extra_configuration?: mixed, // To pass extra configuration to Swagger UI, like docExpansion or filter. // Default: []
* },
* http_cache?: array{
* public?: bool|Param|null, // To make all responses public by default. // Default: null
* invalidation?: bool|array{ // Enable the tags-based cache invalidation system.
* enabled?: bool|Param, // Default: false
* varnish_urls?: list<scalar|Param|null>,
* urls?: list<scalar|Param|null>,
* scoped_clients?: list<scalar|Param|null>,
* max_header_length?: int|Param, // Max header length supported by the cache server. // Default: 7500
* request_options?: mixed, // To pass options to the client charged with the request. // Default: []
* purger?: scalar|Param|null, // Specify a purger to use (available values: "api_platform.http_cache.purger.varnish.ban", "api_platform.http_cache.purger.varnish.xkey", "api_platform.http_cache.purger.souin"). // Default: "api_platform.http_cache.purger.varnish"
* xkey?: array{ // Deprecated: The "xkey" configuration is deprecated, use your own purger to customize surrogate keys or the appropriate parameters.
* glue?: scalar|Param|null, // xkey glue between keys // Default: " "
* },
* },
* },
* mercure?: bool|array{
* enabled?: bool|Param, // Default: false
* hub_url?: scalar|Param|null, // The URL sent in the Link HTTP header. If not set, will default to the URL for MercureBundle's default hub. // Default: null
* include_type?: bool|Param, // Always include @type in updates (including delete ones). // Default: false
* },
* messenger?: bool|array{
* enabled?: bool|Param, // Default: false
* },
* elasticsearch?: bool|array{
* enabled?: bool|Param, // Default: false
* hosts?: list<scalar|Param|null>,
* ssl_ca_bundle?: scalar|Param|null, // Path to the SSL CA bundle file for Elasticsearch SSL verification. // Default: null
* ssl_verification?: bool|Param, // Enable or disable SSL verification for Elasticsearch connections. // Default: true
* client?: "elasticsearch"|"opensearch"|Param, // The search engine client to use: "elasticsearch" or "opensearch". // Default: "elasticsearch"
* },
* openapi?: array{
* contact?: array{
* name?: scalar|Param|null, // The identifying name of the contact person/organization. // Default: null
* url?: scalar|Param|null, // The URL pointing to the contact information. MUST be in the format of a URL. // Default: null
* email?: scalar|Param|null, // The email address of the contact person/organization. MUST be in the format of an email address. // Default: null
* },
* termsOfService?: scalar|Param|null, // A URL to the Terms of Service for the API. MUST be in the format of a URL. // Default: null
* tags?: list<array{ // Default: []
* name?: scalar|Param|null,
* description?: scalar|Param|null, // Default: null
* }>,
* license?: array{
* name?: scalar|Param|null, // The license name used for the API. // Default: null
* url?: scalar|Param|null, // URL to the license used for the API. MUST be in the format of a URL. // Default: null
* identifier?: scalar|Param|null, // An SPDX license expression for the API. The identifier field is mutually exclusive of the url field. // Default: null
* },
* swagger_ui_extra_configuration?: mixed, // To pass extra configuration to Swagger UI, like docExpansion or filter. // Default: []
* scalar_extra_configuration?: mixed, // To pass extra configuration to Scalar API Reference, like theme or darkMode. // Default: []
* overrideResponses?: bool|Param, // Whether API Platform adds automatic responses to the OpenAPI documentation. // Default: true
* error_resource_class?: scalar|Param|null, // The class used to represent errors in the OpenAPI documentation. // Default: null
* validation_error_resource_class?: scalar|Param|null, // The class used to represent validation errors in the OpenAPI documentation. // Default: null
* },
* maker?: bool|array{
* enabled?: bool|Param, // Default: false
* namespace_prefix?: scalar|Param|null, // Add a prefix to all maker generated classes. e.g set it to "Api" to set the maker namespace to "App\Api\" (if the maker.root_namespace config is App). e.g. App\Api\State\MyStateProcessor // Default: ""
* },
* mcp?: bool|array{
* enabled?: bool|Param, // Default: true
* format?: scalar|Param|null, // The serialization format used for MCP tool input/output. Must be a format registered in api_platform.formats (e.g. "jsonld", "json", "jsonapi"). // Default: "jsonld"
* },
* exception_to_status?: array<string, int|Param>,
* formats?: array<string, array{ // Default: {"jsonld":{"mime_types":["application/ld+json"]}}
* mime_types?: list<scalar|Param|null>,
* }>,
* patch_formats?: array<string, array{ // Default: {"json":{"mime_types":["application/merge-patch+json"]}}
* mime_types?: list<scalar|Param|null>,
* }>,
* docs_formats?: array<string, array{ // Default: {"jsonld":{"mime_types":["application/ld+json"]},"jsonopenapi":{"mime_types":["application/vnd.openapi+json"]},"html":{"mime_types":["text/html"]},"yamlopenapi":{"mime_types":["application/vnd.openapi+yaml"]}}
* mime_types?: list<scalar|Param|null>,
* }>,
* error_formats?: array<string, array{ // Default: {"jsonld":{"mime_types":["application/ld+json"]},"jsonproblem":{"mime_types":["application/problem+json"]},"json":{"mime_types":["application/problem+json","application/json"]}}
* mime_types?: list<scalar|Param|null>,
* }>,
* jsonschema_formats?: list<scalar|Param|null>,
* defaults?: array{
* uri_template?: mixed,
* short_name?: mixed,
* description?: mixed,
* types?: mixed,
* operations?: mixed,
* formats?: mixed,
* input_formats?: mixed,
* output_formats?: mixed,
* uri_variables?: mixed,
* route_prefix?: mixed,
* defaults?: mixed,
* requirements?: mixed,
* options?: mixed,
* stateless?: mixed,
* sunset?: mixed,
* accept_patch?: mixed,
* status?: mixed,
* host?: mixed,
* schemes?: mixed,
* condition?: mixed,
* controller?: mixed,
* class?: mixed,
* url_generation_strategy?: mixed,
* deprecation_reason?: mixed,
* headers?: mixed,
* cache_headers?: mixed,
* normalization_context?: mixed,
* denormalization_context?: mixed,
* collect_denormalization_errors?: mixed,
* hydra_context?: mixed,
* openapi?: mixed,
* validation_context?: mixed,
* filters?: mixed,
* mercure?: mixed,
* messenger?: mixed,
* input?: mixed,
* output?: mixed,
* order?: mixed,
* fetch_partial?: mixed,
* force_eager?: mixed,
* pagination_client_enabled?: mixed,
* pagination_client_items_per_page?: mixed,
* pagination_client_partial?: mixed,
* pagination_via_cursor?: mixed,
* pagination_enabled?: mixed,
* pagination_fetch_join_collection?: mixed,
* pagination_use_output_walkers?: mixed,
* pagination_items_per_page?: mixed,
* pagination_maximum_items_per_page?: mixed,
* pagination_partial?: mixed,
* pagination_type?: mixed,
* security?: mixed,
* security_message?: mixed,
* security_post_denormalize?: mixed,
* security_post_denormalize_message?: mixed,
* security_post_validation?: mixed,
* security_post_validation_message?: mixed,
* composite_identifier?: mixed,
* exception_to_status?: mixed,
* query_parameter_validation_enabled?: mixed,
* links?: mixed,
* graph_ql_operations?: mixed,
* provider?: mixed,
* processor?: mixed,
* state_options?: mixed,
* rules?: mixed,
* policy?: mixed,
* middleware?: mixed,
* parameters?: array<string, array{ // Default: []
* key?: mixed,
* schema?: mixed,
* open_api?: mixed,
* provider?: mixed,
* filter?: mixed,
* property?: mixed,
* description?: mixed,
* properties?: mixed,
* required?: mixed,
* priority?: mixed,
* hydra?: mixed,
* constraints?: mixed,
* security?: mixed,
* security_message?: mixed,
* extra_properties?: mixed,
* filter_context?: mixed,
* native_type?: mixed,
* cast_to_array?: mixed,
* cast_to_native_type?: mixed,
* cast_fn?: mixed,
* default?: mixed,
* filter_class?: mixed,
* ...<string, mixed>
* }>,
* strict_query_parameter_validation?: mixed,
* hide_hydra_operation?: mixed,
* json_stream?: mixed,
* extra_properties?: mixed,
* map?: mixed,
* mcp?: mixed,
* route_name?: mixed,
* errors?: mixed,
* read?: mixed,
* deserialize?: mixed,
* validate?: mixed,
* write?: mixed,
* serialize?: mixed,
* content_negotiation?: mixed,
* priority?: mixed,
* name?: mixed,
* allow_create?: mixed,
* item_uri_template?: mixed,
* ...<string, mixed>
* },
* }
* @psalm-type ConfigType = array{
* imports?: ImportsConfig,
* parameters?: ParametersConfig,
* services?: ServicesConfig,
* framework?: FrameworkConfig,
* twig?: TwigConfig,
* security?: SecurityConfig,
* doctrine?: DoctrineConfig,
* doctrine_migrations?: DoctrineMigrationsConfig,
* nelmio_cors?: NelmioCorsConfig,
* api_platform?: ApiPlatformConfig,
* "when@dev"?: array{
* imports?: ImportsConfig,
* parameters?: ParametersConfig,
* services?: ServicesConfig,
* framework?: FrameworkConfig,
* twig?: TwigConfig,
* security?: SecurityConfig,
* doctrine?: DoctrineConfig,
* doctrine_migrations?: DoctrineMigrationsConfig,
* nelmio_cors?: NelmioCorsConfig,
* api_platform?: ApiPlatformConfig,
* },
* "when@prod"?: array{
* imports?: ImportsConfig,
* parameters?: ParametersConfig,
* services?: ServicesConfig,
* framework?: FrameworkConfig,
* twig?: TwigConfig,
* security?: SecurityConfig,
* doctrine?: DoctrineConfig,
* doctrine_migrations?: DoctrineMigrationsConfig,
* nelmio_cors?: NelmioCorsConfig,
* api_platform?: ApiPlatformConfig,
* },
* "when@test"?: array{
* imports?: ImportsConfig,
* parameters?: ParametersConfig,
* services?: ServicesConfig,
* framework?: FrameworkConfig,
* twig?: TwigConfig,
* security?: SecurityConfig,
* doctrine?: DoctrineConfig,
* doctrine_migrations?: DoctrineMigrationsConfig,
* nelmio_cors?: NelmioCorsConfig,
* api_platform?: ApiPlatformConfig,
* },
* ...<string, ExtensionType|array{ // extra keys must follow the when@%env% pattern or match an extension alias
* imports?: ImportsConfig,

View file

@ -0,0 +1,4 @@
api_platform:
resource: .
type: api_platform
prefix: /api

View file

@ -0,0 +1,3 @@
_security_logout:
resource: security.route_loader.logout
type: service

0
migrations/.gitignore vendored Normal file
View file

0
src/ApiResource/.gitignore vendored Normal file
View file

0
src/Entity/.gitignore vendored Normal file
View file

0
src/Repository/.gitignore vendored Normal file
View file

View file

@ -1,4 +1,66 @@
{
"api-platform/symfony": {
"version": "4.3",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "4.0",
"ref": "e9952e9f393c2d048f10a78f272cd35e807d972b"
},
"files": [
"config/packages/api_platform.yaml",
"config/routes/api_platform.yaml",
"src/ApiResource/.gitignore"
]
},
"doctrine/deprecations": {
"version": "1.1",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "1.0",
"ref": "fdd756167454623e21f1d769c5b814b243782a67"
}
},
"doctrine/doctrine-bundle": {
"version": "3.2",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "3.0",
"ref": "d39a3bd844edfe90c20ae520b804a3bf4f82b4ad"
},
"files": [
"config/packages/doctrine.yaml",
"src/Entity/.gitignore",
"src/Repository/.gitignore"
]
},
"doctrine/doctrine-migrations-bundle": {
"version": "4.0",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "3.1",
"ref": "1d01ec03c6ecbd67c3375c5478c9a423ae5d6a33"
},
"files": [
"config/packages/doctrine_migrations.yaml",
"migrations/.gitignore"
]
},
"nelmio/cors-bundle": {
"version": "2.6",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "1.5",
"ref": "6bea22e6c564fba3a1391615cada1437d0bde39c"
},
"files": [
"config/packages/nelmio_cors.yaml"
]
},
"symfony/console": {
"version": "8.1",
"recipe": {
@ -44,6 +106,18 @@
".editorconfig"
]
},
"symfony/property-info": {
"version": "8.1",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "7.3",
"ref": "dae70df71978ae9226ae915ffd5fad817f5ca1f7"
},
"files": [
"config/packages/property_info.yaml"
]
},
"symfony/routing": {
"version": "8.1",
"recipe": {
@ -56,5 +130,52 @@
"config/packages/routing.yaml",
"config/routes.yaml"
]
},
"symfony/security-bundle": {
"version": "8.1",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "7.4",
"ref": "c42fee7802181cdd50f61b8622715829f5d2335c"
},
"files": [
"config/packages/security.yaml",
"config/routes/security.yaml"
]
},
"symfony/twig-bundle": {
"version": "8.1",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "6.4",
"ref": "f250159ebe99153d0c640a3e7742876fc7453f2c"
},
"files": [
"config/packages/twig.yaml",
"templates/base.html.twig"
]
},
"symfony/uid": {
"version": "8.1",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "7.0",
"ref": "0df5844274d871b37fc3816c57a768ffc60a43a5"
}
},
"symfony/validator": {
"version": "8.1",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "main",
"version": "7.0",
"ref": "8c1c4e28d26a124b0bb273f537ca8ce443472bfd"
},
"files": [
"config/packages/validator.yaml"
]
}
}

23
templates/base.html.twig Normal file
View file

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{% block title %}Welcome!{% endblock %}</title>
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text><text y=%221.3em%22 x=%220.2em%22 font-size=%2276%22 fill=%22%23fff%22>sf</text></svg>">
{% block stylesheets %}
{% endblock %}
{% block javascripts %}
{% endblock %}
{% set frankenphpHotReload = app.request.server.get('FRANKENPHP_HOT_RELOAD') %}
{% if frankenphpHotReload %}
<meta name="frankenphp-hot-reload:url" content="{{ frankenphpHotReload }}">
<script src="https://cdn.jsdelivr.net/npm/idiomorph"></script>
<script src="https://cdn.jsdelivr.net/npm/frankenphp-hot-reload/+esm" type="module"></script>
{% endif %}
</head>
<body>
{% block body %}{% endblock %}
</body>
</html>