diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ef3348098..562d21e7f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,12 +1,11 @@ name: CI -on: [ push, pull_request ] +on: [push, pull_request] env: - php_version: '8.2' + php_version: "8.5" jobs: - unit: name: "Unit tests" runs-on: ubuntu-22.04 diff --git a/.gitignore b/.gitignore index f90ba46d4..95850d695 100644 --- a/.gitignore +++ b/.gitignore @@ -55,4 +55,3 @@ js_dist drivers chromedriver.log /htdocs/dist -app/config/reference.php diff --git a/app/config/reference.php b/app/config/reference.php new file mode 100644 index 000000000..d5edb85ea --- /dev/null +++ b/app/config/reference.php @@ -0,0 +1,2025 @@ + [ + * 'App\\' => [ + * 'resource' => '../src/', + * ], + * ], + * ]); + * ``` + * + * @psalm-type ImportsConfig = list + * @psalm-type ParametersConfig = array|Param|null>|Param|null> + * @psalm-type ArgumentsType = list|array + * @psalm-type CallType = array|array{0:string, 1?:ArgumentsType, 2?:bool}|array{method:string, arguments?:ArgumentsType, returns_clone?:bool} + * @psalm-type TagsType = list>> // 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|ExpressionConfigurator + * @psalm-type DeprecationType = array{package: string, version: string, message?: string} + * @psalm-type DefaultsType = array{ + * public?: bool, + * tags?: TagsType, + * resource_tags?: TagsType, + * autowire?: bool, + * autoconfigure?: bool, + * bind?: array, + * } + * @psalm-type InstanceofType = array{ + * shared?: bool, + * lazy?: bool|string, + * public?: bool, + * properties?: array, + * configurator?: CallbackType, + * calls?: list, + * tags?: TagsType, + * resource_tags?: TagsType, + * autowire?: bool, + * bind?: array, + * constructor?: string, + * } + * @psalm-type DefinitionType = array{ + * class?: string, + * file?: string, + * parent?: string, + * shared?: bool, + * synthetic?: bool, + * lazy?: bool|string, + * public?: bool, + * abstract?: bool, + * deprecated?: DeprecationType, + * factory?: CallbackType, + * configurator?: CallbackType, + * arguments?: ArgumentsType, + * properties?: array, + * calls?: list, + * tags?: TagsType, + * resource_tags?: TagsType, + * decorates?: string, + * decoration_inner_name?: string, + * decoration_priority?: int, + * decoration_on_invalid?: 'exception'|'ignore'|null, + * autowire?: bool, + * autoconfigure?: bool, + * bind?: array, + * constructor?: string, + * from_callable?: CallbackType, + * } + * @psalm-type AliasType = string|array{ + * alias: string, + * public?: bool, + * deprecated?: DeprecationType, + * } + * @psalm-type PrototypeType = array{ + * resource: string, + * namespace?: string, + * exclude?: string|list, + * parent?: string, + * shared?: bool, + * lazy?: bool|string, + * public?: bool, + * abstract?: bool, + * deprecated?: DeprecationType, + * factory?: CallbackType, + * arguments?: ArgumentsType, + * properties?: array, + * configurator?: CallbackType, + * calls?: list, + * tags?: TagsType, + * resource_tags?: TagsType, + * autowire?: bool, + * autoconfigure?: bool, + * bind?: array, + * constructor?: string, + * } + * @psalm-type StackType = array{ + * stack: list>, + * public?: bool, + * deprecated?: DeprecationType, + * } + * @psalm-type ServicesConfig = array{ + * _defaults?: DefaultsType, + * _instanceof?: InstanceofType, + * ... + * } + * @psalm-type ExtensionType = array + * @psalm-type FrameworkConfig = array{ + * secret?: scalar|Param|null, + * http_method_override?: bool|Param, // Set true to enable support for the '_method' request parameter to determine the intended HTTP method on POST requests. // Default: false + * allowed_http_method_override?: null|list, + * trust_x_sendfile_type_header?: scalar|Param|null, // Set true to enable support for xsendfile in binary file responses. // Default: "%env(bool:default::SYMFONY_TRUST_X_SENDFILE_TYPE_HEADER)%" + * ide?: scalar|Param|null, // Default: "%env(default::SYMFONY_IDE)%" + * test?: bool|Param, + * default_locale?: scalar|Param|null, // Default: "en" + * set_locale_from_accept_language?: bool|Param, // Whether to use the Accept-Language HTTP header to set the Request locale (only when the "_locale" request attribute is not passed). // Default: false + * set_content_language_from_locale?: bool|Param, // Whether to set the Content-Language HTTP header on the Response using the Request locale. // Default: false + * enabled_locales?: list, + * trusted_hosts?: string|list, + * trusted_proxies?: mixed, // Default: ["%env(default::SYMFONY_TRUSTED_PROXIES)%"] + * trusted_headers?: string|list, + * error_controller?: scalar|Param|null, // Default: "error_controller" + * handle_all_throwables?: bool|Param, // HttpKernel will handle all kinds of \Throwable. // Default: true + * csrf_protection?: bool|array{ + * enabled?: scalar|Param|null, // Default: null + * stateless_token_ids?: list, + * check_header?: scalar|Param|null, // Whether to check the CSRF token in a header in addition to a cookie when using stateless protection. // Default: false + * cookie_name?: scalar|Param|null, // The name of the cookie to use when using stateless protection. // Default: "csrf-token" + * }, + * form?: bool|array{ // Form configuration + * enabled?: bool|Param, // Default: true + * csrf_protection?: bool|array{ + * enabled?: scalar|Param|null, // Default: null + * token_id?: scalar|Param|null, // Default: null + * field_name?: scalar|Param|null, // Default: "_token" + * field_attr?: array, + * }, + * }, + * http_cache?: bool|array{ // HTTP cache configuration + * enabled?: bool|Param, // Default: false + * debug?: bool|Param, // Default: "%kernel.debug%" + * trace_level?: "none"|"short"|"full"|Param, + * trace_header?: scalar|Param|null, + * default_ttl?: int|Param, + * private_headers?: list, + * skip_response_headers?: list, + * allow_reload?: bool|Param, + * allow_revalidate?: bool|Param, + * stale_while_revalidate?: int|Param, + * stale_if_error?: int|Param, + * terminate_on_cache_hit?: bool|Param, + * }, + * esi?: bool|array{ // ESI configuration + * enabled?: bool|Param, // Default: false + * }, + * ssi?: bool|array{ // SSI configuration + * enabled?: bool|Param, // Default: false + * }, + * fragments?: bool|array{ // Fragments configuration + * enabled?: bool|Param, // Default: false + * hinclude_default_template?: scalar|Param|null, // Default: null + * path?: scalar|Param|null, // Default: "/_fragment" + * }, + * profiler?: bool|array{ // Profiler configuration + * enabled?: bool|Param, // Default: false + * collect?: bool|Param, // Default: true + * collect_parameter?: scalar|Param|null, // The name of the parameter to use to enable or disable collection on a per request basis. // Default: null + * only_exceptions?: bool|Param, // Default: false + * only_main_requests?: bool|Param, // Default: false + * dsn?: scalar|Param|null, // Default: "file:%kernel.cache_dir%/profiler" + * collect_serializer_data?: bool|Param, // Enables the serializer data collector and profiler panel. // Default: false + * }, + * workflows?: bool|array{ + * enabled?: bool|Param, // Default: false + * workflows?: array, + * definition_validators?: list, + * support_strategy?: scalar|Param|null, + * initial_marking?: \BackedEnum|string|list, + * events_to_dispatch?: null|list, + * places?: string|list, + * }>, + * transitions?: list, + * to?: \BackedEnum|string|list, + * weight?: int|Param, // Default: 1 + * metadata?: array, + * }>, + * metadata?: array, + * }>, + * }, + * router?: bool|array{ // Router configuration + * enabled?: bool|Param, // Default: false + * resource?: scalar|Param|null, + * type?: scalar|Param|null, + * cache_dir?: scalar|Param|null, // Deprecated: Setting the "framework.router.cache_dir.cache_dir" configuration option is deprecated. It will be removed in version 8.0. // Default: "%kernel.build_dir%" + * default_uri?: scalar|Param|null, // The default URI used to generate URLs in a non-HTTP context. // Default: null + * http_port?: scalar|Param|null, // Default: 80 + * https_port?: scalar|Param|null, // Default: 443 + * strict_requirements?: scalar|Param|null, // set to true to throw an exception when a parameter does not match the requirements set to false to disable exceptions when a parameter does not match the requirements (and return null instead) set to null to disable parameter checks against requirements 'true' is the preferred configuration in development mode, while 'false' or 'null' might be preferred in production // Default: true + * utf8?: bool|Param, // Default: true + * }, + * session?: bool|array{ // Session configuration + * enabled?: bool|Param, // Default: false + * storage_factory_id?: scalar|Param|null, // Default: "session.storage.factory.native" + * handler_id?: scalar|Param|null, // Defaults to using the native session handler, or to the native *file* session handler if "save_path" is not null. + * name?: scalar|Param|null, + * cookie_lifetime?: scalar|Param|null, + * cookie_path?: scalar|Param|null, + * cookie_domain?: scalar|Param|null, + * cookie_secure?: true|false|"auto"|Param, // Default: "auto" + * cookie_httponly?: bool|Param, // Default: true + * cookie_samesite?: null|"lax"|"strict"|"none"|Param, // Default: "lax" + * use_cookies?: bool|Param, + * gc_divisor?: scalar|Param|null, + * gc_probability?: scalar|Param|null, + * gc_maxlifetime?: scalar|Param|null, + * save_path?: scalar|Param|null, // Defaults to "%kernel.cache_dir%/sessions" if the "handler_id" option is not null. + * metadata_update_threshold?: int|Param, // Seconds to wait between 2 session metadata updates. // Default: 0 + * sid_length?: int|Param, // Deprecated: Setting the "framework.session.sid_length.sid_length" configuration option is deprecated. It will be removed in version 8.0. No alternative is provided as PHP 8.4 has deprecated the related option. + * sid_bits_per_character?: int|Param, // Deprecated: Setting the "framework.session.sid_bits_per_character.sid_bits_per_character" configuration option is deprecated. It will be removed in version 8.0. No alternative is provided as PHP 8.4 has deprecated the related option. + * }, + * request?: bool|array{ // Request configuration + * enabled?: bool|Param, // Default: false + * formats?: array>, + * }, + * assets?: bool|array{ // Assets configuration + * 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 + * version_format?: scalar|Param|null, // Default: "%%s?%%s" + * json_manifest_path?: scalar|Param|null, // Default: null + * base_path?: scalar|Param|null, // Default: "" + * base_urls?: string|list, + * packages?: array, + * }>, + * }, + * asset_mapper?: bool|array{ // Asset Mapper configuration + * enabled?: bool|Param, // Default: true + * paths?: string|array, + * excluded_patterns?: list, + * exclude_dotfiles?: bool|Param, // If true, any files starting with "." will be excluded from the asset mapper. // Default: true + * server?: bool|Param, // If true, a "dev server" will return the assets from the public directory (true in "debug" mode only by default). // Default: true + * public_prefix?: scalar|Param|null, // The public path where the assets will be written to (and served from when "server" is true). // Default: "/assets/" + * missing_import_mode?: "strict"|"warn"|"ignore"|Param, // Behavior if an asset cannot be found when imported from JavaScript or CSS files - e.g. "import './non-existent.js'". "strict" means an exception is thrown, "warn" means a warning is logged, "ignore" means the import is left as-is. // Default: "warn" + * extensions?: array, + * importmap_path?: scalar|Param|null, // The path of the importmap.php file. // Default: "%kernel.project_dir%/importmap.php" + * importmap_polyfill?: scalar|Param|null, // The importmap name that will be used to load the polyfill. Set to false to disable. // Default: "es-module-shims" + * importmap_script_attributes?: array, + * vendor_dir?: scalar|Param|null, // The directory to store JavaScript vendors. // Default: "%kernel.project_dir%/assets/vendor" + * precompress?: bool|array{ // Precompress assets with Brotli, Zstandard and gzip. + * enabled?: bool|Param, // Default: false + * formats?: list, + * extensions?: list, + * }, + * }, + * translator?: bool|array{ // Translator configuration + * enabled?: bool|Param, // Default: true + * fallbacks?: string|list, + * logging?: bool|Param, // Default: false + * formatter?: scalar|Param|null, // Default: "translator.formatter.default" + * cache_dir?: scalar|Param|null, // Default: "%kernel.cache_dir%/translations" + * default_path?: scalar|Param|null, // The default path used to load translations. // Default: "%kernel.project_dir%/translations" + * paths?: list, + * pseudo_localization?: bool|array{ + * enabled?: bool|Param, // Default: false + * accents?: bool|Param, // Default: true + * expansion_factor?: float|Param, // Default: 1.0 + * brackets?: bool|Param, // Default: true + * parse_html?: bool|Param, // Default: false + * localizable_html_attributes?: list, + * }, + * providers?: array, + * locales?: list, + * }>, + * globals?: array, + * domain?: string|Param, + * }>, + * }, + * validation?: bool|array{ // Validation configuration + * enabled?: bool|Param, // Default: true + * cache?: scalar|Param|null, // Deprecated: Setting the "framework.validation.cache.cache" configuration option is deprecated. It will be removed in version 8.0. + * enable_attributes?: bool|Param, // Default: true + * static_method?: string|list, + * translation_domain?: scalar|Param|null, // Default: "validators" + * email_validation_mode?: "html5"|"html5-allow-no-tld"|"strict"|"loose"|Param, // Default: "html5" + * mapping?: array{ + * paths?: list, + * }, + * not_compromised_password?: bool|array{ + * enabled?: bool|Param, // When disabled, compromised passwords will be accepted as valid. // Default: true + * endpoint?: scalar|Param|null, // API endpoint for the NotCompromisedPassword Validator. // Default: null + * }, + * disable_translation?: bool|Param, // Default: false + * auto_mapping?: array, + * }>, + * }, + * annotations?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * serializer?: bool|array{ // Serializer configuration + * enabled?: bool|Param, // Default: false + * enable_attributes?: bool|Param, // Default: true + * name_converter?: scalar|Param|null, + * circular_reference_handler?: scalar|Param|null, + * max_depth_handler?: scalar|Param|null, + * mapping?: array{ + * paths?: list, + * }, + * default_context?: array, + * named_serializers?: array, + * include_built_in_normalizers?: bool|Param, // Whether to include the built-in normalizers // Default: true + * include_built_in_encoders?: bool|Param, // Whether to include the built-in encoders // Default: true + * }>, + * }, + * property_access?: bool|array{ // Property access configuration + * enabled?: bool|Param, // Default: true + * magic_call?: bool|Param, // Default: false + * magic_get?: bool|Param, // Default: true + * magic_set?: bool|Param, // Default: true + * throw_exception_on_invalid_index?: bool|Param, // Default: false + * throw_exception_on_invalid_property_path?: bool|Param, // Default: true + * }, + * type_info?: bool|array{ // Type info configuration + * enabled?: bool|Param, // Default: true + * aliases?: array, + * }, + * property_info?: bool|array{ // Property info configuration + * enabled?: bool|Param, // Default: true + * with_constructor_extractor?: bool|Param, // Registers the constructor extractor. + * }, + * cache?: array{ // Cache configuration + * prefix_seed?: scalar|Param|null, // Used to namespace cache keys when using several apps with the same shared backend. // Default: "_%kernel.project_dir%.%kernel.container_class%" + * app?: scalar|Param|null, // App related cache pools configuration. // Default: "cache.adapter.filesystem" + * system?: scalar|Param|null, // System related cache pools configuration. // Default: "cache.adapter.system" + * directory?: scalar|Param|null, // Default: "%kernel.share_dir%/pools/app" + * default_psr6_provider?: scalar|Param|null, + * default_redis_provider?: scalar|Param|null, // Default: "redis://localhost" + * default_valkey_provider?: scalar|Param|null, // Default: "valkey://localhost" + * default_memcached_provider?: scalar|Param|null, // Default: "memcached://localhost" + * default_doctrine_dbal_provider?: scalar|Param|null, // Default: "database_connection" + * default_pdo_provider?: scalar|Param|null, // Default: null + * pools?: array, + * tags?: scalar|Param|null, // Default: null + * public?: bool|Param, // Default: false + * default_lifetime?: scalar|Param|null, // Default lifetime of the pool. + * provider?: scalar|Param|null, // Overwrite the setting from the default provider for this adapter. + * early_expiration_message_bus?: scalar|Param|null, + * clearer?: scalar|Param|null, + * }>, + * }, + * php_errors?: array{ // PHP errors handling configuration + * log?: mixed, // Use the application logger instead of the PHP logger for logging PHP errors. // Default: true + * throw?: bool|Param, // Throw PHP errors as \ErrorException instances. // Default: true + * }, + * exceptions?: array, + * web_link?: bool|array{ // Web links configuration + * enabled?: bool|Param, // Default: false + * }, + * lock?: bool|string|array{ // Lock configuration + * enabled?: bool|Param, // Default: true + * resources?: string|array>, + * }, + * semaphore?: bool|string|array{ // Semaphore configuration + * enabled?: bool|Param, // Default: false + * resources?: string|array, + * }, + * messenger?: bool|array{ // Messenger configuration + * enabled?: bool|Param, // Default: false + * routing?: array, + * }>, + * serializer?: array{ + * default_serializer?: scalar|Param|null, // Service id to use as the default serializer for the transports. // Default: "messenger.transport.native_php_serializer" + * symfony_serializer?: array{ + * format?: scalar|Param|null, // Serialization format for the messenger.transport.symfony_serializer service (which is not the serializer used by default). // Default: "json" + * context?: array, + * }, + * }, + * transports?: array, + * failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null + * retry_strategy?: string|array{ + * service?: scalar|Param|null, // Service id to override the retry strategy entirely. // Default: null + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: this delay = (delay * (multiple ^ retries)). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness to apply to the delay (between 0 and 1). // Default: 0.1 + * }, + * rate_limiter?: scalar|Param|null, // Rate limiter name to use when processing messages. // Default: null + * }>, + * failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null + * stop_worker_on_signals?: int|string|list, + * default_bus?: scalar|Param|null, // Default: null + * buses?: array, + * }>, + * }>, + * }, + * scheduler?: bool|array{ // Scheduler configuration + * enabled?: bool|Param, // Default: false + * }, + * disallow_search_engine_index?: bool|Param, // Enabled by default when debug is enabled. // Default: true + * http_client?: bool|array{ // HTTP Client configuration + * enabled?: bool|Param, // Default: true + * max_host_connections?: int|Param, // The maximum number of connections to a single host. + * default_options?: array{ + * headers?: array, + * vars?: array, + * max_redirects?: int|Param, // The maximum number of redirects to follow. + * http_version?: scalar|Param|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. + * resolve?: array, + * proxy?: scalar|Param|null, // The URL of the proxy to pass requests through or null for automatic detection. + * no_proxy?: scalar|Param|null, // A comma separated list of hosts that do not require a proxy to be reached. + * timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. + * max_duration?: float|Param, // The maximum execution time for the request+response as a whole. + * bindto?: scalar|Param|null, // A network interface name, IP address, a host name or a UNIX socket to bind to. + * verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context. + * verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name. + * cafile?: scalar|Param|null, // A certificate authority file. + * capath?: scalar|Param|null, // A directory that contains multiple certificate authority files. + * local_cert?: scalar|Param|null, // A PEM formatted certificate file. + * local_pk?: scalar|Param|null, // A private key file. + * passphrase?: scalar|Param|null, // The passphrase used to encrypt the "local_pk" file. + * ciphers?: scalar|Param|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...) + * peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es). + * sha1?: mixed, + * pin-sha256?: mixed, + * md5?: mixed, + * }, + * crypto_method?: scalar|Param|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. + * extra?: array, + * rate_limiter?: scalar|Param|null, // Rate limiter name to use for throttling requests. // Default: null + * caching?: bool|array{ // Caching configuration. + * enabled?: bool|Param, // Default: false + * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" + * shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true + * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null + * }, + * retry_failed?: bool|array{ + * enabled?: bool|Param, // Default: false + * retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null + * http_codes?: int|string|array, + * }>, + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 + * }, + * }, + * mock_response_factory?: scalar|Param|null, // The id of the service that should generate mock responses. It should be either an invokable or an iterable. + * scoped_clients?: array, + * headers?: array, + * max_redirects?: int|Param, // The maximum number of redirects to follow. + * http_version?: scalar|Param|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. + * resolve?: array, + * proxy?: scalar|Param|null, // The URL of the proxy to pass requests through or null for automatic detection. + * no_proxy?: scalar|Param|null, // A comma separated list of hosts that do not require a proxy to be reached. + * timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. + * max_duration?: float|Param, // The maximum execution time for the request+response as a whole. + * bindto?: scalar|Param|null, // A network interface name, IP address, a host name or a UNIX socket to bind to. + * verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context. + * verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name. + * cafile?: scalar|Param|null, // A certificate authority file. + * capath?: scalar|Param|null, // A directory that contains multiple certificate authority files. + * local_cert?: scalar|Param|null, // A PEM formatted certificate file. + * local_pk?: scalar|Param|null, // A private key file. + * passphrase?: scalar|Param|null, // The passphrase used to encrypt the "local_pk" file. + * ciphers?: scalar|Param|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...). + * peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es). + * sha1?: mixed, + * pin-sha256?: mixed, + * md5?: mixed, + * }, + * crypto_method?: scalar|Param|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. + * extra?: array, + * rate_limiter?: scalar|Param|null, // Rate limiter name to use for throttling requests. // Default: null + * caching?: bool|array{ // Caching configuration. + * enabled?: bool|Param, // Default: false + * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" + * shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true + * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. Null means no cap. // Default: null + * }, + * retry_failed?: bool|array{ + * enabled?: bool|Param, // Default: false + * retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null + * http_codes?: int|string|array, + * }>, + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 + * }, + * }>, + * }, + * mailer?: bool|array{ // Mailer configuration + * enabled?: bool|Param, // Default: true + * message_bus?: scalar|Param|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null + * dsn?: scalar|Param|null, // Default: null + * transports?: array, + * envelope?: array{ // Mailer Envelope configuration + * sender?: scalar|Param|null, + * recipients?: string|list, + * allowed_recipients?: string|list, + * }, + * headers?: array, + * dkim_signer?: bool|array{ // DKIM signer configuration + * enabled?: bool|Param, // Default: false + * key?: scalar|Param|null, // Key content, or path to key (in PEM format with the `file://` prefix) // Default: "" + * domain?: scalar|Param|null, // Default: "" + * select?: scalar|Param|null, // Default: "" + * passphrase?: scalar|Param|null, // The private key passphrase // Default: "" + * options?: array, + * }, + * smime_signer?: bool|array{ // S/MIME signer configuration + * enabled?: bool|Param, // Default: false + * key?: scalar|Param|null, // Path to key (in PEM format) // Default: "" + * certificate?: scalar|Param|null, // Path to certificate (in PEM format without the `file://` prefix) // Default: "" + * passphrase?: scalar|Param|null, // The private key passphrase // Default: null + * extra_certificates?: scalar|Param|null, // Default: null + * sign_options?: int|Param, // Default: null + * }, + * smime_encrypter?: bool|array{ // S/MIME encrypter configuration + * enabled?: bool|Param, // Default: false + * repository?: scalar|Param|null, // S/MIME certificate repository service. This service shall implement the `Symfony\Component\Mailer\EventListener\SmimeCertificateRepositoryInterface`. // Default: "" + * cipher?: int|Param, // A set of algorithms used to encrypt the message // Default: null + * }, + * }, + * secrets?: bool|array{ + * enabled?: bool|Param, // Default: true + * vault_directory?: scalar|Param|null, // Default: "%kernel.project_dir%/config/secrets/%kernel.runtime_environment%" + * local_dotenv_file?: scalar|Param|null, // Default: "%kernel.project_dir%/.env.%kernel.environment%.local" + * decryption_env_var?: scalar|Param|null, // Default: "base64:default::SYMFONY_DECRYPTION_SECRET" + * }, + * notifier?: bool|array{ // Notifier configuration + * enabled?: bool|Param, // Default: false + * message_bus?: scalar|Param|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null + * chatter_transports?: array, + * texter_transports?: array, + * notification_on_failed_messages?: bool|Param, // Default: false + * channel_policy?: array>, + * admin_recipients?: list, + * }, + * rate_limiter?: bool|array{ // Rate limiter configuration + * enabled?: bool|Param, // Default: false + * limiters?: array, + * limit?: int|Param, // The maximum allowed hits in a fixed interval or burst. + * interval?: scalar|Param|null, // Configures the fixed interval if "policy" is set to "fixed_window" or "sliding_window". The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). + * rate?: array{ // Configures the fill rate if "policy" is set to "token_bucket". + * interval?: scalar|Param|null, // Configures the rate interval. The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). + * amount?: int|Param, // Amount of tokens to add each interval. // Default: 1 + * }, + * }>, + * }, + * uid?: bool|array{ // Uid configuration + * enabled?: bool|Param, // Default: false + * 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, + * time_based_uuid_version?: 7|6|1|Param, // Default: 7 + * time_based_uuid_node?: scalar|Param|null, + * }, + * html_sanitizer?: bool|array{ // HtmlSanitizer configuration + * enabled?: bool|Param, // Default: false + * sanitizers?: array, + * block_elements?: string|list, + * drop_elements?: string|list, + * allow_attributes?: array, + * drop_attributes?: array, + * force_attributes?: array>, + * force_https_urls?: bool|Param, // Transforms URLs using the HTTP scheme to use the HTTPS scheme instead. // Default: false + * allowed_link_schemes?: string|list, + * allowed_link_hosts?: null|string|list, + * allow_relative_links?: bool|Param, // Allows relative URLs to be used in links href attributes. // Default: false + * allowed_media_schemes?: string|list, + * allowed_media_hosts?: null|string|list, + * allow_relative_medias?: bool|Param, // Allows relative URLs to be used in media source attributes (img, audio, video, ...). // Default: false + * with_attribute_sanitizers?: string|list, + * without_attribute_sanitizers?: string|list, + * max_input_length?: int|Param, // The maximum length allowed for the sanitized input. // Default: 0 + * }>, + * }, + * webhook?: bool|array{ // Webhook configuration + * enabled?: bool|Param, // Default: false + * message_bus?: scalar|Param|null, // The message bus to use. // Default: "messenger.default_bus" + * routing?: array, + * }, + * remote-event?: bool|array{ // RemoteEvent configuration + * enabled?: bool|Param, // Default: false + * }, + * json_streamer?: bool|array{ // JSON streamer configuration + * enabled?: bool|Param, // Default: false + * }, + * } + * @psalm-type SecurityConfig = array{ + * access_denied_url?: scalar|Param|null, // Default: null + * session_fixation_strategy?: "none"|"migrate"|"invalidate"|Param, // Default: "migrate" + * hide_user_not_found?: bool|Param, // Deprecated: The "hide_user_not_found" option is deprecated and will be removed in 8.0. Use the "expose_security_errors" option instead. + * 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, // 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, + * 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, + * }, + * memory?: array{ + * users?: array, + * }>, + * }, + * 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, + * default_roles?: string|list, + * 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 + * }, + * ting?: array{ + * class?: scalar|Param|null, // The full entity class name of your user class. + * property?: 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, + * 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"|"executionContexts"|Param>, + * delete_cookies?: string|array, + * }, + * 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, + * custom_authenticators?: list, + * 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, + * 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, + * 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, + * 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..). // Default: "sub" + * audience?: scalar|Param|null, // Audience set in the token, for validation purpose. + * issuers?: list, + * algorithm?: array, + * algorithms?: list, + * key?: scalar|Param|null, // Deprecated: The "key" option is deprecated and will be removed in 8.0. Use the "keyset" option instead. // JSON-encoded JWK used to sign the token (must contain a "kty" key). + * 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, + * 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, + * catch_exceptions?: bool|Param, // Default: true + * signature_properties?: list, + * 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: null + * httponly?: bool|Param, // Default: true + * samesite?: null|"lax"|"strict"|"none"|Param, // Default: "lax" + * always_remember_me?: bool|Param, // Default: false + * remember_me_parameter?: scalar|Param|null, // Default: "_remember_me" + * }, + * }>, + * access_control?: list, + * attributes?: array, + * route?: scalar|Param|null, // Default: null + * methods?: string|list, + * allow_if?: scalar|Param|null, // Default: null + * roles?: string|list, + * }>, + * role_hierarchy?: array>, + * } + * @psalm-type TwigConfig = array{ + * form_themes?: list, + * globals?: array, + * 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, + * paths?: array, + * 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 TwigExtraConfig = array{ + * cache?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * html?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * markdown?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * intl?: bool|array{ + * enabled?: bool|Param, // Default: true + * }, + * cssinliner?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * inky?: bool|array{ + * enabled?: bool|Param, // Default: false + * }, + * string?: bool|array{ + * enabled?: bool|Param, // Default: true + * }, + * commonmark?: array{ + * renderer?: array{ // Array of options for rendering HTML. + * block_separator?: scalar|Param|null, + * inner_separator?: scalar|Param|null, + * soft_break?: scalar|Param|null, + * }, + * html_input?: "strip"|"allow"|"escape"|Param, // How to handle HTML input. + * allow_unsafe_links?: bool|Param, // Remove risky link and image URLs by setting this to false. // Default: true + * max_nesting_level?: int|Param, // The maximum nesting level for blocks. // Default: 9223372036854775807 + * max_delimiters_per_line?: int|Param, // The maximum number of strong/emphasis delimiters per line. // Default: 9223372036854775807 + * slug_normalizer?: array{ // Array of options for configuring how URL-safe slugs are created. + * instance?: mixed, + * max_length?: int|Param, // Default: 255 + * unique?: mixed, + * }, + * commonmark?: array{ // Array of options for configuring the CommonMark core extension. + * enable_em?: bool|Param, // Default: true + * enable_strong?: bool|Param, // Default: true + * use_asterisk?: bool|Param, // Default: true + * use_underscore?: bool|Param, // Default: true + * unordered_list_markers?: list, + * }, + * ... + * }, + * } + * @psalm-type MonologConfig = array{ + * use_microseconds?: scalar|Param|null, // Default: true + * channels?: list, + * handlers?: array, + * excluded_http_codes?: list, + * }>, + * accepted_levels?: list, + * min_level?: scalar|Param|null, // Default: "DEBUG" + * max_level?: scalar|Param|null, // Default: "EMERGENCY" + * buffer_size?: scalar|Param|null, // Default: 0 + * flush_on_overflow?: bool|Param, // Default: false + * handler?: scalar|Param|null, + * url?: scalar|Param|null, + * exchange?: scalar|Param|null, + * exchange_name?: scalar|Param|null, // Default: "log" + * room?: scalar|Param|null, + * message_format?: scalar|Param|null, // Default: "text" + * api_version?: scalar|Param|null, // Default: null + * channel?: scalar|Param|null, // Default: null + * bot_name?: scalar|Param|null, // Default: "Monolog" + * use_attachment?: scalar|Param|null, // Default: true + * use_short_attachment?: scalar|Param|null, // Default: false + * include_extra?: scalar|Param|null, // Default: false + * icon_emoji?: scalar|Param|null, // Default: null + * webhook_url?: scalar|Param|null, + * exclude_fields?: list, + * team?: scalar|Param|null, + * notify?: scalar|Param|null, // Default: false + * nickname?: scalar|Param|null, // Default: "Monolog" + * token?: scalar|Param|null, + * region?: scalar|Param|null, + * source?: scalar|Param|null, + * use_ssl?: bool|Param, // Default: true + * user?: mixed, + * title?: scalar|Param|null, // Default: null + * host?: scalar|Param|null, // Default: null + * port?: scalar|Param|null, // Default: 514 + * config?: list, + * members?: list, + * connection_string?: scalar|Param|null, + * timeout?: scalar|Param|null, + * time?: scalar|Param|null, // Default: 60 + * deduplication_level?: scalar|Param|null, // Default: 400 + * store?: scalar|Param|null, // Default: null + * connection_timeout?: scalar|Param|null, + * persistent?: bool|Param, + * dsn?: scalar|Param|null, + * hub_id?: scalar|Param|null, // Default: null + * client_id?: scalar|Param|null, // Default: null + * auto_log_stacks?: scalar|Param|null, // Default: false + * release?: scalar|Param|null, // Default: null + * environment?: scalar|Param|null, // Default: null + * message_type?: scalar|Param|null, // Default: 0 + * parse_mode?: scalar|Param|null, // Default: null + * disable_webpage_preview?: bool|Param|null, // Default: null + * disable_notification?: bool|Param|null, // Default: null + * split_long_messages?: bool|Param, // Default: false + * delay_between_messages?: bool|Param, // Default: false + * topic?: int|Param, // Default: null + * factor?: int|Param, // Default: 1 + * tags?: string|list, + * console_formater_options?: mixed, // Deprecated: "monolog.handlers..console_formater_options.console_formater_options" is deprecated, use "monolog.handlers..console_formater_options.console_formatter_options" instead. + * console_formatter_options?: mixed, // Default: [] + * formatter?: scalar|Param|null, + * nested?: bool|Param, // Default: false + * publisher?: string|array{ + * id?: scalar|Param|null, + * hostname?: scalar|Param|null, + * port?: scalar|Param|null, // Default: 12201 + * chunk_size?: scalar|Param|null, // Default: 1420 + * encoder?: "json"|"compressed_json"|Param, + * }, + * mongo?: string|array{ + * id?: scalar|Param|null, + * host?: scalar|Param|null, + * port?: scalar|Param|null, // Default: 27017 + * user?: scalar|Param|null, + * pass?: scalar|Param|null, + * database?: scalar|Param|null, // Default: "monolog" + * collection?: scalar|Param|null, // Default: "logs" + * }, + * mongodb?: string|array{ + * id?: scalar|Param|null, // ID of a MongoDB\Client service + * uri?: scalar|Param|null, + * username?: scalar|Param|null, + * password?: scalar|Param|null, + * database?: scalar|Param|null, // Default: "monolog" + * collection?: scalar|Param|null, // Default: "logs" + * }, + * elasticsearch?: string|array{ + * id?: scalar|Param|null, + * hosts?: list, + * host?: scalar|Param|null, + * port?: scalar|Param|null, // Default: 9200 + * transport?: scalar|Param|null, // Default: "Http" + * user?: scalar|Param|null, // Default: null + * password?: scalar|Param|null, // Default: null + * }, + * index?: scalar|Param|null, // Default: "monolog" + * document_type?: scalar|Param|null, // Default: "logs" + * ignore_error?: scalar|Param|null, // Default: false + * redis?: string|array{ + * id?: scalar|Param|null, + * host?: scalar|Param|null, + * password?: scalar|Param|null, // Default: null + * port?: scalar|Param|null, // Default: 6379 + * database?: scalar|Param|null, // Default: 0 + * key_name?: scalar|Param|null, // Default: "monolog_redis" + * }, + * predis?: string|array{ + * id?: scalar|Param|null, + * host?: scalar|Param|null, + * }, + * from_email?: scalar|Param|null, + * to_email?: string|list, + * subject?: scalar|Param|null, + * content_type?: scalar|Param|null, // Default: null + * headers?: list, + * mailer?: scalar|Param|null, // Default: null + * email_prototype?: string|array{ + * id?: scalar|Param|null, + * method?: scalar|Param|null, // Default: null + * }, + * lazy?: bool|Param, // Default: true + * verbosity_levels?: array{ + * VERBOSITY_QUIET?: scalar|Param|null, // Default: "ERROR" + * VERBOSITY_NORMAL?: scalar|Param|null, // Default: "WARNING" + * VERBOSITY_VERBOSE?: scalar|Param|null, // Default: "NOTICE" + * VERBOSITY_VERY_VERBOSE?: scalar|Param|null, // Default: "INFO" + * VERBOSITY_DEBUG?: scalar|Param|null, // Default: "DEBUG" + * }, + * channels?: string|array{ + * type?: scalar|Param|null, + * elements?: list, + * }, + * }>, + * } + * @psalm-type TingConfig = array{ + * cache_file?: scalar|Param|null, // Default: "ting.3.9.0.php" + * cache_provider?: scalar|Param|null, + * configuration_resolver_service?: scalar|Param|null, // If provided, this service will receive the configuration at boot time and can alter it. // Default: null + * repositories?: list, + * }>, + * connections?: list, + * }>, + * databases_options?: list, + * } + * @psalm-type KnpuOauth2ClientConfig = array{ + * http_client?: scalar|Param|null, // Service id of HTTP client to use (must implement GuzzleHttp\ClientInterface) // Default: null + * http_client_options?: array{ + * timeout?: int|Param, + * proxy?: scalar|Param|null, + * verify?: bool|Param, // Use only with proxy option set + * }, + * clients?: array>, + * } + * @psalm-type JmsSerializerConfig = array{ + * twig_enabled?: scalar|Param|null, // Default: "default" + * profiler?: scalar|Param|null, // Default: true + * enum_support?: scalar|Param|null, // Default: false + * default_value_property_reader_support?: scalar|Param|null, // Default: false + * handlers?: array{ + * datetime?: array{ + * default_format?: scalar|Param|null, // Default: "Y-m-d\\TH:i:sP" + * default_deserialization_formats?: list, + * default_timezone?: scalar|Param|null, // Default: "Europe/Paris" + * cdata?: scalar|Param|null, // Default: true + * }, + * array_collection?: array{ + * initialize_excluded?: bool|Param, // Default: false + * }, + * symfony_uid?: array{ + * default_format?: scalar|Param|null, // Default: "canonical" + * cdata?: scalar|Param|null, // Default: true + * }, + * }, + * subscribers?: array{ + * doctrine_proxy?: array{ + * initialize_excluded?: bool|Param, // Default: false + * initialize_virtual_types?: bool|Param, // Default: false + * }, + * }, + * object_constructors?: array{ + * doctrine?: bool|array{ + * enabled?: bool|Param, // Default: true + * fallback_strategy?: "null"|"exception"|"fallback"|Param, // Default: "null" + * }, + * }, + * property_naming?: string|array{ + * id?: scalar|Param|null, + * separator?: scalar|Param|null, // Default: "_" + * lower_case?: bool|Param, // Default: true + * }, + * expression_evaluator?: string|array{ + * id?: scalar|Param|null, // Default: "jms_serializer.expression_evaluator" + * }, + * metadata?: array{ + * warmup?: array{ + * paths?: array{ + * included?: list, + * excluded?: list, + * }, + * }, + * cache?: scalar|Param|null, // Default: "file" + * debug?: bool|Param, // Default: true + * file_cache?: array{ + * dir?: scalar|Param|null, // Default: null + * }, + * include_interfaces?: bool|Param, // Default: false + * auto_detection?: bool|Param, // Default: true + * infer_types_from_doc_block?: bool|Param, // Default: false + * infer_types_from_doctrine_metadata?: bool|Param, // Infers type information from Doctrine metadata if no explicit type has been defined for a property. // Default: true + * directories?: array, + * }, + * visitors?: array{ + * json_serialization?: array{ + * depth?: scalar|Param|null, + * options?: scalar|Param|null, // Default: 1024 + * }, + * json_deserialization?: array{ + * options?: scalar|Param|null, // Default: 0 + * strict?: bool|Param, // Default: false + * }, + * xml_serialization?: array{ + * version?: scalar|Param|null, + * encoding?: scalar|Param|null, + * format_output?: bool|Param, // Default: false + * default_root_name?: scalar|Param|null, + * default_root_ns?: scalar|Param|null, // Default: "" + * }, + * xml_deserialization?: array{ + * doctype_whitelist?: list, + * external_entities?: bool|Param, // Default: false + * options?: scalar|Param|null, // Default: 0 + * }, + * }, + * default_context?: array{ + * serialization?: string|array{ + * id?: scalar|Param|null, + * serialize_null?: scalar|Param|null, // Flag if null values should be serialized + * enable_max_depth_checks?: scalar|Param|null, // Flag to enable the max-depth exclusion strategy + * attributes?: array, + * groups?: list, + * version?: scalar|Param|null, // Application version to use in exclusion strategies + * }, + * deserialization?: string|array{ + * id?: scalar|Param|null, + * serialize_null?: scalar|Param|null, // Flag if null values should be serialized + * enable_max_depth_checks?: scalar|Param|null, // Flag to enable the max-depth exclusion strategy + * attributes?: array, + * groups?: list, + * version?: scalar|Param|null, // Application version to use in exclusion strategies + * }, + * }, + * instances?: array, + * default_timezone?: scalar|Param|null, // Default: "Europe/Paris" + * cdata?: scalar|Param|null, // Default: true + * }, + * array_collection?: array{ + * initialize_excluded?: bool|Param, // Default: false + * }, + * symfony_uid?: array{ + * default_format?: scalar|Param|null, // Default: "canonical" + * cdata?: scalar|Param|null, // Default: true + * }, + * }, + * subscribers?: array{ + * doctrine_proxy?: array{ + * initialize_excluded?: bool|Param, // Default: false + * initialize_virtual_types?: bool|Param, // Default: false + * }, + * }, + * object_constructors?: array{ + * doctrine?: bool|array{ + * enabled?: bool|Param, // Default: true + * fallback_strategy?: "null"|"exception"|"fallback"|Param, // Default: "null" + * }, + * }, + * property_naming?: string|array{ + * id?: scalar|Param|null, + * separator?: scalar|Param|null, // Default: "_" + * lower_case?: bool|Param, // Default: true + * }, + * expression_evaluator?: string|array{ + * id?: scalar|Param|null, // Default: "jms_serializer.expression_evaluator" + * }, + * metadata?: array{ + * warmup?: array{ + * paths?: array{ + * included?: list, + * excluded?: list, + * }, + * }, + * cache?: scalar|Param|null, // Default: "file" + * debug?: bool|Param, // Default: true + * file_cache?: array{ + * dir?: scalar|Param|null, // Default: null + * }, + * include_interfaces?: bool|Param, // Default: false + * auto_detection?: bool|Param, // Default: true + * infer_types_from_doc_block?: bool|Param, // Default: false + * infer_types_from_doctrine_metadata?: bool|Param, // Infers type information from Doctrine metadata if no explicit type has been defined for a property. // Default: true + * directories?: array, + * }, + * visitors?: array{ + * json_serialization?: array{ + * depth?: scalar|Param|null, + * options?: scalar|Param|null, // Default: 1024 + * }, + * json_deserialization?: array{ + * options?: scalar|Param|null, // Default: 0 + * strict?: bool|Param, // Default: false + * }, + * xml_serialization?: array{ + * version?: scalar|Param|null, + * encoding?: scalar|Param|null, + * format_output?: bool|Param, // Default: false + * default_root_name?: scalar|Param|null, + * default_root_ns?: scalar|Param|null, // Default: "" + * }, + * xml_deserialization?: array{ + * doctype_whitelist?: list, + * external_entities?: bool|Param, // Default: false + * options?: scalar|Param|null, // Default: 0 + * }, + * }, + * default_context?: array{ + * serialization?: string|array{ + * id?: scalar|Param|null, + * serialize_null?: scalar|Param|null, // Flag if null values should be serialized + * enable_max_depth_checks?: scalar|Param|null, // Flag to enable the max-depth exclusion strategy + * attributes?: array, + * groups?: list, + * version?: scalar|Param|null, // Application version to use in exclusion strategies + * }, + * deserialization?: string|array{ + * id?: scalar|Param|null, + * serialize_null?: scalar|Param|null, // Flag if null values should be serialized + * enable_max_depth_checks?: scalar|Param|null, // Flag to enable the max-depth exclusion strategy + * attributes?: array, + * groups?: list, + * version?: scalar|Param|null, // Application version to use in exclusion strategies + * }, + * }, + * }>, + * } + * @psalm-type PrestaSitemapConfig = array{ + * generator?: scalar|Param|null, // Default: "presta_sitemap.generator_default" + * dumper?: scalar|Param|null, // Default: "presta_sitemap.dumper_default" + * timetolive?: int|Param, // Default: 3600 + * sitemap_file_prefix?: scalar|Param|null, // Sets sitemap filename prefix defaults to "sitemap" -> sitemap.xml (for index); sitemap.
.xml(.gz) (for sitemaps) // Default: "sitemap" + * items_by_set?: int|Param, // The maximum number of items allowed in single sitemap. // Default: 50000 + * route_annotation_listener?: scalar|Param|null, // Default: true + * dump_directory?: scalar|Param|null, // The directory to which the sitemap will be dumped. It can be either absolute, or relative (to the place where the command will be triggered). Default to Symfony's public dir. // Default: "%kernel.project_dir%/public" + * defaults?: array{ + * priority?: scalar|Param|null, // Default: 0.5 + * changefreq?: scalar|Param|null, // Default: "daily" + * lastmod?: scalar|Param|null, // Default: "now" + * }, + * default_section?: scalar|Param|null, // The default section in which static routes are registered. // Default: "default" + * alternate?: bool|array{ // Automatically generate alternate (hreflang) urls with static routes. Requires route_annotation_listener config to be enabled. + * enabled?: bool|Param, // Default: false + * default_locale?: scalar|Param|null, // The default locale of your routes. // Default: "en" + * locales?: string|list, + * i18n?: "symfony"|"jms"|Param, // Strategy used to create your i18n routes. // Default: "symfony" + * }, + * } + * @psalm-type EwzRecaptchaConfig = array{ + * public_key?: scalar|Param|null, + * private_key?: scalar|Param|null, + * enabled?: bool|Param, // Default: true + * verify_host?: bool|Param, // Default: false + * ajax?: bool|Param, // Default: false + * locale_key?: scalar|Param|null, // Default: "%kernel.default_locale%" + * api_host?: scalar|Param|null, // Default: "www.google.com" + * locale_from_request?: bool|Param, // Default: false + * version?: int|Param, // Default: 2 + * hide_badge?: bool|Param, // Default: false + * score_threshold?: float|Param, // Default: 0.5 + * timeout?: int|Param, // Default: null + * trusted_roles?: list, + * http_proxy?: array{ + * host?: scalar|Param|null, // Default: null + * port?: scalar|Param|null, // Default: null + * auth?: scalar|Param|null, // Default: null + * }, + * service_definition?: list, + * } + * @psalm-type TiimeNewRelicConfig = array{ + * enabled?: bool|Param, // Default: true + * interactor?: scalar|Param|null, + * twig?: bool|Param, // Default: true + * api_key?: scalar|Param|null, // Default: null + * api_host?: scalar|Param|null, // Default: null + * license_key?: scalar|Param|null, // Default: null + * application_name?: scalar|Param|null, // Default: null + * deployment_names?: list, + * xmit?: scalar|Param|null, // Default: false + * logging?: bool|Param, // Write logs to a PSR3 logger whenever we send data to NewRelic. // Default: false + * exceptions?: bool|array{ + * enabled?: bool|Param, // Default: true + * }, + * commands?: bool|array{ + * enabled?: bool|Param, // Default: true + * ignored_commands?: list, + * }, + * deprecations?: bool|array{ + * enabled?: bool|Param, // Default: true + * }, + * http?: bool|array{ + * enabled?: bool|Param, // Default: true + * transaction_naming?: scalar|Param|null, // Default: "route" + * transaction_naming_service?: scalar|Param|null, // Default: null + * ignored_routes?: list, + * ignored_paths?: list, + * using_symfony_cache?: scalar|Param|null, // Default: false + * }, + * instrument?: bool|Param, // Default: false + * monolog?: bool|array{ + * enabled?: bool|Param, // Default: false + * channels?: string|array{ + * type?: scalar|Param|null, + * elements?: list, + * }, + * level?: scalar|Param|null, // Default: "error" + * service?: scalar|Param|null, // Default: "tiime.new_relic.monolog_handler" + * }, + * } + * @psalm-type DebugConfig = array{ + * max_items?: int|Param, // Max number of displayed items past the first level, -1 means no limit. // Default: 2500 + * min_depth?: int|Param, // Minimum tree depth to clone all the items, 1 is default. // Default: 1 + * max_string_length?: int|Param, // Max length of displayed strings, -1 means no limit. // Default: -1 + * dump_destination?: scalar|Param|null, // A stream URL where dumps should be written to. // Default: null + * theme?: "dark"|"light"|Param, // Changes the color of the dump() output when rendered directly on the templating. "dark" (default) or "light". // Default: "dark" + * } + * @psalm-type WebProfilerConfig = array{ + * toolbar?: bool|array{ // Profiler toolbar configuration + * enabled?: bool|Param, // Default: false + * ajax_replace?: bool|Param, // Replace toolbar on AJAX requests // Default: false + * }, + * intercept_redirects?: bool|Param, // Default: false + * excluded_ajax_paths?: scalar|Param|null, // Default: "^/((index|app(_[\\w]+)?)\\.php/)?_wdt" + * } + * @psalm-type ValinorConfig = array{ + * mapper?: array{ + * date_formats_supported?: list, + * allowed_exceptions?: list, + * }, + * http?: array{ + * convert_request_to_psr?: bool|Param, // Convert HTTP request object to PSR-7 request before mapping, allowing an instance of this request to be used in the controller. // Default: false + * }, + * cache?: array{ + * service?: scalar|Param|null, // Id of the Symfony cache service used to improve the mapper performance. // Default: "valinor.cache.filesystem" + * env_where_files_are_watched?: list, + * }, + * console?: array{ + * mapping_errors_to_output?: int|Param, // Maximum number of detailed mapping errors to be displayed to the console. Set to 0 to disable. // Default: 10 + * }, + * } + * @psalm-type DoctrineConfig = array{ + * dbal?: array{ + * default_connection?: scalar|Param|null, + * types?: array, + * driver_schemes?: array, + * connections?: array, + * mapping_types?: array, + * default_table_options?: array, + * schema_manager_factory?: scalar|Param|null, // Default: "doctrine.dbal.default_schema_manager_factory" + * result_cache?: scalar|Param|null, + * slaves?: array, + * replicas?: array, + * }>, + * }, + * orm?: array{ + * default_entity_manager?: scalar|Param|null, + * auto_generate_proxy_classes?: scalar|Param|null, // Auto generate mode possible values are: "NEVER", "ALWAYS", "FILE_NOT_EXISTS", "EVAL", "FILE_NOT_EXISTS_OR_CHANGED", this option is ignored when the "enable_native_lazy_objects" option is true // Default: false + * enable_lazy_ghost_objects?: bool|Param, // Enables the new implementation of proxies based on lazy ghosts instead of using the legacy implementation // Default: true + * enable_native_lazy_objects?: bool|Param, // Enables the new native implementation of PHP lazy objects instead of generated proxies // Default: false + * proxy_dir?: scalar|Param|null, // Configures the path where generated proxy classes are saved when using non-native lazy objects, this option is ignored when the "enable_native_lazy_objects" option is true // Default: "%kernel.build_dir%/doctrine/orm/Proxies" + * proxy_namespace?: scalar|Param|null, // Defines the root namespace for generated proxy classes when using non-native lazy objects, this option is ignored when the "enable_native_lazy_objects" option is true // Default: "Proxies" + * controller_resolver?: bool|array{ + * enabled?: bool|Param, // Default: true + * auto_mapping?: bool|Param|null, // Set to false to disable using route placeholders as lookup criteria when the primary key doesn't match the argument name // Default: null + * 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, + * }>, + * }>, + * }, + * 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, + * report_fields_where_declared?: bool|Param, // Set to "true" to opt-in to the new mapping driver mode that was added in Doctrine ORM 2.16 and will be mandatory in ORM 3.0. See https://github.com/doctrine/orm/pull/10455. // Default: true + * 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. 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, + * loggers?: array, + * }, + * hydrators?: array, + * mappings?: array, + * dql?: array{ + * string_functions?: array, + * numeric_functions?: array, + * datetime_functions?: array, + * }, + * filters?: array, + * }>, + * identity_generation_preferences?: array, + * }>, + * resolve_target_entities?: array, + * }, + * } + * @psalm-type ConfigType = array{ + * imports?: ImportsConfig, + * parameters?: ParametersConfig, + * services?: ServicesConfig, + * framework?: FrameworkConfig, + * security?: SecurityConfig, + * twig?: TwigConfig, + * twig_extra?: TwigExtraConfig, + * monolog?: MonologConfig, + * ting?: TingConfig, + * knpu_oauth2_client?: KnpuOauth2ClientConfig, + * jms_serializer?: JmsSerializerConfig, + * presta_sitemap?: PrestaSitemapConfig, + * ewz_recaptcha?: EwzRecaptchaConfig, + * tiime_new_relic?: TiimeNewRelicConfig, + * valinor?: ValinorConfig, + * doctrine?: DoctrineConfig, + * "when@dev"?: array{ + * imports?: ImportsConfig, + * parameters?: ParametersConfig, + * services?: ServicesConfig, + * framework?: FrameworkConfig, + * security?: SecurityConfig, + * twig?: TwigConfig, + * twig_extra?: TwigExtraConfig, + * monolog?: MonologConfig, + * ting?: TingConfig, + * knpu_oauth2_client?: KnpuOauth2ClientConfig, + * jms_serializer?: JmsSerializerConfig, + * presta_sitemap?: PrestaSitemapConfig, + * ewz_recaptcha?: EwzRecaptchaConfig, + * tiime_new_relic?: TiimeNewRelicConfig, + * debug?: DebugConfig, + * web_profiler?: WebProfilerConfig, + * valinor?: ValinorConfig, + * doctrine?: DoctrineConfig, + * }, + * "when@prod"?: array{ + * imports?: ImportsConfig, + * parameters?: ParametersConfig, + * services?: ServicesConfig, + * framework?: FrameworkConfig, + * security?: SecurityConfig, + * twig?: TwigConfig, + * twig_extra?: TwigExtraConfig, + * monolog?: MonologConfig, + * ting?: TingConfig, + * knpu_oauth2_client?: KnpuOauth2ClientConfig, + * jms_serializer?: JmsSerializerConfig, + * presta_sitemap?: PrestaSitemapConfig, + * ewz_recaptcha?: EwzRecaptchaConfig, + * tiime_new_relic?: TiimeNewRelicConfig, + * valinor?: ValinorConfig, + * doctrine?: DoctrineConfig, + * }, + * "when@test"?: array{ + * imports?: ImportsConfig, + * parameters?: ParametersConfig, + * services?: ServicesConfig, + * framework?: FrameworkConfig, + * security?: SecurityConfig, + * twig?: TwigConfig, + * twig_extra?: TwigExtraConfig, + * monolog?: MonologConfig, + * ting?: TingConfig, + * knpu_oauth2_client?: KnpuOauth2ClientConfig, + * jms_serializer?: JmsSerializerConfig, + * presta_sitemap?: PrestaSitemapConfig, + * ewz_recaptcha?: EwzRecaptchaConfig, + * tiime_new_relic?: TiimeNewRelicConfig, + * debug?: DebugConfig, + * web_profiler?: WebProfilerConfig, + * valinor?: ValinorConfig, + * doctrine?: DoctrineConfig, + * }, + * ..., + * }> + * } + */ +final class App +{ + /** + * @param ConfigType $config + * + * @psalm-return ConfigType + */ + public static function config(array $config): array + { + /** @var ConfigType $config */ + $config = AppReference::config($config); + + return $config; + } +} + +namespace Symfony\Component\Routing\Loader\Configurator; + +/** + * This class provides array-shapes for configuring the routes of an application. + * + * Example: + * + * ```php + * // config/routes.php + * namespace Symfony\Component\Routing\Loader\Configurator; + * + * return Routes::config([ + * 'controllers' => [ + * 'resource' => 'routing.controllers', + * ], + * ]); + * ``` + * + * @psalm-type RouteConfig = array{ + * path: string|array, + * controller?: string, + * methods?: string|list, + * requirements?: array, + * defaults?: array, + * options?: array, + * host?: string|array, + * schemes?: string|list, + * condition?: string, + * locale?: string, + * format?: string, + * utf8?: bool, + * stateless?: bool, + * } + * @psalm-type ImportConfig = array{ + * resource: string, + * type?: string, + * exclude?: string|list, + * prefix?: string|array, + * name_prefix?: string, + * trailing_slash_on_root?: bool, + * controller?: string, + * methods?: string|list, + * requirements?: array, + * defaults?: array, + * options?: array, + * host?: string|array, + * schemes?: string|list, + * condition?: string, + * locale?: string, + * format?: string, + * utf8?: bool, + * stateless?: bool, + * } + * @psalm-type AliasConfig = array{ + * alias: string, + * deprecated?: array{package:string, version:string, message?:string}, + * } + * @psalm-type RoutesConfig = array{ + * "when@dev"?: array, + * "when@prod"?: array, + * "when@test"?: array, + * ... + * } + */ +final class Routes +{ + /** + * @param RoutesConfig $config + * + * @psalm-return RoutesConfig + */ + public static function config(array $config): array + { + return $config; + } +} diff --git a/behat.php b/behat.php index 178f3279e..3a214725c 100644 --- a/behat.php +++ b/behat.php @@ -1,5 +1,7 @@ withContexts( FeatureContext::class, - MinkContext::class + MinkContext::class, ) ->withPaths('%paths.base%/tests/behat') ->withFilter(new TagFilter('~@javascript-group&&~@javascript')) diff --git a/composer.json b/composer.json index 65ab53534..64cbd514b 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,7 @@ "description": "Main repository for afup website", "type": "project", "require": { - "php": ">=8.2", + "php": ">=8.5", "ext-curl": "*", "ext-dom": "*", "ext-gd": "*", @@ -52,6 +52,7 @@ "symfony/form": "7.4.*", "symfony/framework-bundle": "7.4.*", "symfony/http-client": "7.4.*", + "symfony/http-foundation": "7.4.*", "symfony/http-kernel": "7.4.*", "symfony/intl": "7.4.*", "symfony/lock": "7.4.*", @@ -165,7 +166,7 @@ "phpunit/phpunit": "11.*", "rector/rector": "^2.0", "robertfausk/behat-panther-extension": "^1.2", - "smalot/pdfparser": "^1.0", + "smalot/pdfparser": "2.*", "symfony/debug-bundle": "7.4.*", "symfony/json-path": "7.4.*", "symfony/web-profiler-bundle": "7.4.*", @@ -232,6 +233,9 @@ "symfony/polyfill-php74": "*", "symfony/polyfill-php80": "*", "symfony/polyfill-php81": "*", - "symfony/polyfill-php82": "*" + "symfony/polyfill-php82": "*", + "symfony/polyfill-php83": "*", + "symfony/polyfill-php84": "*", + "symfony/polyfill-php85": "*" } } diff --git a/composer.lock b/composer.lock index 94513db1b..a93f5b0a3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ffba3f3c8e8ab86a80b176d74ebf1a13", + "content-hash": "5e8d8ad10dad49193270adf13ecce55a", "packages": [ { "name": "algolia/algoliasearch-client-php", @@ -270,16 +270,16 @@ }, { "name": "cakephp/core", - "version": "5.3.5", + "version": "5.3.6", "source": { "type": "git", "url": "https://github.com/cakephp/core.git", - "reference": "eb012517900ed288f580aa3487e9a09f28ea85f9" + "reference": "9c458b0e9322ec88bc4c758b33cde6a0abf49d12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/core/zipball/eb012517900ed288f580aa3487e9a09f28ea85f9", - "reference": "eb012517900ed288f580aa3487e9a09f28ea85f9", + "url": "https://api.github.com/repos/cakephp/core/zipball/9c458b0e9322ec88bc4c758b33cde6a0abf49d12", + "reference": "9c458b0e9322ec88bc4c758b33cde6a0abf49d12", "shasum": "" }, "require": { @@ -333,20 +333,20 @@ "issues": "https://github.com/cakephp/cakephp/issues", "source": "https://github.com/cakephp/core" }, - "time": "2026-03-31T06:25:23+00:00" + "time": "2026-05-15T03:31:14+00:00" }, { "name": "cakephp/database", - "version": "5.3.5", + "version": "5.3.6", "source": { "type": "git", "url": "https://github.com/cakephp/database.git", - "reference": "cf94dcb57c54a1a308fd866b038cd6995910e36e" + "reference": "442d12bf0a1edeffc555a59de9f955cb0619c7ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/database/zipball/cf94dcb57c54a1a308fd866b038cd6995910e36e", - "reference": "cf94dcb57c54a1a308fd866b038cd6995910e36e", + "url": "https://api.github.com/repos/cakephp/database/zipball/442d12bf0a1edeffc555a59de9f955cb0619c7ca", + "reference": "442d12bf0a1edeffc555a59de9f955cb0619c7ca", "shasum": "" }, "require": { @@ -400,20 +400,20 @@ "issues": "https://github.com/cakephp/cakephp/issues", "source": "https://github.com/cakephp/database" }, - "time": "2026-03-31T06:25:23+00:00" + "time": "2026-05-21T19:38:13+00:00" }, { "name": "cakephp/datasource", - "version": "5.3.5", + "version": "5.3.6", "source": { "type": "git", "url": "https://github.com/cakephp/datasource.git", - "reference": "512464eb27b19316b515ec338089b83822c9ab5a" + "reference": "b768f0c0bf0fca815f83c4caef14e7fbb2409bf5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/datasource/zipball/512464eb27b19316b515ec338089b83822c9ab5a", - "reference": "512464eb27b19316b515ec338089b83822c9ab5a", + "url": "https://api.github.com/repos/cakephp/datasource/zipball/b768f0c0bf0fca815f83c4caef14e7fbb2409bf5", + "reference": "b768f0c0bf0fca815f83c4caef14e7fbb2409bf5", "shasum": "" }, "require": { @@ -467,20 +467,20 @@ "issues": "https://github.com/cakephp/cakephp/issues", "source": "https://github.com/cakephp/datasource" }, - "time": "2026-04-04T08:08:42+00:00" + "time": "2026-05-20T10:27:33+00:00" }, { "name": "cakephp/utility", - "version": "5.3.5", + "version": "5.3.6", "source": { "type": "git", "url": "https://github.com/cakephp/utility.git", - "reference": "4ac9826fe5faa1505ec5aa3c171d6b58b6ab4e99" + "reference": "4c703a010b9d955fed44731669e35d3043425cc7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cakephp/utility/zipball/4ac9826fe5faa1505ec5aa3c171d6b58b6ab4e99", - "reference": "4ac9826fe5faa1505ec5aa3c171d6b58b6ab4e99", + "url": "https://api.github.com/repos/cakephp/utility/zipball/4c703a010b9d955fed44731669e35d3043425cc7", + "reference": "4c703a010b9d955fed44731669e35d3043425cc7", "shasum": "" }, "require": { @@ -531,7 +531,7 @@ "issues": "https://github.com/cakephp/cakephp/issues", "source": "https://github.com/cakephp/utility" }, - "time": "2026-03-09T09:38:36+00:00" + "time": "2026-05-21T19:38:13+00:00" }, { "name": "captioning/captioning", @@ -1771,30 +1771,29 @@ }, { "name": "doctrine/instantiator", - "version": "2.0.0", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + "reference": "23da848e1a2308728fe5fdddabf4be17ff9720c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/23da848e1a2308728fe5fdddabf4be17ff9720c7", + "reference": "23da848e1a2308728fe5fdddabf4be17ff9720c7", "shasum": "" }, "require": { - "php": "^8.1" + "php": "^8.4" }, "require-dev": { - "doctrine/coding-standard": "^11", + "doctrine/coding-standard": "^14", "ext-pdo": "*", "ext-phar": "*", "phpbench/phpbench": "^1.2", - "phpstan/phpstan": "^1.9.4", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5.27", - "vimeo/psalm": "^5.4" + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5.58" }, "type": "library", "autoload": { @@ -1821,7 +1820,7 @@ ], "support": { "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + "source": "https://github.com/doctrine/instantiator/tree/2.1.0" }, "funding": [ { @@ -1837,7 +1836,7 @@ "type": "tidelift" } ], - "time": "2022-12-30T00:23:10+00:00" + "time": "2026-01-05T06:47:08+00:00" }, { "name": "doctrine/lexer", @@ -1918,16 +1917,16 @@ }, { "name": "doctrine/orm", - "version": "3.6.5", + "version": "3.6.7", "source": { "type": "git", "url": "https://github.com/doctrine/orm.git", - "reference": "7e88b416153dceeb563352ca2b12465f09eea173" + "reference": "bc217c0e19c3a9eadfa67697143b87c9ba01272c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/orm/zipball/7e88b416153dceeb563352ca2b12465f09eea173", - "reference": "7e88b416153dceeb563352ca2b12465f09eea173", + "url": "https://api.github.com/repos/doctrine/orm/zipball/bc217c0e19c3a9eadfa67697143b87c9ba01272c", + "reference": "bc217c0e19c3a9eadfa67697143b87c9ba01272c", "shasum": "" }, "require": { @@ -2000,9 +1999,9 @@ ], "support": { "issues": "https://github.com/doctrine/orm/issues", - "source": "https://github.com/doctrine/orm/tree/3.6.5" + "source": "https://github.com/doctrine/orm/tree/3.6.7" }, - "time": "2026-05-11T06:47:19+00:00" + "time": "2026-05-25T16:45:47+00:00" }, { "name": "doctrine/persistence", @@ -2569,30 +2568,31 @@ }, { "name": "google/recaptcha", - "version": "1.3.1", + "version": "1.5", "source": { "type": "git", "url": "https://github.com/google/recaptcha.git", - "reference": "56522c261d2e8c58ba416c90f81a4cd9f2ed89b9" + "reference": "c57f0b96babc8c9fb64cb555cd7b2c5aadfbe58d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/google/recaptcha/zipball/56522c261d2e8c58ba416c90f81a4cd9f2ed89b9", - "reference": "56522c261d2e8c58ba416c90f81a4cd9f2ed89b9", + "url": "https://api.github.com/repos/google/recaptcha/zipball/c57f0b96babc8c9fb64cb555cd7b2c5aadfbe58d", + "reference": "c57f0b96babc8c9fb64cb555cd7b2c5aadfbe58d", "shasum": "" }, "require": { - "php": ">=8" + "php": ">=8.4" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.14", - "php-coveralls/php-coveralls": "^2.5", - "phpunit/phpunit": "^10" + "friendsofphp/php-cs-fixer": "^3.95", + "php-coveralls/php-coveralls": "^2.9.1", + "phpstan/phpstan": "^2.1.51", + "phpunit/phpunit": "^13.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3.x-dev" + "dev-main": "1.4.x-dev" } }, "autoload": { @@ -2617,20 +2617,20 @@ "issues": "https://github.com/google/recaptcha/issues", "source": "https://github.com/google/recaptcha" }, - "time": "2025-06-26T22:21:57+00:00" + "time": "2026-04-27T09:26:38+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.10.0", + "version": "7.10.4", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4" + "reference": "aec528da477062d3af11f51e6b33402be233b21f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", - "reference": "b51ac707cfa420b7bfd4e4d5e510ba8008e822b4", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/aec528da477062d3af11f51e6b33402be233b21f", + "reference": "aec528da477062d3af11f51e6b33402be233b21f", "shasum": "" }, "require": { @@ -2648,8 +2648,9 @@ "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", "guzzle/client-integration-tests": "3.0.2", + "guzzlehttp/test-server": "^0.3.2", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "phpunit/phpunit": "^8.5.52 || ^9.6.34", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -2727,7 +2728,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.10.0" + "source": "https://github.com/guzzle/guzzle/tree/7.10.4" }, "funding": [ { @@ -2743,20 +2744,20 @@ "type": "tidelift" } ], - "time": "2025-08-23T22:36:01+00:00" + "time": "2026-05-22T19:00:53+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.3.0", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "481557b130ef3790cf82b713667b43030dc9c957" + "reference": "09e8a212562fb1fb6a512c4156ed71525969d6c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/481557b130ef3790cf82b713667b43030dc9c957", - "reference": "481557b130ef3790cf82b713667b43030dc9c957", + "url": "https://api.github.com/repos/guzzle/promises/zipball/09e8a212562fb1fb6a512c4156ed71525969d6c2", + "reference": "09e8a212562fb1fb6a512c4156ed71525969d6c2", "shasum": "" }, "require": { @@ -2764,7 +2765,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.44 || ^9.6.25" + "phpunit/phpunit": "^8.5.52 || ^9.6.34" }, "type": "library", "extra": { @@ -2810,7 +2811,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.3.0" + "source": "https://github.com/guzzle/promises/tree/2.4.1" }, "funding": [ { @@ -2826,20 +2827,20 @@ "type": "tidelift" } ], - "time": "2025-08-22T14:34:08+00:00" + "time": "2026-05-20T22:57:30+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.9.0", + "version": "2.10.2", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" + "reference": "a1bbdc172f32a25fe999965b65b6e71fd87da9ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", - "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a1bbdc172f32a25fe999965b65b6e71fd87da9ed", + "reference": "a1bbdc172f32a25fe999965b65b6e71fd87da9ed", "shasum": "" }, "require": { @@ -2854,9 +2855,9 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "0.9.0", + "http-interop/http-factory-tests": "1.1.0", "jshttp/mime-db": "1.54.0.1", - "phpunit/phpunit": "^8.5.44 || ^9.6.25" + "phpunit/phpunit": "^8.5.52 || ^9.6.34" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -2927,7 +2928,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.9.0" + "source": "https://github.com/guzzle/psr7/tree/2.10.2" }, "funding": [ { @@ -2943,7 +2944,7 @@ "type": "tidelift" } ], - "time": "2026-03-10T16:41:02+00:00" + "time": "2026-05-25T22:58:15+00:00" }, { "name": "jms/metadata", @@ -3833,31 +3834,31 @@ }, { "name": "maennchen/zipstream-php", - "version": "3.1.2", + "version": "3.2.2", "source": { "type": "git", "url": "https://github.com/maennchen/ZipStream-PHP.git", - "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f" + "reference": "77bebeb4c6c340bb3c11c843b2cffd8bbfde4d5e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/aeadcf5c412332eb426c0f9b4485f6accba2a99f", - "reference": "aeadcf5c412332eb426c0f9b4485f6accba2a99f", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/77bebeb4c6c340bb3c11c843b2cffd8bbfde4d5e", + "reference": "77bebeb4c6c340bb3c11c843b2cffd8bbfde4d5e", "shasum": "" }, "require": { "ext-mbstring": "*", "ext-zlib": "*", - "php-64bit": "^8.2" + "php-64bit": "^8.3" }, "require-dev": { "brianium/paratest": "^7.7", "ext-zip": "*", - "friendsofphp/php-cs-fixer": "^3.16", + "friendsofphp/php-cs-fixer": "^3.86", "guzzlehttp/guzzle": "^7.5", "mikey179/vfsstream": "^1.6", "php-coveralls/php-coveralls": "^2.5", - "phpunit/phpunit": "^11.0", + "phpunit/phpunit": "^12.0", "vimeo/psalm": "^6.0" }, "suggest": { @@ -3899,7 +3900,7 @@ ], "support": { "issues": "https://github.com/maennchen/ZipStream-PHP/issues", - "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.1.2" + "source": "https://github.com/maennchen/ZipStream-PHP/tree/3.2.2" }, "funding": [ { @@ -3907,7 +3908,7 @@ "type": "github" } ], - "time": "2025-01-27T12:07:53+00:00" + "time": "2026-04-11T18:38:28+00:00" }, { "name": "markbaker/complex", @@ -6476,33 +6477,32 @@ }, { "name": "symfony/error-handler", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa" + "reference": "c1119fe8dcfc3825ec74ec061b96ef0c8f281517" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa", - "reference": "8dd79d8af777ee6cba2fd4d98da6ffb839f3c0fa", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/c1119fe8dcfc3825ec74ec061b96ef0c8f281517", + "reference": "c1119fe8dcfc3825ec74ec061b96ef0c8f281517", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "psr/log": "^1|^2|^3", "symfony/polyfill-php85": "^1.32", - "symfony/var-dumper": "^6.4|^7.0|^8.0" + "symfony/var-dumper": "^7.4|^8.0" }, "conflict": { - "symfony/deprecation-contracts": "<2.5", - "symfony/http-kernel": "<6.4" + "symfony/deprecation-contracts": "<2.5" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0", + "symfony/console": "^7.4|^8.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ @@ -6534,7 +6534,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.4.8" + "source": "https://github.com/symfony/error-handler/tree/v8.0.8" }, "funding": [ { @@ -6554,7 +6554,7 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/event-dispatcher", @@ -6791,25 +6791,25 @@ }, { "name": "symfony/filesystem", - "version": "v7.4.11", + "version": "v8.0.11", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "d721ea61b4a5fba8c5b6e7c1feda19efea144b50" + "reference": "224db910898ce1317b892a9a1338f1f8f17eb7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/d721ea61b4a5fba8c5b6e7c1feda19efea144b50", - "reference": "d721ea61b4a5fba8c5b6e7c1feda19efea144b50", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/224db910898ce1317b892a9a1338f1f8f17eb7c7", + "reference": "224db910898ce1317b892a9a1338f1f8f17eb7c7", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^6.4|^7.0|^8.0" + "symfony/process": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -6837,7 +6837,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.4.11" + "source": "https://github.com/symfony/filesystem/tree/v8.0.11" }, "funding": [ { @@ -6857,27 +6857,27 @@ "type": "tidelift" } ], - "time": "2026-05-11T16:38:44+00:00" + "time": "2026-05-11T16:39:47+00:00" }, { "name": "symfony/finder", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "e0be088d22278583a82da281886e8c3592fbf149" + "reference": "8da41214757b87d97f181e3d14a4179286151007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/e0be088d22278583a82da281886e8c3592fbf149", - "reference": "e0be088d22278583a82da281886e8c3592fbf149", + "url": "https://api.github.com/repos/symfony/finder/zipball/8da41214757b87d97f181e3d14a4179286151007", + "reference": "8da41214757b87d97f181e3d14a4179286151007", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.4" }, "require-dev": { - "symfony/filesystem": "^6.4|^7.0|^8.0" + "symfony/filesystem": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -6905,7 +6905,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.8" + "source": "https://github.com/symfony/finder/tree/v8.0.8" }, "funding": [ { @@ -6925,7 +6925,7 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/form", @@ -8083,20 +8083,20 @@ }, { "name": "symfony/options-resolver", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "2888fcdc4dc2fd5f7c7397be78631e8af12e02b4" + "reference": "b48bce0a70b914f6953dafbd10474df232ed4de8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/2888fcdc4dc2fd5f7c7397be78631e8af12e02b4", - "reference": "2888fcdc4dc2fd5f7c7397be78631e8af12e02b4", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/b48bce0a70b914f6953dafbd10474df232ed4de8", + "reference": "b48bce0a70b914f6953dafbd10474df232ed4de8", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "symfony/deprecation-contracts": "^2.5|^3" }, "type": "library", @@ -8130,7 +8130,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.4.8" + "source": "https://github.com/symfony/options-resolver/tree/v8.0.8" }, "funding": [ { @@ -8150,31 +8150,28 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/password-hasher", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "18a7d92126c95962f7efbcc9e421ba710a366847" + "reference": "57ee968d3c38301ed3e5b838f850a10f2d06a7f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/18a7d92126c95962f7efbcc9e421ba710a366847", - "reference": "18a7d92126c95962f7efbcc9e421ba710a366847", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/57ee968d3c38301ed3e5b838f850a10f2d06a7f6", + "reference": "57ee968d3c38301ed3e5b838f850a10f2d06a7f6", "shasum": "" }, "require": { - "php": ">=8.2" - }, - "conflict": { - "symfony/security-core": "<6.4" + "php": ">=8.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/security-core": "^6.4|^7.0|^8.0" + "symfony/console": "^7.4|^8.0", + "symfony/security-core": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -8206,7 +8203,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v7.4.8" + "source": "https://github.com/symfony/password-hasher/tree/v8.0.8" }, "funding": [ { @@ -8226,7 +8223,7 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/polyfill-ctype", @@ -8313,16 +8310,16 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.37.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e" + "reference": "e9247d281d694a5120554d9afaf54e070e88a603" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/4864388bfbd3001ce88e234fab652acd91fdc57e", - "reference": "4864388bfbd3001ce88e234fab652acd91fdc57e", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603", + "reference": "e9247d281d694a5120554d9afaf54e070e88a603", "shasum": "" }, "require": { @@ -8371,7 +8368,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.37.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.38.1" }, "funding": [ { @@ -8391,20 +8388,20 @@ "type": "tidelift" } ], - "time": "2026-04-26T13:13:48+00:00" + "time": "2026-05-26T05:58:03+00:00" }, { "name": "symfony/polyfill-intl-icu", - "version": "v1.37.0", + "version": "v1.38.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "3510b63d07376b04e57e27e82607d468bb134f78" + "reference": "445c90e341fccda10311019cf82ff73bb7343945" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/3510b63d07376b04e57e27e82607d468bb134f78", - "reference": "3510b63d07376b04e57e27e82607d468bb134f78", + "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/445c90e341fccda10311019cf82ff73bb7343945", + "reference": "445c90e341fccda10311019cf82ff73bb7343945", "shasum": "" }, "require": { @@ -8459,7 +8456,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.37.0" + "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.38.0" }, "funding": [ { @@ -8479,20 +8476,20 @@ "type": "tidelift" } ], - "time": "2026-04-10T16:50:15+00:00" + "time": "2026-05-25T11:52:53+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.37.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + "reference": "dc21118016c039a66235cf93d96b435ffb282412" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/dc21118016c039a66235cf93d96b435ffb282412", + "reference": "dc21118016c039a66235cf93d96b435ffb282412", "shasum": "" }, "require": { @@ -8546,7 +8543,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.37.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.38.1" }, "funding": [ { @@ -8566,20 +8563,20 @@ "type": "tidelift" } ], - "time": "2024-09-10T14:38:51+00:00" + "time": "2026-05-25T15:22:23+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.37.0", + "version": "v1.38.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", "shasum": "" }, "require": { @@ -8631,7 +8628,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.37.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.38.0" }, "funding": [ { @@ -8651,20 +8648,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-05-25T13:48:31+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.37.0", + "version": "v1.38.1", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315" + "reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315", - "reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/14c5439eec4ccff081ac14eca2dc57feb2a66d92", + "reference": "14c5439eec4ccff081ac14eca2dc57feb2a66d92", "shasum": "" }, "require": { @@ -8716,247 +8713,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.37.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-04-10T17:25:58+00:00" - }, - { - "name": "symfony/polyfill-php83", - "version": "v1.37.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/3600c2cb22399e25bb226e4a135ce91eeb2a6149", - "reference": "3600c2cb22399e25bb226e4a135ce91eeb2a6149", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.37.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-04-10T17:25:58+00:00" - }, - { - "name": "symfony/polyfill-php84", - "version": "v1.37.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/88486db2c389b290bf87ff1de7ebc1e13e42bb06", - "reference": "88486db2c389b290bf87ff1de7ebc1e13e42bb06", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php84\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.37.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-04-10T18:47:49+00:00" - }, - { - "name": "symfony/polyfill-php85", - "version": "v1.37.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php85.git", - "reference": "fcfa4973a9917cef23f2e38774da74a2b7d115ee" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/fcfa4973a9917cef23f2e38774da74a2b7d115ee", - "reference": "fcfa4973a9917cef23f2e38774da74a2b7d115ee", - "shasum": "" - }, - "require": { - "php": ">=7.2" - }, - "type": "library", - "extra": { - "thanks": { - "url": "https://github.com/symfony/polyfill", - "name": "symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php85\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php85/tree/v1.37.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.1" }, "funding": [ { @@ -8976,7 +8733,7 @@ "type": "tidelift" } ], - "time": "2026-04-26T13:10:57+00:00" + "time": "2026-05-26T12:51:13+00:00" }, { "name": "symfony/property-access", @@ -9061,37 +8818,33 @@ }, { "name": "symfony/property-info", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "ac5e82528b986c4f7cfccbf7764b5d2e824d6175" + "reference": "c21711980653360d6ef5c26d0f9ca6f58a1135c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/ac5e82528b986c4f7cfccbf7764b5d2e824d6175", - "reference": "ac5e82528b986c4f7cfccbf7764b5d2e824d6175", + "url": "https://api.github.com/repos/symfony/property-info/zipball/c21711980653360d6ef5c26d0f9ca6f58a1135c6", + "reference": "c21711980653360d6ef5c26d0f9ca6f58a1135c6", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0|^8.0", + "php": ">=8.4", + "symfony/string": "^7.4|^8.0", "symfony/type-info": "^7.4.7|^8.0.7" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2|>=7", - "phpdocumentor/type-resolver": "<1.5.1", - "symfony/cache": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/serializer": "<6.4" + "phpdocumentor/type-resolver": "<1.5.1" }, "require-dev": { "phpdocumentor/reflection-docblock": "^5.2|^6.0", "phpstan/phpdoc-parser": "^1.0|^2.0", - "symfony/cache": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/serializer": "^6.4|^7.0|^8.0" + "symfony/cache": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -9127,7 +8880,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v7.4.8" + "source": "https://github.com/symfony/property-info/tree/v8.0.8" }, "funding": [ { @@ -9147,38 +8900,33 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/routing", - "version": "v7.4.12", + "version": "v8.0.12", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "3b04a5ec4887a8135a12ebf0f4cbc5b8fc8ee204" + "reference": "c7f22a665faa3e5212b8f042e0c5831a6b85492f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/3b04a5ec4887a8135a12ebf0f4cbc5b8fc8ee204", - "reference": "3b04a5ec4887a8135a12ebf0f4cbc5b8fc8ee204", + "url": "https://api.github.com/repos/symfony/routing/zipball/c7f22a665faa3e5212b8f042e0c5831a6b85492f", + "reference": "c7f22a665faa3e5212b8f042e0c5831a6b85492f", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.4", "symfony/deprecation-contracts": "^2.5|^3" }, - "conflict": { - "symfony/config": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/yaml": "<6.4" - }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0", - "symfony/yaml": "^6.4|^7.0|^8.0" + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -9212,7 +8960,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.12" + "source": "https://github.com/symfony/routing/tree/v8.0.12" }, "funding": [ { @@ -9232,7 +8980,7 @@ "type": "tidelift" } ], - "time": "2026-05-20T07:20:23+00:00" + "time": "2026-05-20T07:22:03+00:00" }, { "name": "symfony/runtime", @@ -9432,46 +9180,37 @@ }, { "name": "symfony/security-core", - "version": "v7.4.12", + "version": "v8.0.12", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "efff84605474ec682c7d9c6278088811e6f3caaa" + "reference": "29e2ef1855dff38f01a131645298e0c88001ca07" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/efff84605474ec682c7d9c6278088811e6f3caaa", - "reference": "efff84605474ec682c7d9c6278088811e6f3caaa", + "url": "https://api.github.com/repos/symfony/security-core/zipball/29e2ef1855dff38f01a131645298e0c88001ca07", + "reference": "29e2ef1855dff38f01a131645298e0c88001ca07", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.4", "symfony/event-dispatcher-contracts": "^2.5|^3", - "symfony/password-hasher": "^6.4|^7.0|^8.0", + "symfony/password-hasher": "^7.4|^8.0", "symfony/service-contracts": "^2.5|^3" }, - "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/event-dispatcher": "<6.4", - "symfony/http-foundation": "<6.4", - "symfony/ldap": "<6.4", - "symfony/translation": "<6.4.3|>=7.0,<7.0.3", - "symfony/validator": "<6.4" - }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", "psr/container": "^1.1|^2.0", "psr/log": "^1|^2|^3", - "symfony/cache": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/event-dispatcher": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0", - "symfony/ldap": "^6.4|^7.0|^8.0", - "symfony/string": "^6.4|^7.0|^8.0", - "symfony/translation": "^6.4.3|^7.0.3|^8.0", - "symfony/validator": "^6.4|^7.0|^8.0" + "symfony/cache": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/ldap": "^7.4|^8.0", + "symfony/string": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -9499,7 +9238,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v7.4.12" + "source": "https://github.com/symfony/security-core/tree/v8.0.12" }, "funding": [ { @@ -9519,33 +9258,30 @@ "type": "tidelift" } ], - "time": "2026-05-15T06:48:59+00:00" + "time": "2026-05-19T19:56:11+00:00" }, { "name": "symfony/security-csrf", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "16b3aa2f67d02fb0dbd013a8759bbe90daaa9c5d" + "reference": "83c8f60ef8d385c05ea863093c9efabe74800883" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/16b3aa2f67d02fb0dbd013a8759bbe90daaa9c5d", - "reference": "16b3aa2f67d02fb0dbd013a8759bbe90daaa9c5d", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/83c8f60ef8d385c05ea863093c9efabe74800883", + "reference": "83c8f60ef8d385c05ea863093c9efabe74800883", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/security-core": "^6.4|^7.0|^8.0" - }, - "conflict": { - "symfony/http-foundation": "<6.4" + "php": ">=8.4", + "symfony/security-core": "^7.4|^8.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/http-foundation": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0" + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -9573,7 +9309,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v7.4.8" + "source": "https://github.com/symfony/security-csrf/tree/v8.0.8" }, "funding": [ { @@ -9593,50 +9329,45 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/security-http", - "version": "v7.4.12", + "version": "v8.0.12", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "1fc7ca636cbd2cad29b42cc13c9fd0c681c6efee" + "reference": "d776945b2dc41c0e609c56c1ef69863ab56856ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/1fc7ca636cbd2cad29b42cc13c9fd0c681c6efee", - "reference": "1fc7ca636cbd2cad29b42cc13c9fd0c681c6efee", + "url": "https://api.github.com/repos/symfony/security-http/zipball/d776945b2dc41c0e609c56c1ef69863ab56856ed", + "reference": "d776945b2dc41c0e609c56c1ef69863ab56856ed", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/property-access": "^6.4|^7.0|^8.0", - "symfony/security-core": "^7.3|^8.0", + "php": ">=8.4", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/security-core": "^7.4|^8.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/clock": "<6.4", - "symfony/http-client-contracts": "<3.0", - "symfony/security-bundle": "<6.4", - "symfony/security-csrf": "<6.4" + "symfony/http-client-contracts": "<3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/cache": "^6.4|^7.0|^8.0", - "symfony/clock": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/cache": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", "symfony/http-client-contracts": "^3.0", - "symfony/rate-limiter": "^6.4|^7.0|^8.0", - "symfony/routing": "^6.4|^7.0|^8.0", - "symfony/security-csrf": "^6.4|^7.0|^8.0", - "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^7.4|^8.0", + "symfony/routing": "^7.4|^8.0", + "symfony/security-csrf": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", "web-token/jwt-library": "^3.3.2|^4.0" }, "type": "library", @@ -9665,7 +9396,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v7.4.12" + "source": "https://github.com/symfony/security-http/tree/v8.0.12" }, "funding": [ { @@ -9685,7 +9416,7 @@ "type": "tidelift" } ], - "time": "2026-05-20T07:20:23+00:00" + "time": "2026-05-20T07:22:03+00:00" }, { "name": "symfony/service-contracts", @@ -10115,67 +9846,60 @@ }, { "name": "symfony/twig-bridge", - "version": "v7.4.12", + "version": "v8.0.12", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "81663873d946531129c76c65e80b681ce99c0e89" + "reference": "f1397eb19ab4f738bd22570d65d40792c1ba3f79" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/81663873d946531129c76c65e80b681ce99c0e89", - "reference": "81663873d946531129c76c65e80b681ce99c0e89", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/f1397eb19ab4f738bd22570d65d40792c1ba3f79", + "reference": "f1397eb19ab4f738bd22570d65d40792c1ba3f79", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.4", "symfony/translation-contracts": "^2.5|^3", "twig/twig": "^3.21" }, "conflict": { "phpdocumentor/reflection-docblock": "<5.2|>=7", "phpdocumentor/type-resolver": "<1.5.1", - "symfony/console": "<6.4", - "symfony/form": "<6.4.32|>7,<7.3.10|>7.4,<7.4.4|>8.0,<8.0.4", - "symfony/http-foundation": "<6.4", - "symfony/http-kernel": "<6.4", - "symfony/mime": "<6.4.37|>7,<7.4.9|>8.0,<8.0.9", - "symfony/serializer": "<6.4", - "symfony/translation": "<6.4", - "symfony/workflow": "<6.4" + "symfony/form": "<7.4.4|>8.0,<8.0.4", + "symfony/mime": "<7.4.9|>8.0,<8.0.9" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^5.2|^6.0", - "symfony/asset": "^6.4|^7.0|^8.0", - "symfony/asset-mapper": "^6.4|^7.0|^8.0", - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/emoji": "^7.1|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/finder": "^6.4|^7.0|^8.0", - "symfony/form": "^6.4.32|~7.3.10|^7.4.4|^8.0.4", - "symfony/html-sanitizer": "^6.4|^7.0|^8.0", - "symfony/http-foundation": "^7.3|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/intl": "^6.4|^7.0|^8.0", - "symfony/mime": "^6.4.37|^7.4.9|^8.0.9", - "symfony/polyfill-intl-icu": "~1.0", - "symfony/property-info": "^6.4|^7.0|^8.0", - "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/asset": "^7.4|^8.0", + "symfony/asset-mapper": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/emoji": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/form": "^7.4.4|^8.0.4", + "symfony/html-sanitizer": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/mime": "^7.4.9|^8.0.9", + "symfony/polyfill-intl-icu": "^1.0", + "symfony/property-info": "^7.4|^8.0", + "symfony/routing": "^7.4|^8.0", "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^6.4|^7.0|^8.0", - "symfony/security-csrf": "^6.4|^7.0|^8.0", - "symfony/security-http": "^6.4|^7.0|^8.0", - "symfony/serializer": "^6.4.3|^7.0.3|^8.0", - "symfony/stopwatch": "^6.4|^7.0|^8.0", - "symfony/translation": "^6.4|^7.0|^8.0", - "symfony/validator": "^6.4|^7.0|^8.0", - "symfony/web-link": "^6.4|^7.0|^8.0", - "symfony/workflow": "^6.4|^7.0|^8.0", - "symfony/yaml": "^6.4|^7.0|^8.0", + "symfony/security-core": "^7.4|^8.0", + "symfony/security-csrf": "^7.4|^8.0", + "symfony/security-http": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/web-link": "^7.4|^8.0", + "symfony/workflow": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0", "twig/cssinliner-extra": "^3", "twig/inky-extra": "^3", "twig/markdown-extra": "^3" @@ -10206,7 +9930,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v7.4.12" + "source": "https://github.com/symfony/twig-bridge/tree/v8.0.12" }, "funding": [ { @@ -10226,49 +9950,43 @@ "type": "tidelift" } ], - "time": "2026-04-29T17:13:54+00:00" + "time": "2026-04-29T18:17:56+00:00" }, { "name": "symfony/twig-bundle", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "ba1e06d7ff1ebb1d1799b6608d925f4eaba88d95" + "reference": "f83767b78e2580ca9fe9a2cf6fcff19cd5389bc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/ba1e06d7ff1ebb1d1799b6608d925f4eaba88d95", - "reference": "ba1e06d7ff1ebb1d1799b6608d925f4eaba88d95", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/f83767b78e2580ca9fe9a2cf6fcff19cd5389bc1", + "reference": "f83767b78e2580ca9fe9a2cf6fcff19cd5389bc1", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", - "php": ">=8.2", + "php": ">=8.4", "symfony/config": "^7.4|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-foundation": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4.13|^7.1.6|^8.0", - "symfony/twig-bridge": "^7.3|^8.0", - "twig/twig": "^3.12" - }, - "conflict": { - "symfony/framework-bundle": "<6.4", - "symfony/translation": "<6.4" + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/twig-bridge": "^7.4|^8.0" }, "require-dev": { - "symfony/asset": "^6.4|^7.0|^8.0", - "symfony/expression-language": "^6.4|^7.0|^8.0", - "symfony/finder": "^6.4|^7.0|^8.0", - "symfony/form": "^6.4|^7.0|^8.0", - "symfony/framework-bundle": "^6.4.13|^7.1.6|^8.0", - "symfony/routing": "^6.4|^7.0|^8.0", - "symfony/runtime": "^6.4.13|^7.1.6", - "symfony/stopwatch": "^6.4|^7.0|^8.0", - "symfony/translation": "^6.4|^7.0|^8.0", - "symfony/web-link": "^6.4|^7.0|^8.0", - "symfony/yaml": "^6.4|^7.0|^8.0" + "symfony/asset": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/form": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/routing": "^7.4|^8.0", + "symfony/runtime": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/web-link": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0" }, "type": "symfony-bundle", "autoload": { @@ -10296,7 +10014,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v7.4.8" + "source": "https://github.com/symfony/twig-bundle/tree/v8.0.8" }, "funding": [ { @@ -10316,7 +10034,7 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/twig-pack", @@ -10365,22 +10083,21 @@ }, { "name": "symfony/type-info", - "version": "v7.4.9", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/type-info.git", - "reference": "cafeedbf157b890e94ac5b83eaed85595106d5d6" + "reference": "08723aceb8c3271e8cb3db8b2565728b0c88e866" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/type-info/zipball/cafeedbf157b890e94ac5b83eaed85595106d5d6", - "reference": "cafeedbf157b890e94ac5b83eaed85595106d5d6", + "url": "https://api.github.com/repos/symfony/type-info/zipball/08723aceb8c3271e8cb3db8b2565728b0c88e866", + "reference": "08723aceb8c3271e8cb3db8b2565728b0c88e866", "shasum": "" }, "require": { - "php": ">=8.2", - "psr/container": "^1.1|^2.0", - "symfony/deprecation-contracts": "^2.5|^3" + "php": ">=8.4", + "psr/container": "^1.1|^2.0" }, "conflict": { "phpstan/phpdoc-parser": "<1.30" @@ -10424,7 +10141,7 @@ "type" ], "support": { - "source": "https://github.com/symfony/type-info/tree/v7.4.9" + "source": "https://github.com/symfony/type-info/tree/v8.0.9" }, "funding": [ { @@ -10444,7 +10161,7 @@ "type": "tidelift" } ], - "time": "2026-04-22T15:21:55+00:00" + "time": "2026-04-29T15:02:55+00:00" }, { "name": "symfony/validator", @@ -10552,31 +10269,31 @@ }, { "name": "symfony/var-dumper", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd" + "reference": "cfb7badd53bf4177f6e9416cfbbccc13c0e773a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/9510c3966f749a1d1ff0059e1eabef6cc621e7fd", - "reference": "9510c3966f749a1d1ff0059e1eabef6cc621e7fd", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cfb7badd53bf4177f6e9416cfbbccc13c0e773a1", + "reference": "cfb7badd53bf4177f6e9416cfbbccc13c0e773a1", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=8.4", + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { - "symfony/console": "<6.4" + "symfony/console": "<7.4", + "symfony/error-handler": "<7.4" }, "require-dev": { - "symfony/console": "^6.4|^7.0|^8.0", - "symfony/http-kernel": "^6.4|^7.0|^8.0", - "symfony/process": "^6.4|^7.0|^8.0", - "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", "twig/twig": "^3.12" }, "bin": [ @@ -10615,7 +10332,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.4.8" + "source": "https://github.com/symfony/var-dumper/tree/v8.0.8" }, "funding": [ { @@ -10635,7 +10352,7 @@ "type": "tidelift" } ], - "time": "2026-03-30T13:44:50+00:00" + "time": "2026-03-31T07:15:36+00:00" }, { "name": "symfony/var-exporter", @@ -11146,16 +10863,16 @@ }, { "name": "webmozart/assert", - "version": "2.3.0", + "version": "2.4.0", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4" + "reference": "9007ea6f45ecf352a9422b36644e4bfc039b9155" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/eb0d790f735ba6cff25c683a85a1da0eadeff9e4", - "reference": "eb0d790f735ba6cff25c683a85a1da0eadeff9e4", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/9007ea6f45ecf352a9422b36644e4bfc039b9155", + "reference": "9007ea6f45ecf352a9422b36644e4bfc039b9155", "shasum": "" }, "require": { @@ -11171,7 +10888,11 @@ }, "type": "library", "extra": { + "psalm": { + "pluginClass": "Webmozart\\Assert\\PsalmPlugin" + }, "branch-alias": { + "dev-master": "2.0-dev", "dev-feature/2-0": "2.0-dev" } }, @@ -11202,9 +10923,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.3.0" + "source": "https://github.com/webmozarts/assert/tree/2.4.0" }, - "time": "2026-04-11T10:33:05+00:00" + "time": "2026-05-20T13:07:01+00:00" }, { "name": "willdurand/geocoder", @@ -12321,73 +12042,6 @@ ], "time": "2026-05-12T16:22:19+00:00" }, - { - "name": "masterminds/html5", - "version": "2.10.0", - "source": { - "type": "git", - "url": "https://github.com/Masterminds/html5-php.git", - "reference": "fcf91eb64359852f00d921887b219479b4f21251" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/fcf91eb64359852f00d921887b219479b4f21251", - "reference": "fcf91eb64359852f00d921887b219479b4f21251", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8 || ^9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Masterminds\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Matt Butcher", - "email": "technosophos@gmail.com" - }, - { - "name": "Matt Farina", - "email": "matt@mattfarina.com" - }, - { - "name": "Asmir Mustafic", - "email": "goetas@gmail.com" - } - ], - "description": "An HTML5 parser and serializer.", - "homepage": "http://masterminds.github.io/html5-php", - "keywords": [ - "HTML5", - "dom", - "html", - "parser", - "querypath", - "serializer", - "xml" - ], - "support": { - "issues": "https://github.com/Masterminds/html5-php/issues", - "source": "https://github.com/Masterminds/html5-php/tree/2.10.0" - }, - "time": "2025-07-25T09:04:22+00:00" - }, { "name": "myclabs/deep-copy", "version": "1.13.4", @@ -12831,11 +12485,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.55", + "version": "2.1.56", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9eaac3826ed5e9b8427350a43cac825eeca3f566", - "reference": "9eaac3826ed5e9b8427350a43cac825eeca3f566", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/93a603c9fc3be8c3c93bbc8d22170ad766685537", + "reference": "93a603c9fc3be8c3c93bbc8d22170ad766685537", "shasum": "" }, "require": { @@ -12880,7 +12534,7 @@ "type": "github" } ], - "time": "2026-05-18T11:57:34+00:00" + "time": "2026-05-26T17:04:57+00:00" }, { "name": "phpstan/phpstan-beberlei-assert", @@ -14118,21 +13772,21 @@ }, { "name": "rector/rector", - "version": "2.4.3", + "version": "2.4.5", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "891824c6c59f02a56a5dd58ea8edc44e6c0ece29" + "reference": "cbd86024be5014d3c14d9f0b3f7aae8ecbffd62c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/891824c6c59f02a56a5dd58ea8edc44e6c0ece29", - "reference": "891824c6c59f02a56a5dd58ea8edc44e6c0ece29", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/cbd86024be5014d3c14d9f0b3f7aae8ecbffd62c", + "reference": "cbd86024be5014d3c14d9f0b3f7aae8ecbffd62c", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.1.48" + "phpstan/phpstan": "^2.1.56" }, "conflict": { "rector/rector-doctrine": "*", @@ -14166,7 +13820,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.4.3" + "source": "https://github.com/rectorphp/rector/tree/2.4.5" }, "funding": [ { @@ -14174,7 +13828,7 @@ "type": "github" } ], - "time": "2026-05-12T11:17:24+00:00" + "time": "2026-05-26T21:03:22+00:00" }, { "name": "robertfausk/behat-panther-extension", @@ -14453,6 +14107,7 @@ "type": "github" } ], + "abandoned": true, "time": "2025-03-19T07:56:08+00:00" }, { @@ -14509,6 +14164,7 @@ "type": "github" } ], + "abandoned": true, "time": "2024-07-03T04:45:54+00:00" }, { @@ -15329,19 +14985,20 @@ }, { "name": "smalot/pdfparser", - "version": "v1.1.0", + "version": "v2.12.5", "source": { "type": "git", "url": "https://github.com/smalot/pdfparser.git", - "reference": "43e436f32fd0e3d1f808c3b1768975c598c9a7df" + "reference": "2cfa0d92bd557875c9f52a75fde0e8392302a354" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/smalot/pdfparser/zipball/43e436f32fd0e3d1f808c3b1768975c598c9a7df", - "reference": "43e436f32fd0e3d1f808c3b1768975c598c9a7df", + "url": "https://api.github.com/repos/smalot/pdfparser/zipball/2cfa0d92bd557875c9f52a75fde0e8392302a354", + "reference": "2cfa0d92bd557875c9f52a75fde0e8392302a354", "shasum": "" }, "require": { + "ext-iconv": "*", "ext-zlib": "*", "php": ">=7.1", "symfony/polyfill-mbstring": "^1.18" @@ -15373,9 +15030,9 @@ ], "support": { "issues": "https://github.com/smalot/pdfparser/issues", - "source": "https://github.com/smalot/pdfparser/tree/v1.1.0" + "source": "https://github.com/smalot/pdfparser/tree/v2.12.5" }, - "time": "2021-08-03T08:33:34+00:00" + "time": "2026-04-17T11:37:58+00:00" }, { "name": "staabm/side-effects-detector", @@ -15431,28 +15088,27 @@ }, { "name": "symfony/browser-kit", - "version": "v7.4.8", + "version": "v8.0.8", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "41850d8f8ddef9a9cd7314fa9f4902cf48885521" + "reference": "f5a28fca785416cf489dd579011e74c831100cc3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/41850d8f8ddef9a9cd7314fa9f4902cf48885521", - "reference": "41850d8f8ddef9a9cd7314fa9f4902cf48885521", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/f5a28fca785416cf489dd579011e74c831100cc3", + "reference": "f5a28fca785416cf489dd579011e74c831100cc3", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/dom-crawler": "^6.4|^7.0|^8.0" + "php": ">=8.4", + "symfony/dom-crawler": "^7.4|^8.0" }, "require-dev": { - "symfony/css-selector": "^6.4|^7.0|^8.0", - "symfony/http-client": "^6.4|^7.0|^8.0", - "symfony/mime": "^6.4|^7.0|^8.0", - "symfony/process": "^6.4|^7.0|^8.0" + "symfony/css-selector": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -15480,7 +15136,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v7.4.8" + "source": "https://github.com/symfony/browser-kit/tree/v8.0.8" }, "funding": [ { @@ -15500,24 +15156,24 @@ "type": "tidelift" } ], - "time": "2026-03-24T13:12:05+00:00" + "time": "2026-03-30T15:14:47+00:00" }, { "name": "symfony/css-selector", - "version": "v7.4.9", + "version": "v8.0.9", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "b75663ed96cf4756e28e3105476f220f92886cc4" + "reference": "3665cfade90565430909b906394c73c8739e57d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/b75663ed96cf4756e28e3105476f220f92886cc4", - "reference": "b75663ed96cf4756e28e3105476f220f92886cc4", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/3665cfade90565430909b906394c73c8739e57d0", + "reference": "3665cfade90565430909b906394c73c8739e57d0", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.4" }, "type": "library", "autoload": { @@ -15549,7 +15205,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.4.9" + "source": "https://github.com/symfony/css-selector/tree/v8.0.9" }, "funding": [ { @@ -15569,7 +15225,7 @@ "type": "tidelift" } ], - "time": "2026-04-18T13:18:21+00:00" + "time": "2026-04-18T13:51:42+00:00" }, { "name": "symfony/debug-bundle", @@ -15648,27 +15304,25 @@ }, { "name": "symfony/dom-crawler", - "version": "v7.4.12", + "version": "v8.0.12", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "b59b59122690976550fd142c23fab62c84738db6" + "reference": "011b0ce60417f6d40052434d8ae6295b876ecbdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/b59b59122690976550fd142c23fab62c84738db6", - "reference": "b59b59122690976550fd142c23fab62c84738db6", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/011b0ce60417f6d40052434d8ae6295b876ecbdd", + "reference": "011b0ce60417f6d40052434d8ae6295b876ecbdd", "shasum": "" }, "require": { - "masterminds/html5": "^2.6", - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.0" + "php": ">=8.4", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.0" }, "require-dev": { - "symfony/css-selector": "^6.4|^7.0|^8.0" + "symfony/css-selector": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -15696,7 +15350,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v7.4.12" + "source": "https://github.com/symfony/dom-crawler/tree/v8.0.12" }, "funding": [ { @@ -15716,7 +15370,7 @@ "type": "tidelift" } ], - "time": "2026-05-20T07:20:23+00:00" + "time": "2026-05-20T07:22:03+00:00" }, { "name": "symfony/json-path", @@ -15880,20 +15534,20 @@ }, { "name": "symfony/process", - "version": "v7.4.11", + "version": "v8.0.11", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "d9593c9efa40499eb078b81144de42cbc28a31f0" + "reference": "26d89e459f037d2873300605d0a07e7a8ef84db0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d9593c9efa40499eb078b81144de42cbc28a31f0", - "reference": "d9593c9efa40499eb078b81144de42cbc28a31f0", + "url": "https://api.github.com/repos/symfony/process/zipball/26d89e459f037d2873300605d0a07e7a8ef84db0", + "reference": "26d89e459f037d2873300605d0a07e7a8ef84db0", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.4" }, "type": "library", "autoload": { @@ -15921,7 +15575,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.4.11" + "source": "https://github.com/symfony/process/tree/v8.0.11" }, "funding": [ { @@ -15941,20 +15595,20 @@ "type": "tidelift" } ], - "time": "2026-05-11T16:55:21+00:00" + "time": "2026-05-11T16:56:32+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v7.4.11", + "version": "v7.4.12", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "066e718f8dfb73c55de43470bb73ebd525343d21" + "reference": "558fe81a383302318d9b92f7661deb731153c86e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/066e718f8dfb73c55de43470bb73ebd525343d21", - "reference": "066e718f8dfb73c55de43470bb73ebd525343d21", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/558fe81a383302318d9b92f7661deb731153c86e", + "reference": "558fe81a383302318d9b92f7661deb731153c86e", "shasum": "" }, "require": { @@ -16011,7 +15665,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.4.11" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.4.12" }, "funding": [ { @@ -16031,7 +15685,7 @@ "type": "tidelift" } ], - "time": "2026-05-11T13:02:51+00:00" + "time": "2026-05-20T07:20:23+00:00" }, { "name": "symplify/vendor-patches", @@ -16128,22 +15782,22 @@ }, { "name": "tomasvotruba/type-coverage", - "version": "2.1.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/TomasVotruba/type-coverage.git", - "reference": "468354b3964120806a69890cbeb3fcf005876391" + "reference": "4087caa4639bdd4c646f2984bc333efeddf69e4b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TomasVotruba/type-coverage/zipball/468354b3964120806a69890cbeb3fcf005876391", - "reference": "468354b3964120806a69890cbeb3fcf005876391", + "url": "https://api.github.com/repos/TomasVotruba/type-coverage/zipball/4087caa4639bdd4c646f2984bc333efeddf69e4b", + "reference": "4087caa4639bdd4c646f2984bc333efeddf69e4b", "shasum": "" }, "require": { "nette/utils": "^3.2 || ^4.0", "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.0" + "phpstan/phpstan": "^2.1.33" }, "type": "phpstan-extension", "extra": { @@ -16169,7 +15823,7 @@ ], "support": { "issues": "https://github.com/TomasVotruba/type-coverage/issues", - "source": "https://github.com/TomasVotruba/type-coverage/tree/2.1.0" + "source": "https://github.com/TomasVotruba/type-coverage/tree/2.2.1" }, "funding": [ { @@ -16181,7 +15835,7 @@ "type": "github" } ], - "time": "2025-12-05T16:38:02+00:00" + "time": "2026-05-26T08:14:01+00:00" } ], "aliases": [], @@ -16190,7 +15844,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=8.2", + "php": ">=8.5", "ext-curl": "*", "ext-dom": "*", "ext-gd": "*", diff --git a/db/seeds/ComptaCompte.php b/db/seeds/ComptaCompte.php index 034be1c39..d515d6e77 100644 --- a/db/seeds/ComptaCompte.php +++ b/db/seeds/ComptaCompte.php @@ -16,7 +16,7 @@ public function run(): void [ 'id' => 2, 'nom_compte' => 'Caisse', - 'archived_at' => (new DateTime('last year'))->format('Y-m-d H:i:s'), + 'archived_at' => new DateTime('last year')->format('Y-m-d H:i:s'), ], [ 'id' => 3, @@ -25,7 +25,7 @@ public function run(): void [ 'id' => 4, 'nom_compte' => 'Paypal', - 'archived_at' => (new DateTime('last year'))->format('Y-m-d H:i:s'), + 'archived_at' => new DateTime('last year')->format('Y-m-d H:i:s'), ], ]; diff --git a/db/seeds/Event.php b/db/seeds/Event.php index 84483512d..1c7e54c87 100644 --- a/db/seeds/Event.php +++ b/db/seeds/Event.php @@ -98,18 +98,18 @@ public function run(): void 'sponsor_management_en' => '**Sponsors**, come, you will be very visible!', 'mail_inscription_content' => 'Contenu email de l\'évènement du passé', ]), - 'date_fin_appel_projet' => (new DateTime('2020-03-31 00:00:00'))->getTimestamp(), - 'date_debut_appel_conferencier' => (new DateTime('2020-03-15 00:00:00'))->getTimestamp(), - 'date_fin_appel_conferencier' => (new DateTime('2020-02-01 00:00:00'))->getTimestamp(), + 'date_fin_appel_projet' => new DateTime('2020-03-31 00:00:00')->getTimestamp(), + 'date_debut_appel_conferencier' => new DateTime('2020-03-15 00:00:00')->getTimestamp(), + 'date_fin_appel_conferencier' => new DateTime('2020-02-01 00:00:00')->getTimestamp(), 'date_fin_vote' => '2020-03-31 00:00:00', - 'date_fin_prevente' => (new DateTime('2020-04-01 00:00:00'))->getTimestamp(), - 'date_fin_vente' => (new DateTime('2020-04-15 00:00:00'))->getTimestamp(), - 'date_fin_vente_token_sponsor' => (new DateTime('2020-04-01 00:00:00'))->getTimestamp(), - 'date_fin_saisie_repas_speakers' => (new DateTime('2020-04-01 00:00:00'))->getTimestamp(), - 'date_fin_saisie_nuites_hotel' => (new DateTime('2020-04-01 00:00:00'))->getTimestamp(), + 'date_fin_prevente' => new DateTime('2020-04-01 00:00:00')->getTimestamp(), + 'date_fin_vente' => new DateTime('2020-04-15 00:00:00')->getTimestamp(), + 'date_fin_vente_token_sponsor' => new DateTime('2020-04-01 00:00:00')->getTimestamp(), + 'date_fin_saisie_repas_speakers' => new DateTime('2020-04-01 00:00:00')->getTimestamp(), + 'date_fin_saisie_nuites_hotel' => new DateTime('2020-04-01 00:00:00')->getTimestamp(), 'place_name' => 'Berlin', 'place_address' => 'rue de Paris', - 'date_annonce_planning' => (new DateTime('2020-04-01 00:00:00'))->getTimestamp(), + 'date_annonce_planning' => new DateTime('2020-04-01 00:00:00')->getTimestamp(), 'transport_information_enabled' => 1, 'has_prices_defined_with_vat' => 1, ], diff --git a/db/seeds/Inscriptions.php b/db/seeds/Inscriptions.php index 982741725..2766bb2f4 100644 --- a/db/seeds/Inscriptions.php +++ b/db/seeds/Inscriptions.php @@ -30,7 +30,7 @@ public function run(): void 'etat' => Ticket::STATUS_PAID, ], [ - 'date' => (new \DateTime("2023-06-25"))->getTimestamp(), + 'date' => new \DateTime("2023-06-25")->getTimestamp(), 'reference' => 'REF-TEST-002', 'type_inscription' => Tarif::TYPE_2_DAYS['id'], 'montant' => Tarif::TYPE_2_DAYS['default_price'], @@ -47,7 +47,7 @@ public function run(): void 'etat' => Ticket::STATUS_PAID, ], [ - 'date' => (new \DateTime("2024-01-02"))->getTimestamp(), + 'date' => new \DateTime("2024-01-02")->getTimestamp(), 'reference' => 'REF-TEST-003', 'type_inscription' => Tarif::TYPE_2_DAYS['id'], 'montant' => Tarif::TYPE_2_DAYS['default_price'], @@ -64,7 +64,7 @@ public function run(): void 'etat' => Ticket::STATUS_PAID, ], [ - 'date' => (new \DateTime("2024-01-02"))->getTimestamp(), + 'date' => new \DateTime("2024-01-02")->getTimestamp(), 'reference' => 'REF-TEST-004', 'type_inscription' => Tarif::TYPE_2_DAYS_AFUP['id'], 'montant' => Tarif::TYPE_2_DAYS_AFUP['default_price'], @@ -185,7 +185,7 @@ public function run(): void [ 'reference' => 'REF-TEST-002', 'montant' => Tarif::TYPE_2_DAYS['default_price'], - 'date_reglement' => (new \DateTime("2023-06-25"))->getTimestamp(), + 'date_reglement' => new \DateTime("2023-06-25")->getTimestamp(), 'type_reglement' => Ticket::PAYMENT_CHEQUE, 'email' => 'jean@yahoo.fr', 'nom' => 'Jean', @@ -199,12 +199,12 @@ public function run(): void 'etat' => Ticket::STATUS_PAID, 'facturation' => Ticket::INVOICE_SENT, 'id_forum' => Event::ID_FORUM, - 'date_facture' => (new \DateTime("2023-06-25"))->getTimestamp(), + 'date_facture' => new \DateTime("2023-06-25")->getTimestamp(), ], [ 'reference' => 'REF-TEST-003', 'montant' => Tarif::TYPE_2_DAYS['default_price'], - 'date_reglement' => (new \DateTime("2024-01-02"))->getTimestamp(), + 'date_reglement' => new \DateTime("2024-01-02")->getTimestamp(), 'type_reglement' => Ticket::PAYMENT_BANKWIRE, 'email' => 'james@starfleet.fr', 'nom' => 'Kirk', @@ -218,12 +218,12 @@ public function run(): void 'etat' => Ticket::STATUS_PAID, 'facturation' => Ticket::INVOICE_SENT, 'id_forum' => Event::ID_FORUM, - 'date_facture' => (new \DateTime("2024-01-02"))->getTimestamp(), + 'date_facture' => new \DateTime("2024-01-02")->getTimestamp(), ], [ 'reference' => 'REF-TEST-004', 'montant' => Tarif::TYPE_2_DAYS_AFUP['default_price'], - 'date_reglement' => (new \DateTime("2024-01-02"))->getTimestamp(), + 'date_reglement' => new \DateTime("2024-01-02")->getTimestamp(), 'type_reglement' => Ticket::PAYMENT_CREDIT_CARD, 'email' => 'sans@cotisation.fr', 'nom' => 'Sans', @@ -237,12 +237,12 @@ public function run(): void 'etat' => Ticket::STATUS_PAID, 'facturation' => Ticket::INVOICE_SENT, 'id_forum' => Event::ID_FORUM, - 'date_facture' => (new \DateTime("2024-01-02"))->getTimestamp(), + 'date_facture' => new \DateTime("2024-01-02")->getTimestamp(), ], [ 'reference' => 'REF-TEST-005', 'montant' => Tarif::TYPE_2_DAYS_AFUP['default_price'], - 'date_reglement' => (new \DateTime("2024-01-02"))->getTimestamp(), + 'date_reglement' => new \DateTime("2024-01-02")->getTimestamp(), 'type_reglement' => Ticket::PAYMENT_CREDIT_CARD, 'nom' => 'Personne', 'prenom' => 'Paul', @@ -256,12 +256,12 @@ public function run(): void 'etat' => Ticket::STATUS_PAID, 'facturation' => Ticket::INVOICE_SENT, 'id_forum' => Event::ID_FORUM, - 'date_facture' => (new \DateTime("2024-01-02"))->getTimestamp(), + 'date_facture' => new \DateTime("2024-01-02")->getTimestamp(), ], [ 'reference' => 'REF-TEST-006', 'montant' => Tarif::TYPE_2_DAYS_AFUP['default_price'], - 'date_reglement' => (new \DateTime("2024-01-02"))->getTimestamp(), + 'date_reglement' => new \DateTime("2024-01-02")->getTimestamp(), 'type_reglement' => Ticket::PAYMENT_CREDIT_CARD, 'nom' => 'Maurice', 'prenom' => 'Jean', @@ -275,7 +275,7 @@ public function run(): void 'etat' => Ticket::STATUS_PAID, 'facturation' => Ticket::INVOICE_SENT, 'id_forum' => Event::ID_FORUM, - 'date_facture' => (new \DateTime("2024-01-02"))->getTimestamp(), + 'date_facture' => new \DateTime("2024-01-02")->getTimestamp(), ], [ 'reference' => 'REF-TEST-007', diff --git a/db/seeds/Session.php b/db/seeds/Session.php index de07cbe90..c493c208d 100644 --- a/db/seeds/Session.php +++ b/db/seeds/Session.php @@ -77,7 +77,7 @@ public function run(): void 'language_code' => 'fr', 'markdown' => 0, 'joindin' => 24138, - 'date_publication' => (new \DateTime())->modify('-1 days')->format('Y-m-d H:i:s'), + 'date_publication' => new \DateTime()->modify('-1 days')->format('Y-m-d H:i:s'), 'has_allowed_to_sharing_with_local_offices' => 1, 'bluesky_posts' => 'https://bsky.app/profile/afup.org/post/3mjk3hmqxxe2d', ], @@ -101,7 +101,7 @@ public function run(): void 'language_code' => 'fr', 'markdown' => 1, 'joindin' => 24041, - 'date_publication' => (new \DateTime())->modify('+5 days')->format('Y-m-d H:i:s'), + 'date_publication' => new \DateTime()->modify('+5 days')->format('Y-m-d H:i:s'), 'has_allowed_to_sharing_with_local_offices' => 1, ], [ @@ -181,8 +181,8 @@ public function run(): void $forcedPlannings = [ 6 => [ - 'debut' => (new \DateTime('2020-09-15 10:00:00'))->format('U'), - 'fin' => (new \DateTime('2020-09-15 10:40:00'))->format('U'), + 'debut' => new \DateTime('2020-09-15 10:00:00')->format('U'), + 'fin' => new \DateTime('2020-09-15 10:40:00')->format('U'), ], ]; diff --git a/db/seeds/TechletterSubscriptions.php b/db/seeds/TechletterSubscriptions.php index 985a0a815..3a962d6c3 100644 --- a/db/seeds/TechletterSubscriptions.php +++ b/db/seeds/TechletterSubscriptions.php @@ -8,7 +8,7 @@ class TechletterSubscriptions extends AbstractSeed { public function run(): void { - $subscriptionDate = (new DateTime())->format('Y-m-d H:i:s'); + $subscriptionDate = new DateTime()->format('Y-m-d H:i:s'); $data = [ [ 'user_id' => Users::ID_USER_ADMIN, diff --git a/docker/dockerfiles/apachephp/Dockerfile b/docker/dockerfiles/apachephp/Dockerfile index a23a47c51..b59e5d5b0 100644 --- a/docker/dockerfiles/apachephp/Dockerfile +++ b/docker/dockerfiles/apachephp/Dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2-apache AS base +FROM php:8.5-apache AS base ARG ENABLE_XDEBUG=false ARG uid=1008 diff --git a/htdocs/index.php b/htdocs/index.php index c13ba7673..8b590667b 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -11,8 +11,7 @@ if ($_SERVER['HTTP_HOST'] === 'afup.dev' || $isDevEnv || $isTestEnv) { if (!$isDevEnv && !$isTestEnv - && - ( + && ( isset($_SERVER['HTTP_CLIENT_IP']) || isset($_SERVER['HTTP_X_FORWARDED_FOR']) || !in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1', '192.168.42.1']) && php_sapi_name() !== 'cli-server' @@ -48,7 +47,7 @@ Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT - | Request::HEADER_X_FORWARDED_PROTO + | Request::HEADER_X_FORWARDED_PROTO, ); $response = $kernel->handle($request); diff --git a/importmap.php b/importmap.php index f58317fa6..794ceb937 100644 --- a/importmap.php +++ b/importmap.php @@ -1,5 +1,7 @@ [ 'version' => '2.5.0', - 'type' => 'css' + 'type' => 'css', ], 'semantic-ui/dist/semantic.min.js' => [ - 'version' => '2.5.0' + 'version' => '2.5.0', ], ]; diff --git a/phpstan.neon b/phpstan.neon index 4963981f1..df3e757b0 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -16,8 +16,7 @@ parameters: return: 71 param: 71 property: 45 - # since PHP 8.3 - # constant: 30 + constant: 100 doctrine: ormRepositoryClass: AppBundle\Doctrine\EntityRepository diff --git a/rector.php b/rector.php index cd8fc5ed1..6ff811d8b 100644 --- a/rector.php +++ b/rector.php @@ -4,9 +4,6 @@ use Rector\Config\RectorConfig; use Rector\Set\ValueObject\LevelSetList; -use Rector\PHPUnit\Set\PHPUnitSetList; -use Rector\Symfony\Set\SymfonySetList; -use Rector\Symfony\Set\TwigSetList; return RectorConfig::configure() ->withPaths([ @@ -26,6 +23,6 @@ symfony: true, ) ->withSets([ - LevelSetList::UP_TO_PHP_82, + LevelSetList::UP_TO_PHP_85, ]) ; diff --git a/sources/Afup/Comptabilite/Facture.php b/sources/Afup/Comptabilite/Facture.php index 91d8aa1d8..e15b7e7f8 100644 --- a/sources/Afup/Comptabilite/Facture.php +++ b/sources/Afup/Comptabilite/Facture.php @@ -296,7 +296,7 @@ public function genererNumeroFacture(): string // on va chercher l'index de l'année dernière if (null === $index) { $index = $this->_bdd->obtenirUn($sql . ($year - 1)); - $index = (int) (is_null($index) ? 1 : $index); + $index = (int) ($index ?? 1); } return "$year-$index"; @@ -312,7 +312,7 @@ public function genererNumeroDevis(): string $requete .= ' LEFT(numero_devis, 4)=' . $this->_bdd->echapper(date('Y')); $index = $this->_bdd->obtenirUn($requete); - return date('Y') . '-' . sprintf('%02d', (is_null($index) ? 1 : $index)); + return date('Y') . '-' . sprintf('%02d', ($index ?? 1)); } diff --git a/sources/Afup/Comptabilite/PDF.php b/sources/Afup/Comptabilite/PDF.php index 0b770726e..883cba79b 100644 --- a/sources/Afup/Comptabilite/PDF.php +++ b/sources/Afup/Comptabilite/PDF.php @@ -19,12 +19,14 @@ public function __construct($orientation = 'P', $unit = 'mm', $size = 'A4') $this->AddFont('Arial','I','Arial_Italic.ttf',true); } + #[\Override] public function Header(): void //En-tête { $this->Ln(1); //Saut de ligne } //Pied de page + #[\Override] public function Footer(): void { // $this->SetY(-15); //Positionnement à 1,5 cm du bas diff --git a/sources/Afup/Corporate/Feuille.php b/sources/Afup/Corporate/Feuille.php index ae7d588c4..81a3a65a1 100644 --- a/sources/Afup/Corporate/Feuille.php +++ b/sources/Afup/Corporate/Feuille.php @@ -6,10 +6,10 @@ class Feuille { - public const ID_FEUILLE_ANTENNES = 71; - public const ID_FEUILLE_ASSOCIATION = 74; - public const ID_FEUILLE_COLONNE_DROITE = 1; - public const ID_FEUILLE_HEADER = 21; - public const ID_FEUILLE_FOOTER = 38; - public const ID_FEUILLE_NOS_ACTIONS = 96; + public const int ID_FEUILLE_ANTENNES = 71; + public const int ID_FEUILLE_ASSOCIATION = 74; + public const int ID_FEUILLE_COLONNE_DROITE = 1; + public const int ID_FEUILLE_HEADER = 21; + public const int ID_FEUILLE_FOOTER = 38; + public const int ID_FEUILLE_NOS_ACTIONS = 96; } diff --git a/sources/Afup/Forum/AppelConferencier.php b/sources/Afup/Forum/AppelConferencier.php index be1a1c3d4..df8b1c076 100644 --- a/sources/Afup/Forum/AppelConferencier.php +++ b/sources/Afup/Forum/AppelConferencier.php @@ -9,7 +9,7 @@ class AppelConferencier { - public const DEFAULT_JOURNEE = 0; + public const int DEFAULT_JOURNEE = 0; public function __construct(private readonly Base_De_Donnees $_bdd) {} diff --git a/sources/Afup/Utils/Mail.php b/sources/Afup/Utils/Mail.php index 9e4d7ede7..c9c6017c5 100644 --- a/sources/Afup/Utils/Mail.php +++ b/sources/Afup/Utils/Mail.php @@ -12,7 +12,7 @@ class Mail { - public const PROJECT_DIR = __DIR__ . '/../../..'; + public const string PROJECT_DIR = __DIR__ . '/../../..'; public static function createMailer(): Mailer { diff --git a/sources/Afup/Utils/PDF_AG.php b/sources/Afup/Utils/PDF_AG.php index 48c5d6a35..da9d4c3db 100644 --- a/sources/Afup/Utils/PDF_AG.php +++ b/sources/Afup/Utils/PDF_AG.php @@ -9,7 +9,7 @@ class PDF_AG extends PDF { - public const CELL_HEIGHT = 7; + public const int CELL_HEIGHT = 7; private $footerTitle = ''; /** @@ -77,6 +77,7 @@ private function writeRow(array $row): void } } + #[\Override] public function Footer(): void { $this->SetY(-15); diff --git a/sources/Afup/Utils/PDF_Facture.php b/sources/Afup/Utils/PDF_Facture.php index a208c8e14..448ae3078 100644 --- a/sources/Afup/Utils/PDF_Facture.php +++ b/sources/Afup/Utils/PDF_Facture.php @@ -16,6 +16,7 @@ public function __construct( parent::__construct(); } + #[\Override] public function header(): void { // Haut de page [afup] @@ -50,6 +51,7 @@ public function header(): void $this->Ln(); } + #[\Override] public function _putinfo(): void { // on surcharge le _putinfo pour ne rien faire @@ -65,6 +67,7 @@ public function _putinfo(): void * * @see FPDF::Footer() */ + #[\Override] public function Footer(): void { $address = sprintf( diff --git a/sources/Afup/Utils/Pays.php b/sources/Afup/Utils/Pays.php index 6f8fdad2c..af6c28b67 100644 --- a/sources/Afup/Utils/Pays.php +++ b/sources/Afup/Utils/Pays.php @@ -11,7 +11,7 @@ */ class Pays { - public const DEFAULT_ID = 'FR'; + public const string DEFAULT_ID = 'FR'; public function __construct(private readonly CountryRepository $countryRepository) {} diff --git a/sources/Afup/Utils/Utils.php b/sources/Afup/Utils/Utils.php index 38ad2e607..33da55806 100644 --- a/sources/Afup/Utils/Utils.php +++ b/sources/Afup/Utils/Utils.php @@ -13,8 +13,8 @@ */ class Utils { - public const TICKETING_VAT_RATE = 0.1; - public const MEMBERSHIP_FEE_VAT_RATE = 0.2; + public const float TICKETING_VAT_RATE = 0.1; + public const float MEMBERSHIP_FEE_VAT_RATE = 0.2; public static function fabriqueDroits(TokenStorageInterface $tokenStorage, AuthorizationCheckerInterface $authorizationChecker): Droits { diff --git a/sources/Afup/Utils/Vat.php b/sources/Afup/Utils/Vat.php index 6e98f4cab..f7eb96419 100644 --- a/sources/Afup/Utils/Vat.php +++ b/sources/Afup/Utils/Vat.php @@ -6,7 +6,7 @@ class Vat { - public const VAT_APPLICATION_DATE = "2024-01-01"; + public const string VAT_APPLICATION_DATE = "2024-01-01"; public static function isSubjectedToVat(\DateTimeInterface $date): bool { diff --git a/sources/AppBundle/Accounting/Form/InvoicingPeriodType.php b/sources/AppBundle/Accounting/Form/InvoicingPeriodType.php index 6d1010a7e..05659f941 100644 --- a/sources/AppBundle/Accounting/Form/InvoicingPeriodType.php +++ b/sources/AppBundle/Accounting/Form/InvoicingPeriodType.php @@ -38,6 +38,7 @@ public function configureOptions(OptionsResolver $resolver): void $resolver->setDefaults(['method' => 'GET', 'csrf_protection' => false]); } + #[\Override] public function getBlockPrefix() { return ''; diff --git a/sources/AppBundle/Accounting/Form/ProduitType.php b/sources/AppBundle/Accounting/Form/ProduitType.php index c27e30c05..592962c6b 100644 --- a/sources/AppBundle/Accounting/Form/ProduitType.php +++ b/sources/AppBundle/Accounting/Form/ProduitType.php @@ -54,7 +54,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'required' => true, 'expanded' => true, 'multiple' => false, - 'choice_label' => fn(TvaTaux $taux) => $taux->label(), + 'choice_label' => fn(TvaTaux $taux): string => $taux->label(), ]); } } diff --git a/sources/AppBundle/AppKernel.php b/sources/AppBundle/AppKernel.php index af5ef910c..e96738deb 100644 --- a/sources/AppBundle/AppKernel.php +++ b/sources/AppBundle/AppKernel.php @@ -15,16 +15,19 @@ class AppKernel extends Kernel { use MicroKernelTrait; + #[\Override] public function getProjectDir(): string { return __DIR__ . '/../../app'; } + #[\Override] public function getCacheDir(): string { return __DIR__ . '/../../var/cache/' . $this->getEnvironment(); } + #[\Override] public function getLogDir(): string { return __DIR__ . '/../../var/logs'; diff --git a/sources/AppBundle/AssetMapper/PostCompilationCopyHandler.php b/sources/AppBundle/AssetMapper/PostCompilationCopyHandler.php index 8c3454aa4..208f9768d 100644 --- a/sources/AppBundle/AssetMapper/PostCompilationCopyHandler.php +++ b/sources/AppBundle/AssetMapper/PostCompilationCopyHandler.php @@ -14,7 +14,7 @@ */ class PostCompilationCopyHandler implements PublicAssetsFilesystemInterface { - private Filesystem $filesystem; + private readonly Filesystem $filesystem; /** * @param string[] $extensionsToCompress diff --git a/sources/AppBundle/Association/CompanyMembership/SubscriptionManagement.php b/sources/AppBundle/Association/CompanyMembership/SubscriptionManagement.php index 576afb378..77c6f5aab 100644 --- a/sources/AppBundle/Association/CompanyMembership/SubscriptionManagement.php +++ b/sources/AppBundle/Association/CompanyMembership/SubscriptionManagement.php @@ -25,7 +25,7 @@ public function createInvoiceForInscription(CompanyMember $company, int $numberO ceil($numberOfMembers / AFUP_PERSONNE_MORALE_SEUIL) * AFUP_COTISATION_PERSONNE_MORALE * (1 + Utils::MEMBERSHIP_FEE_VAT_RATE), null, null, - (new \DateTime())->getTimestamp(), + new \DateTime()->getTimestamp(), $endSubscription->getTimestamp(), '', ); diff --git a/sources/AppBundle/Association/Form/CompanyPublicProfile.php b/sources/AppBundle/Association/Form/CompanyPublicProfile.php index d4d6e0036..775b87f77 100644 --- a/sources/AppBundle/Association/Form/CompanyPublicProfile.php +++ b/sources/AppBundle/Association/Form/CompanyPublicProfile.php @@ -24,8 +24,8 @@ class CompanyPublicProfile extends AbstractType { - public const DESCRIPTION_MAX_LENGTH = 2000; - public const MEMBERSHIP_REASON_MAX_LENGTH = 150; + public const int DESCRIPTION_MAX_LENGTH = 2000; + public const int MEMBERSHIP_REASON_MAX_LENGTH = 150; public function __construct(private readonly AntenneRepository $antennesRepository) {} diff --git a/sources/AppBundle/Association/Form/NearestOfficeChoiceType.php b/sources/AppBundle/Association/Form/NearestOfficeChoiceType.php index 93a631ee3..d856141dc 100644 --- a/sources/AppBundle/Association/Form/NearestOfficeChoiceType.php +++ b/sources/AppBundle/Association/Form/NearestOfficeChoiceType.php @@ -25,6 +25,7 @@ public function configureOptions(OptionsResolver $resolver): void $resolver->setDefaults(['choices' => $offices]); } + #[\Override] public function getParent() { return ChoiceType::class; diff --git a/sources/AppBundle/Association/Model/CompanyMember.php b/sources/AppBundle/Association/Model/CompanyMember.php index abb3b90af..bb6e65fbf 100644 --- a/sources/AppBundle/Association/Model/CompanyMember.php +++ b/sources/AppBundle/Association/Model/CompanyMember.php @@ -13,9 +13,9 @@ class CompanyMember implements NotifyPropertyInterface { use NotifyProperty; - public const STATUS_PENDING = -1; - public const STATUS_ACTIVE = 1; - public const STATUS_INACTIVE = 0; + public const int STATUS_PENDING = -1; + public const int STATUS_ACTIVE = 1; + public const int STATUS_INACTIVE = 0; /** * @var int diff --git a/sources/AppBundle/Association/Model/CompanyMemberInvitation.php b/sources/AppBundle/Association/Model/CompanyMemberInvitation.php index d5e8764a1..c856c45b4 100644 --- a/sources/AppBundle/Association/Model/CompanyMemberInvitation.php +++ b/sources/AppBundle/Association/Model/CompanyMemberInvitation.php @@ -12,9 +12,9 @@ class CompanyMemberInvitation implements NotifyPropertyInterface { use NotifyProperty; - public const STATUS_PENDING = 0; - public const STATUS_ACCEPTED = 1; - public const STATUS_CANCELLED = 2; + public const int STATUS_PENDING = 0; + public const int STATUS_ACCEPTED = 1; + public const int STATUS_CANCELLED = 2; private int $id; diff --git a/sources/AppBundle/Association/Model/GeneralMeetingQuestion.php b/sources/AppBundle/Association/Model/GeneralMeetingQuestion.php index 0f346536b..e80d52217 100644 --- a/sources/AppBundle/Association/Model/GeneralMeetingQuestion.php +++ b/sources/AppBundle/Association/Model/GeneralMeetingQuestion.php @@ -11,9 +11,9 @@ class GeneralMeetingQuestion implements NotifyPropertyInterface { use NotifyProperty; - public const STATUS_WAITING = 'waiting'; - public const STATUS_OPENED = 'opened'; - public const STATUS_CLOSED = 'closed'; + public const string STATUS_WAITING = 'waiting'; + public const string STATUS_OPENED = 'opened'; + public const string STATUS_CLOSED = 'closed'; /** * @var int diff --git a/sources/AppBundle/Association/Model/GeneralMeetingResponse.php b/sources/AppBundle/Association/Model/GeneralMeetingResponse.php index 65570a9e8..b23849e71 100644 --- a/sources/AppBundle/Association/Model/GeneralMeetingResponse.php +++ b/sources/AppBundle/Association/Model/GeneralMeetingResponse.php @@ -11,9 +11,9 @@ class GeneralMeetingResponse implements NotifyPropertyInterface { use NotifyProperty; - public const STATUS_PENDING = 0; - public const STATUS_PRESENT = 1; - public const STATUS_NON_PRESENT = 2; + public const int STATUS_PENDING = 0; + public const int STATUS_PRESENT = 1; + public const int STATUS_NON_PRESENT = 2; /** * @var int diff --git a/sources/AppBundle/Association/Model/GeneralMeetingVote.php b/sources/AppBundle/Association/Model/GeneralMeetingVote.php index d29afcefe..4586d87ad 100644 --- a/sources/AppBundle/Association/Model/GeneralMeetingVote.php +++ b/sources/AppBundle/Association/Model/GeneralMeetingVote.php @@ -11,9 +11,9 @@ class GeneralMeetingVote implements NotifyPropertyInterface { use NotifyProperty; - public const VALUE_YES = 'oui'; - public const VALUE_NO = 'non'; - public const VALUE_ABSTENTION = 'abstention'; + public const string VALUE_YES = 'oui'; + public const string VALUE_NO = 'non'; + public const string VALUE_ABSTENTION = 'abstention'; /** * @var int diff --git a/sources/AppBundle/Association/Model/Repository/CompanyMemberRepository.php b/sources/AppBundle/Association/Model/Repository/CompanyMemberRepository.php index af6ab4208..c61a2052c 100644 --- a/sources/AppBundle/Association/Model/Repository/CompanyMemberRepository.php +++ b/sources/AppBundle/Association/Model/Repository/CompanyMemberRepository.php @@ -86,7 +86,7 @@ public function search($sort = 'name', $direction = 'asc', $filter = null, $only // C'est un peu barbare mais généralement on ne met qu'un seul terme dans la recherche… du coup c'est pas bien grave. if ($filter) { $filters = explode(' ', $filter); - $filters = array_filter(array_map('trim', $filters)); + $filters = array_filter(array_map(trim(...), $filters)); $ors = []; foreach ($filters as $i => $value) { $ors[] = "LOWER(apm.raison_sociale) LIKE LOWER(:filter$i) OR apm.ville LIKE :filter$i"; @@ -163,7 +163,7 @@ public function countByStatus($status) private function getHydratorForCompanyMember() { - return (new HydratorSingleObject()) + return new HydratorSingleObject() ->mapAliasTo('lastsubcription', 'apm', 'setLastSubscription'); } diff --git a/sources/AppBundle/Association/Model/Repository/UserRepository.php b/sources/AppBundle/Association/Model/Repository/UserRepository.php index 28fc1559a..16a9365c4 100644 --- a/sources/AppBundle/Association/Model/Repository/UserRepository.php +++ b/sources/AppBundle/Association/Model/Repository/UserRepository.php @@ -193,7 +193,7 @@ public function search( // C'est un peu barbare mais généralement on ne met qu'un seul terme dans la recherche… du coup c'est pas bien grave. if ($filter) { $filters = explode(' ', (string) $filter); - $filters = array_filter(array_map('trim', $filters)); + $filters = array_filter(array_map(trim(...), $filters)); $ors = []; foreach ($filters as $i => $value) { $ors[] = "LOWER(app.login) LIKE LOWER(:filter$i) OR LOWER(app.nom) LIKE LOWER(:filter$i) OR LOWER(app.prenom) LIKE LOWER(:filter$i) @@ -401,7 +401,7 @@ private function addUserTypeCondition(SelectInterface $queryBuilder, ?MemberType private function getHydratorForUser() { - return (new HydratorSingleObject()) + return new HydratorSingleObject() ->mapAliasTo('lastsubcription', 'app', 'setLastSubscription') ->mapAliasTo('hash', 'app', 'setHash') ->mapObjectTo('apm', 'app', 'setCompany') diff --git a/sources/AppBundle/Association/Model/User.php b/sources/AppBundle/Association/Model/User.php index cb512e021..39f2a9c8f 100644 --- a/sources/AppBundle/Association/Model/User.php +++ b/sources/AppBundle/Association/Model/User.php @@ -20,19 +20,19 @@ class User implements NotifyPropertyInterface, NotifiableInterface, UserInterfac { use NotifyProperty; - public const LEVEL_MEMBER = 0; - public const LEVEL_WRITER = 1; - public const LEVEL_ADMIN = 2; + public const int LEVEL_MEMBER = 0; + public const int LEVEL_WRITER = 1; + public const int LEVEL_ADMIN = 2; - public const STATUS_PENDING = -1; - public const STATUS_ACTIVE = 1; - public const STATUS_INACTIVE = 0; + public const int STATUS_PENDING = -1; + public const int STATUS_ACTIVE = 1; + public const int STATUS_INACTIVE = 0; - public const SLACK_INVITE_STATUS_NONE = 0; - public const SLACK_INVITE_STATUS_REQUESTED = 1; + public const int SLACK_INVITE_STATUS_NONE = 0; + public const int SLACK_INVITE_STATUS_REQUESTED = 1; - public const CIVILITE_M = 0; - public const CIVILITE_MME = 1; + public const int CIVILITE_M = 0; + public const int CIVILITE_MME = 1; /** * @var int @@ -709,15 +709,6 @@ public function removeRole($role): self return $this; } - /** - * @deprecated - * This method can be removed in Symfony 6.0 - is not needed for apps that do not check user passwords. - */ - public function getSalt(): null - { - return null; - } - public function eraseCredentials(): void {} public function __serialize(): array diff --git a/sources/AppBundle/Association/UserMembership/BadgesComputer.php b/sources/AppBundle/Association/UserMembership/BadgesComputer.php index b1e94cb75..b9ca13cee 100644 --- a/sources/AppBundle/Association/UserMembership/BadgesComputer.php +++ b/sources/AppBundle/Association/UserMembership/BadgesComputer.php @@ -12,7 +12,7 @@ class BadgesComputer { - private const MAX_BADGES_SENIORITY = 29; + private const int MAX_BADGES_SENIORITY = 29; public function __construct( private readonly SeniorityComputer $seniorityComputer, @@ -228,7 +228,7 @@ private function getSpeakerYears(User $user): array private function getGeneralMeetingYears(User $user): array { $responses = $this->generalMeetingResponseRepository->getByUser($user); - $currentTimestamp = (new \DateTime())->format('U'); + $currentTimestamp = new \DateTime()->format('U'); $dates = []; foreach ($responses as $response) { diff --git a/sources/AppBundle/AuditLog/AuditLogRepository.php b/sources/AppBundle/AuditLog/AuditLogRepository.php index e601c2e98..932bc41a1 100644 --- a/sources/AppBundle/AuditLog/AuditLogRepository.php +++ b/sources/AppBundle/AuditLog/AuditLogRepository.php @@ -11,7 +11,7 @@ final readonly class AuditLogRepository { - private const ITEMS_PER_PAGE = 10; + private const int ITEMS_PER_PAGE = 10; public function __construct( private Connection $connection, diff --git a/sources/AppBundle/CFP/PhotoStorage.php b/sources/AppBundle/CFP/PhotoStorage.php index 4c81037dd..89be053ce 100644 --- a/sources/AppBundle/CFP/PhotoStorage.php +++ b/sources/AppBundle/CFP/PhotoStorage.php @@ -18,10 +18,10 @@ { private Filesystem $filesystem; - public const DIR_ORIGINAL = 'originals'; - public const DIR_THUMBS = 'thumbnails'; + public const string DIR_ORIGINAL = 'originals'; + public const string DIR_THUMBS = 'thumbnails'; - public const FORMAT = [ + public const array FORMAT = [ 'originals' => ['width' => 1000, 'height' => 1000], 'thumbnails' => ['width' => 90, 'height' => 120], ]; diff --git a/sources/AppBundle/Calendar/TechnoWatchCalendarGenerator.php b/sources/AppBundle/Calendar/TechnoWatchCalendarGenerator.php index 7169c6062..028fd6646 100644 --- a/sources/AppBundle/Calendar/TechnoWatchCalendarGenerator.php +++ b/sources/AppBundle/Calendar/TechnoWatchCalendarGenerator.php @@ -52,7 +52,7 @@ private function prepareEvents($googleSpreadsheetCsvUrl, $filter = null): array $events = []; - while (false !== ($row = fgetcsv($fp))) { + while (false !== ($row = fgetcsv($fp, escape: '\\'))) { if (trim((string) $row[0]) === '') { continue; } diff --git a/sources/AppBundle/Command/PayboxCallbackSimulatorCommand.php b/sources/AppBundle/Command/PayboxCallbackSimulatorCommand.php index f6fe35e49..fd147f009 100644 --- a/sources/AppBundle/Command/PayboxCallbackSimulatorCommand.php +++ b/sources/AppBundle/Command/PayboxCallbackSimulatorCommand.php @@ -62,7 +62,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int $question = new Question(sprintf('Pour quel identifiant de paiement (cmd) ? (par exemple: %s)', $example)); $cmd = $helper->ask($input, $output, $question); $question->setValidator(function ($cmd) use ($regexp): void { - if (!preg_match($regexp, $cmd)) { + if (!preg_match($regexp, (string) $cmd)) { throw new \RuntimeException( sprintf('Le format du CMD n\'est pas valide. Il doit être de la forme : %s', $regexp), ); diff --git a/sources/AppBundle/Compta/CsvExtractor.php b/sources/AppBundle/Compta/CsvExtractor.php index 7ad72501f..9c5a7187a 100644 --- a/sources/AppBundle/Compta/CsvExtractor.php +++ b/sources/AppBundle/Compta/CsvExtractor.php @@ -17,7 +17,7 @@ public function __construct( private readonly TransactionRepository $transactionRepository, ) {} - public function extract(Importer $importer) + public function extract(Importer $importer): bool { if (!$importer->validate()) { return false; diff --git a/sources/AppBundle/Compta/Importer/AutoQualifier.php b/sources/AppBundle/Compta/Importer/AutoQualifier.php index b7a35eb40..c53fa85f0 100644 --- a/sources/AppBundle/Compta/Importer/AutoQualifier.php +++ b/sources/AppBundle/Compta/Importer/AutoQualifier.php @@ -10,10 +10,10 @@ class AutoQualifier { - public const DEFAULT_CATEGORIE = 26; // "A déterminer" - public const DEFAULT_EVENEMENT = 8; // "A déterminer" - public const DEFAULT_REGLEMENT = 9; - public const DEFAULT_ATTACHMENT = 0; + public const int DEFAULT_CATEGORIE = 26; // "A déterminer" + public const int DEFAULT_EVENEMENT = 8; // "A déterminer" + public const int DEFAULT_REGLEMENT = 9; + public const int DEFAULT_ATTACHMENT = 0; /** * @param array $rules diff --git a/sources/AppBundle/Compta/Importer/CreditMutuel.php b/sources/AppBundle/Compta/Importer/CreditMutuel.php index 6fce7a3e4..c95d5f6c6 100644 --- a/sources/AppBundle/Compta/Importer/CreditMutuel.php +++ b/sources/AppBundle/Compta/Importer/CreditMutuel.php @@ -9,14 +9,14 @@ class CreditMutuel implements Importer { - public const CODE = 'CMUT'; + public const string CODE = 'CMUT'; private ?\SplFileObject $file = null; public function initialize(string $filePath): void { $this->file = new \SplFileObject($filePath, 'r'); - $this->file->setCsvControl(';'); + $this->file->setCsvControl(';', escape: '\\'); $this->file->setFlags(\SplFileObject::READ_CSV | \SplFileObject::SKIP_EMPTY); } diff --git a/sources/AppBundle/Compta/Importer/CreditMutuelLivret.php b/sources/AppBundle/Compta/Importer/CreditMutuelLivret.php index b9102a561..c46a56a22 100644 --- a/sources/AppBundle/Compta/Importer/CreditMutuelLivret.php +++ b/sources/AppBundle/Compta/Importer/CreditMutuelLivret.php @@ -8,8 +8,9 @@ class CreditMutuelLivret extends CreditMutuel { - public const CODE = 'CMUTLIVRET'; + public const string CODE = 'CMUTLIVRET'; + #[\Override] public function getCompteId(): int { return ComptaCompte::LIVRET_CMUT; diff --git a/sources/AppBundle/Controller/Admin/Accounting/Invoice/EditInvoiceAction.php b/sources/AppBundle/Controller/Admin/Accounting/Invoice/EditInvoiceAction.php index c006aebe2..364b043f6 100644 --- a/sources/AppBundle/Controller/Admin/Accounting/Invoice/EditInvoiceAction.php +++ b/sources/AppBundle/Controller/Admin/Accounting/Invoice/EditInvoiceAction.php @@ -30,7 +30,7 @@ public function __invoke(Request $request): Response $this->invoicingRepository->save($invoice); $this->addFlash('success', 'L\'écriture a été modifiée'); return $this->redirectToRoute('admin_accounting_invoices_list'); - } catch (\Exception $e) { + } catch (\Exception) { $this->invoicingRepository->rollback(); $this->addFlash('error', 'L\'écriture n\'a pas pu être enregistrée'); } diff --git a/sources/AppBundle/Controller/Admin/Accounting/Journal/AllocateAction.php b/sources/AppBundle/Controller/Admin/Accounting/Journal/AllocateAction.php index 531d5cd1a..2c3710545 100644 --- a/sources/AppBundle/Controller/Admin/Accounting/Journal/AllocateAction.php +++ b/sources/AppBundle/Controller/Admin/Accounting/Journal/AllocateAction.php @@ -21,7 +21,7 @@ public function __invoke(Request $request, int $id): RedirectResponse $totalAmount = 0; $lastId = null; - foreach (explode(';', $amountToallocate) as $amount) { + foreach (explode(';', (string) $amountToallocate) as $amount) { $amount = (float) $amount; $newTransaction = new Transaction(); diff --git a/sources/AppBundle/Controller/Admin/Accounting/Journal/EditTransactionAction.php b/sources/AppBundle/Controller/Admin/Accounting/Journal/EditTransactionAction.php index c32e52a56..fe3c04a33 100644 --- a/sources/AppBundle/Controller/Admin/Accounting/Journal/EditTransactionAction.php +++ b/sources/AppBundle/Controller/Admin/Accounting/Journal/EditTransactionAction.php @@ -4,6 +4,7 @@ namespace AppBundle\Controller\Admin\Accounting\Journal; +use AppBundle\Accounting\Model\Transaction; use AppBundle\Accounting\Form\TransactionType; use AppBundle\Accounting\Model\Repository\TransactionRepository; use AppBundle\AuditLog\Audit; @@ -23,7 +24,7 @@ public function __construct( public function __invoke(Request $request, int $id): Response { $transaction = $this->transactionRepository->get($id); - if (!$transaction instanceof \AppBundle\Accounting\Model\Transaction) { + if (!$transaction instanceof Transaction) { throw new NotFoundHttpException(); } $nextTransaction = $this->transactionRepository->getNextTransaction($transaction->getId()); diff --git a/sources/AppBundle/Controller/Admin/Accounting/Journal/ExportAction.php b/sources/AppBundle/Controller/Admin/Accounting/Journal/ExportAction.php index 0b04e70f8..ca2729052 100644 --- a/sources/AppBundle/Controller/Admin/Accounting/Journal/ExportAction.php +++ b/sources/AppBundle/Controller/Admin/Accounting/Journal/ExportAction.php @@ -64,7 +64,7 @@ public function __invoke(Request $request): Response 'TVA 20', "Zone de TVA", ]; - $file->fputcsv($columns, $csvDelimiter, $csvEnclosure); + $file->fputcsv($columns, $csvDelimiter, $csvEnclosure, escape: '\\'); foreach ($entries as $entry) { $total = number_format((float) $entry['montant'], 2, ',', "\u{202f}"); @@ -94,6 +94,7 @@ public function __invoke(Request $request): Response ], $csvDelimiter, $csvEnclosure, + escape: '\\', ); } diff --git a/sources/AppBundle/Controller/Admin/Accounting/Quotation/AddQuotationAction.php b/sources/AppBundle/Controller/Admin/Accounting/Quotation/AddQuotationAction.php index bb927191e..e95dfdb6c 100644 --- a/sources/AppBundle/Controller/Admin/Accounting/Quotation/AddQuotationAction.php +++ b/sources/AppBundle/Controller/Admin/Accounting/Quotation/AddQuotationAction.php @@ -41,7 +41,7 @@ public function __invoke(Request $request): Response $this->invoicingRepository->commit(); $this->addFlash('success', 'L\'écriture a été ajoutée'); return $this->redirectToRoute('admin_accounting_quotations_list'); - } catch (\Exception $e) { + } catch (\Exception) { $this->invoicingRepository->rollback(); $this->addFlash('error', 'L\'écriture n\'a pas pu être enregistrée'); } diff --git a/sources/AppBundle/Controller/Admin/Accounting/Quotation/EditQuotationAction.php b/sources/AppBundle/Controller/Admin/Accounting/Quotation/EditQuotationAction.php index 4b14da1f6..3c21300be 100644 --- a/sources/AppBundle/Controller/Admin/Accounting/Quotation/EditQuotationAction.php +++ b/sources/AppBundle/Controller/Admin/Accounting/Quotation/EditQuotationAction.php @@ -51,7 +51,7 @@ public function __invoke(Request $request): Response $this->invoicingRepository->commit(); $this->addFlash('success', 'L\'écriture a été modifiée'); return $this->redirectToRoute('admin_accounting_quotations_list'); - } catch (\Exception $e) { + } catch (\Exception) { $this->invoicingRepository->rollback(); $this->addFlash('error', 'L\'écriture n\'a pas pu être enregistrée'); } diff --git a/sources/AppBundle/Controller/Admin/Antennes/AntenneListAction.php b/sources/AppBundle/Controller/Admin/Antennes/AntenneListAction.php index 940bfb818..7db3e4291 100644 --- a/sources/AppBundle/Controller/Admin/Antennes/AntenneListAction.php +++ b/sources/AppBundle/Controller/Admin/Antennes/AntenneListAction.php @@ -23,7 +23,7 @@ public function __invoke(Request $request): Response uasort( $antennes, - fn(Antenne $a, Antenne $b) => strcmp($a->label, $b->label), + fn(Antenne $a, Antenne $b): int => strcmp($a->label, $b->label), ); return new Response($this->twig->render('admin/antennes/list.html.twig', [ diff --git a/sources/AppBundle/Controller/Admin/Event/Facturation/ListFacturesAction.php b/sources/AppBundle/Controller/Admin/Event/Facturation/ListFacturesAction.php index 68f21892c..d8e8ad5db 100644 --- a/sources/AppBundle/Controller/Admin/Event/Facturation/ListFacturesAction.php +++ b/sources/AppBundle/Controller/Admin/Event/Facturation/ListFacturesAction.php @@ -13,8 +13,8 @@ class ListFacturesAction extends AbstractController { - public const VALID_SORTS = ['date_facture', 'reference', 'societe', 'montant', 'etat', 'facturation']; - public const VALID_DIRECTIONS = ['asc', 'desc']; + public const array VALID_SORTS = ['date_facture', 'reference', 'societe', 'montant', 'etat', 'facturation']; + public const array VALID_DIRECTIONS = ['asc', 'desc']; public function __construct(private readonly InvoiceRepository $invoiceRepository) {} diff --git a/sources/AppBundle/Controller/Admin/Event/PreviousRegistrationsAction.php b/sources/AppBundle/Controller/Admin/Event/PreviousRegistrationsAction.php index 968e34aa7..e6283acb2 100644 --- a/sources/AppBundle/Controller/Admin/Event/PreviousRegistrationsAction.php +++ b/sources/AppBundle/Controller/Admin/Event/PreviousRegistrationsAction.php @@ -23,7 +23,7 @@ public function __invoke(Request $request): BinaryFileResponse $file = new SplFileObject(sys_get_temp_dir() . DIRECTORY_SEPARATOR . uniqid('inscrits_', true), 'w+'); $events = $this->eventRepository->getPreviousEvents($request->query->getInt('event_count', 4)); foreach ($this->ticketRepository->getRegistrationsForEventsWithNewsletterAllowed($events) as $registration) { - $file->fputcsv($registration); + $file->fputcsv($registration, escape: '\\'); } $response = new BinaryFileResponse($file, BinaryFileResponse::HTTP_OK, ['Content-Type' => 'text/csv; charset=utf-8']); diff --git a/sources/AppBundle/Controller/Admin/Event/RedirectEventFromSessionListener.php b/sources/AppBundle/Controller/Admin/Event/RedirectEventFromSessionListener.php index b4e0833c7..bdc818161 100644 --- a/sources/AppBundle/Controller/Admin/Event/RedirectEventFromSessionListener.php +++ b/sources/AppBundle/Controller/Admin/Event/RedirectEventFromSessionListener.php @@ -13,7 +13,7 @@ #[AsEventListener] final readonly class RedirectEventFromSessionListener { - public const SESSION_KEY = 'event_selector_current_id'; + public const string SESSION_KEY = 'event_selector_current_id'; public function __construct( private UrlGeneratorInterface $urlGenerator, diff --git a/sources/AppBundle/Controller/Admin/Event/Session/EditAction.php b/sources/AppBundle/Controller/Admin/Event/Session/EditAction.php index 862631779..784e19d78 100644 --- a/sources/AppBundle/Controller/Admin/Event/Session/EditAction.php +++ b/sources/AppBundle/Controller/Admin/Event/Session/EditAction.php @@ -58,7 +58,7 @@ public function __invoke(Request $request): Response if ($request->get('mode') === 'add') { $planning->getStart()?->setTime(9, 0); $planning->getEnd()?->setTime(9, 40); - $planning->setRoomId($roomChoices[array_key_first($roomChoices)]); + $planning->setRoomId(array_first($roomChoices)); $this->planningRepository->save($planning); diff --git a/sources/AppBundle/Controller/Admin/Event/SpecialPriceAction.php b/sources/AppBundle/Controller/Admin/Event/SpecialPriceAction.php index 3ca87b934..dadf96393 100644 --- a/sources/AppBundle/Controller/Admin/Event/SpecialPriceAction.php +++ b/sources/AppBundle/Controller/Admin/Event/SpecialPriceAction.php @@ -16,7 +16,7 @@ class SpecialPriceAction extends AbstractController { - public const EXTEND_DAYS = 3; // jours + public const int EXTEND_DAYS = 3; // jours public function __construct( private readonly TicketSpecialPriceRepository $ticketSpecialPriceRepository, diff --git a/sources/AppBundle/Controller/Admin/Members/GeneralMeeting/ListAction.php b/sources/AppBundle/Controller/Admin/Members/GeneralMeeting/ListAction.php index c38e74517..c46050074 100644 --- a/sources/AppBundle/Controller/Admin/Members/GeneralMeeting/ListAction.php +++ b/sources/AppBundle/Controller/Admin/Members/GeneralMeeting/ListAction.php @@ -13,8 +13,8 @@ class ListAction { - public const VALID_SORTS = ['nom', 'date_consultation', 'presence', 'personnes_avec_pouvoir_nom']; - public const VALID_DIRECTIONS = ['asc', 'desc']; + public const array VALID_SORTS = ['nom', 'date_consultation', 'presence', 'personnes_avec_pouvoir_nom']; + public const array VALID_DIRECTIONS = ['asc', 'desc']; public function __construct( private readonly UserRepository $userRepository, diff --git a/sources/AppBundle/Controller/Admin/Members/UserExportAction.php b/sources/AppBundle/Controller/Admin/Members/UserExportAction.php index 0b280dc3e..c30216dba 100644 --- a/sources/AppBundle/Controller/Admin/Members/UserExportAction.php +++ b/sources/AppBundle/Controller/Admin/Members/UserExportAction.php @@ -33,7 +33,7 @@ public function __invoke(Request $request): BinaryFileResponse $user->getEmail(), $user->getLastName(), $user->getFirstName(), - ]); + ], escape: '\\'); } $response = new BinaryFileResponse($file); $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, $baseName . '.csv'); diff --git a/sources/AppBundle/Controller/Admin/Speaker/SpeakerEditAction.php b/sources/AppBundle/Controller/Admin/Speaker/SpeakerEditAction.php index 8b85eee0a..d906d0d88 100644 --- a/sources/AppBundle/Controller/Admin/Speaker/SpeakerEditAction.php +++ b/sources/AppBundle/Controller/Admin/Speaker/SpeakerEditAction.php @@ -19,7 +19,7 @@ class SpeakerEditAction extends AbstractController { - public const ID_FORUM_PHOTO_STORAGE = 16; + public const int ID_FORUM_PHOTO_STORAGE = 16; public function __construct( private readonly SpeakerRepository $speakerRepository, diff --git a/sources/AppBundle/Controller/Admin/Speaker/SpeakerListAction.php b/sources/AppBundle/Controller/Admin/Speaker/SpeakerListAction.php index 1af33a6e9..e78dbe529 100644 --- a/sources/AppBundle/Controller/Admin/Speaker/SpeakerListAction.php +++ b/sources/AppBundle/Controller/Admin/Speaker/SpeakerListAction.php @@ -17,8 +17,8 @@ class SpeakerListAction { - public const VALID_SORTS = ['name', 'company']; - public const VALID_DIRECTIONS = ['asc', 'desc']; + public const array VALID_SORTS = ['name', 'company']; + public const array VALID_DIRECTIONS = ['asc', 'desc']; public function __construct( private readonly EventRepository $eventRepository, diff --git a/sources/AppBundle/Controller/Api/Antennes/GetOneAction.php b/sources/AppBundle/Controller/Api/Antennes/GetOneAction.php index 7b2103194..cf5ed4707 100644 --- a/sources/AppBundle/Controller/Api/Antennes/GetOneAction.php +++ b/sources/AppBundle/Controller/Api/Antennes/GetOneAction.php @@ -54,7 +54,7 @@ public function __invoke(string $code): JsonResponse $allMeetups = $this->meetupRepository->findAllForAntenne($antenne); $response['meetups'] = array_map( - fn(Meetup $meetup) => $this->transformMeetup($antenne, $meetup), + fn(Meetup $meetup): array => $this->transformMeetup($antenne, $meetup), iterator_to_array($allMeetups->getIterator()), ); diff --git a/sources/AppBundle/Controller/Event/CFP/IndexAction.php b/sources/AppBundle/Controller/Event/CFP/IndexAction.php index c19868817..583299ff9 100644 --- a/sources/AppBundle/Controller/Event/CFP/IndexAction.php +++ b/sources/AppBundle/Controller/Event/CFP/IndexAction.php @@ -19,7 +19,7 @@ class IndexAction extends AbstractController { - public const MAX_EVENTS_HISTORY = 50; + public const int MAX_EVENTS_HISTORY = 50; public function __construct( private readonly EventActionHelper $eventActionHelper, @@ -50,7 +50,7 @@ public function __invoke(Request $request): Response } /** @var Talk $talk */ foreach ($this->talkRepository->getPreviousTalksBySpeaker($event, $speaker) as $talk) { - if (array_key_exists($talk->getForumId(), $previousEventTalkLists)) { + if (array_key_exists((string) $talk->getForumId(), $previousEventTalkLists)) { $previousEventTalkLists[$talk->getForumId()]->addTalk($talk); } } diff --git a/sources/AppBundle/Controller/Event/Speaker/SuggestionAction.php b/sources/AppBundle/Controller/Event/Speaker/SuggestionAction.php index c8b3cf78d..65520902b 100644 --- a/sources/AppBundle/Controller/Event/Speaker/SuggestionAction.php +++ b/sources/AppBundle/Controller/Event/Speaker/SuggestionAction.php @@ -62,7 +62,7 @@ public function __invoke(Request $request, string $eventSlug): Response private function createSpeakerSuggestion(Event $event, array $data): SpeakerSuggestion { - return (new SpeakerSuggestion()) + return new SpeakerSuggestion() ->setEventId($event->getId()) ->setSuggesterEmail($data['suggester_email']) ->setSuggesterName($data['suggester_name']) diff --git a/sources/AppBundle/Controller/Event/SponsorScan/ExportAction.php b/sources/AppBundle/Controller/Event/SponsorScan/ExportAction.php index fca7c8d3a..f6c7b19ed 100644 --- a/sources/AppBundle/Controller/Event/SponsorScan/ExportAction.php +++ b/sources/AppBundle/Controller/Event/SponsorScan/ExportAction.php @@ -39,7 +39,7 @@ public function __invoke(Request $request, string $eventSlug): Response $scans = $this->sponsorScanRepository->getBySponsorTicket($sponsorTicket); - $file->fputcsv(['Nom', 'Prénom', 'Email', 'Date']); + $file->fputcsv(['Nom', 'Prénom', 'Email', 'Date'], escape: '\\'); foreach ($scans as $scan) { $file->fputcsv([ @@ -47,7 +47,7 @@ public function __invoke(Request $request, string $eventSlug): Response $scan['prenom'], $scan['email'], $scan['created_on'], - ]); + ], escape: '\\'); } $response = new BinaryFileResponse($file); diff --git a/sources/AppBundle/Controller/Event/SponsorScan/FlashAction.php b/sources/AppBundle/Controller/Event/SponsorScan/FlashAction.php index 827155c74..4941a8b34 100644 --- a/sources/AppBundle/Controller/Event/SponsorScan/FlashAction.php +++ b/sources/AppBundle/Controller/Event/SponsorScan/FlashAction.php @@ -50,7 +50,7 @@ public function __invoke(Request $request, string $code, string $eventSlug): Red } if (!$scan instanceof SponsorScan) { - $scan = (new SponsorScan()) + $scan = new SponsorScan() ->setSponsorTicketId($sponsorTicket->getId()) ->setTicketId($ticket->getId()); } diff --git a/sources/AppBundle/Controller/Legacy/Forum2009Config.php b/sources/AppBundle/Controller/Legacy/Forum2009Config.php index b0d49b60c..340fe46b4 100644 --- a/sources/AppBundle/Controller/Legacy/Forum2009Config.php +++ b/sources/AppBundle/Controller/Legacy/Forum2009Config.php @@ -6,6 +6,6 @@ interface Forum2009Config { - public const ID = 4; - public const PROJECT_IDS = [353, 354, 355, 356, 357, 358, 359, 361, 362, 363, 364, 366]; + public const int ID = 4; + public const array PROJECT_IDS = [353, 354, 355, 356, 357, 358, 359, 361, 362, 363, 364, 366]; } diff --git a/sources/AppBundle/Controller/Website/Global/HomeAction.php b/sources/AppBundle/Controller/Website/Global/HomeAction.php index 3e9c7408c..476286ee7 100644 --- a/sources/AppBundle/Controller/Website/Global/HomeAction.php +++ b/sources/AppBundle/Controller/Website/Global/HomeAction.php @@ -22,7 +22,7 @@ final class HomeAction extends AbstractController { - public const MAX_MEETUPS = 10; + public const int MAX_MEETUPS = 10; public function __construct( private readonly ViewRenderer $view, diff --git a/sources/AppBundle/Controller/Website/Global/HtmlSitemapAction.php b/sources/AppBundle/Controller/Website/Global/HtmlSitemapAction.php index 31abf67ac..22bfe55dc 100644 --- a/sources/AppBundle/Controller/Website/Global/HtmlSitemapAction.php +++ b/sources/AppBundle/Controller/Website/Global/HtmlSitemapAction.php @@ -93,7 +93,7 @@ private function news(): array private function talks(): array { $talks = []; - $talkList = $this->talkRepository->getAllPastTalks((new \DateTime())->setTime(29, 59, 59)); + $talkList = $this->talkRepository->getAllPastTalks(new \DateTime()->setTime(29, 59, 59)); /** @var Talk $talk */ foreach ($talkList as $talk) { diff --git a/sources/AppBundle/Controller/Website/Member/IndexAction.php b/sources/AppBundle/Controller/Website/Member/IndexAction.php index e9a7087ca..7748875b5 100644 --- a/sources/AppBundle/Controller/Website/Member/IndexAction.php +++ b/sources/AppBundle/Controller/Website/Member/IndexAction.php @@ -18,7 +18,7 @@ final class IndexAction extends AbstractController { - public const DAYS_BEFORE_CALL_TO_UPDATE = 15; + public const int DAYS_BEFORE_CALL_TO_UPDATE = 15; public function __construct( private readonly ViewRenderer $view, @@ -55,7 +55,7 @@ public function __invoke(): Response if ($hasGeneralMeetingPlanned && null !== $latestDate - && ($latestDate->format('Y-m-d') === (new \DateTime('-1 day'))->format('Y-m-d')) + && ($latestDate->format('Y-m-d') === new \DateTime('-1 day')->format('Y-m-d')) && count($generalMeetingQuestionRepository->loadByDate($latestDate)) > 0 ) { $displayLinkToGeneralMeetingVote = true; diff --git a/sources/AppBundle/Controller/Website/Membership/CompanyAction.php b/sources/AppBundle/Controller/Website/Membership/CompanyAction.php index c583be2ca..2205f261e 100644 --- a/sources/AppBundle/Controller/Website/Membership/CompanyAction.php +++ b/sources/AppBundle/Controller/Website/Membership/CompanyAction.php @@ -33,7 +33,7 @@ public function __invoke(Request $request): Response { $data = new CompanyMember(); $data->setInvitations([ - (new CompanyMemberInvitation())->setManager(true), + new CompanyMemberInvitation()->setManager(true), ]); $subscribeForm = $this->createForm(CompanyMemberType::class, $data); diff --git a/sources/AppBundle/Controller/Website/Membership/Fee/IndexAction.php b/sources/AppBundle/Controller/Website/Membership/Fee/IndexAction.php index dcf795717..7e404f488 100644 --- a/sources/AppBundle/Controller/Website/Membership/Fee/IndexAction.php +++ b/sources/AppBundle/Controller/Website/Membership/Fee/IndexAction.php @@ -92,7 +92,7 @@ public function __invoke(): Response $formattedMontant = number_format($montant, 2, ',', ' '); $libelle = sprintf("%s : %s€", $prefixe, $formattedMontant); - $reference = (new MembershipFeeReferenceGenerator())->generate(new \DateTimeImmutable('now'), $type_personne, $id_personne, $user->getLastName()); + $reference = new MembershipFeeReferenceGenerator()->generate(new \DateTimeImmutable('now'), $type_personne, $id_personne, $user->getLastName()); $payboxBilling = new PayboxBilling($user->getFirstName(), $user->getLastName(), $user->getAddress(), $user->getZipCode(), $user->getCity(), $user->getCountry()); diff --git a/sources/AppBundle/Controller/Website/Membership/GeneralMeeting/IndexAction.php b/sources/AppBundle/Controller/Website/Membership/GeneralMeeting/IndexAction.php index a6c7c0b60..4aeb30d92 100644 --- a/sources/AppBundle/Controller/Website/Membership/GeneralMeeting/IndexAction.php +++ b/sources/AppBundle/Controller/Website/Membership/GeneralMeeting/IndexAction.php @@ -4,6 +4,7 @@ namespace AppBundle\Controller\Website\Membership\GeneralMeeting; +use Symfony\Component\Validator\Constraints\Callback; use Afup\Site\Droits; use AppBundle\Association\Model\GeneralMeetingVote; use AppBundle\Association\Model\Repository\GeneralMeetingQuestionRepository; @@ -20,7 +21,6 @@ use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\Validator\Constraints; use Symfony\Component\Validator\Context\ExecutionContextInterface; use Webmozart\Assert\Assert; @@ -72,7 +72,7 @@ public function __invoke(Request $request): Response $form = $this->createFormBuilder($data, [ 'constraints' => [ - new Constraints\Callback(callback: static function (array $data, ExecutionContextInterface $context): void { + new Callback(callback: static function (array $data, ExecutionContextInterface $context): void { if ($data['presence'] === 1 && $data['id_personne_avec_pouvoir']) { $context ->buildViolation("Vous ne pouvez pas donner votre pouvoir et indiquer que vous participez en même temps.") diff --git a/sources/AppBundle/Controller/Website/News/ListAction.php b/sources/AppBundle/Controller/Website/News/ListAction.php index 953276322..8047c071e 100644 --- a/sources/AppBundle/Controller/Website/News/ListAction.php +++ b/sources/AppBundle/Controller/Website/News/ListAction.php @@ -13,7 +13,7 @@ final class ListAction extends AbstractController { - public const ARTICLES_PER_PAGE = 5; + public const int ARTICLES_PER_PAGE = 5; public function __construct( private readonly ViewRenderer $view, diff --git a/sources/AppBundle/Controller/Website/PagerController.php b/sources/AppBundle/Controller/Website/PagerController.php index 59beb89a9..9ca7f2ad6 100644 --- a/sources/AppBundle/Controller/Website/PagerController.php +++ b/sources/AppBundle/Controller/Website/PagerController.php @@ -10,7 +10,7 @@ class PagerController extends AbstractController { - public const PAGER_LINKS_COUNT = 6; + public const int PAGER_LINKS_COUNT = 6; public function display(Request $request): Response { diff --git a/sources/AppBundle/Controller/Website/SecondaryMenuController.php b/sources/AppBundle/Controller/Website/SecondaryMenuController.php index e2a81cdc5..d26af7660 100644 --- a/sources/AppBundle/Controller/Website/SecondaryMenuController.php +++ b/sources/AppBundle/Controller/Website/SecondaryMenuController.php @@ -61,7 +61,7 @@ private function isActive(Request $masterRequest, Feuille $feuille): bool } if ($feuille->patterns) { - foreach (explode(PHP_EOL, (string) $feuille->patterns) as $pattern) { + foreach (explode(PHP_EOL, $feuille->patterns) as $pattern) { $pattern = trim($pattern); if ($pattern === '') { continue; diff --git a/sources/AppBundle/Doctrine/Type/UnixTimestampType.php b/sources/AppBundle/Doctrine/Type/UnixTimestampType.php index 8e4b4184e..101aa6bfe 100644 --- a/sources/AppBundle/Doctrine/Type/UnixTimestampType.php +++ b/sources/AppBundle/Doctrine/Type/UnixTimestampType.php @@ -10,13 +10,14 @@ class UnixTimestampType extends Type { - public const NAME = 'unix_timestamp'; + public const string NAME = 'unix_timestamp'; public function getSQLDeclaration(array $column, AbstractPlatform $platform): string { return $platform->getIntegerTypeDeclarationSQL($column); } + #[\Override] public function convertToPHPValue(mixed $value, AbstractPlatform $platform): ?\DateTime { if ($value === null) { @@ -29,6 +30,7 @@ public function convertToPHPValue(mixed $value, AbstractPlatform $platform): ?\D return $date; } + #[\Override] public function convertToDatabaseValue(mixed $value, AbstractPlatform $platform): ?int { if ($value === null) { diff --git a/sources/AppBundle/Email/Emails.php b/sources/AppBundle/Email/Emails.php index c778cb86a..eb591fb34 100644 --- a/sources/AppBundle/Email/Emails.php +++ b/sources/AppBundle/Email/Emails.php @@ -58,7 +58,7 @@ private function getAttachementIcsInscription(Event $event, MailUser $recipient) $organizerCN = MailUserFactory::afup()->getName(); $attendeeCN = $recipient->getName(); $attendeeEmail = $recipient->getEmail(); - $created = (new \DateTime())->setTimezone(new \DateTimeZone('UTC'))->format('Ymd\THis\Z'); + $created = new \DateTime()->setTimezone(new \DateTimeZone('UTC'))->format('Ymd\THis\Z'); $dtStart = $event->getDateStart()->format('Ymd'); $dtEnd = $event->getDateEnd()->add(new \DateInterval('P1D'))->format('Ymd'); diff --git a/sources/AppBundle/Email/Mailer/Adapter/SymfonyMailerAdapter.php b/sources/AppBundle/Email/Mailer/Adapter/SymfonyMailerAdapter.php index 61688757a..de5c1e437 100644 --- a/sources/AppBundle/Email/Mailer/Adapter/SymfonyMailerAdapter.php +++ b/sources/AppBundle/Email/Mailer/Adapter/SymfonyMailerAdapter.php @@ -22,7 +22,7 @@ public function send(Message $message): void throw new UnexpectedValueException('Trying to send a mail with no sender'); } - $email = (new Email()) + $email = new Email() ->from(new Address($from->getEmail(), $from->getName())) ->subject($message->getSubject()); diff --git a/sources/AppBundle/Email/Mailer/MailUser.php b/sources/AppBundle/Email/Mailer/MailUser.php index e064e4dfa..bc35d3b88 100644 --- a/sources/AppBundle/Email/Mailer/MailUser.php +++ b/sources/AppBundle/Email/Mailer/MailUser.php @@ -6,8 +6,8 @@ class MailUser { - public const DEFAULT_SENDER_NAME = 'Bureau AFUP'; - public const DEFAULT_SENDER_EMAIL = 'bureau@afup.org'; + public const string DEFAULT_SENDER_NAME = 'Bureau AFUP'; + public const string DEFAULT_SENDER_EMAIL = 'bureau@afup.org'; /** * @param string $email diff --git a/sources/AppBundle/Event/Form/EventCompareSelectType.php b/sources/AppBundle/Event/Form/EventCompareSelectType.php index 87c7ce418..6d0fa395a 100644 --- a/sources/AppBundle/Event/Form/EventCompareSelectType.php +++ b/sources/AppBundle/Event/Form/EventCompareSelectType.php @@ -56,6 +56,7 @@ public function configureOptions(OptionsResolver $resolver): void $resolver->setAllowedTypes('events', [Collection::class]); } + #[\Override] public function getBlockPrefix(): string { return ''; diff --git a/sources/AppBundle/Event/Form/EventSelectType.php b/sources/AppBundle/Event/Form/EventSelectType.php index 89d9fef7b..6e0c57d4d 100644 --- a/sources/AppBundle/Event/Form/EventSelectType.php +++ b/sources/AppBundle/Event/Form/EventSelectType.php @@ -33,7 +33,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'choices' => $this->eventHelper->sortEventsByStartDate( iterator_to_array($this->eventRepository->getAllActive()), ), - 'group_by' => fn(Event $choice): string => $this->eventHelper->groupByYear($choice), + 'group_by' => $this->eventHelper->groupByYear(...), ], ) ->setMethod(Request::METHOD_GET) diff --git a/sources/AppBundle/Event/Form/PurchaseType.php b/sources/AppBundle/Event/Form/PurchaseType.php index 0a51d9365..3f6b3e263 100644 --- a/sources/AppBundle/Event/Form/PurchaseType.php +++ b/sources/AppBundle/Event/Form/PurchaseType.php @@ -23,7 +23,7 @@ class PurchaseType extends AbstractType { - public const MAX_NB_PERSONNES = 15; + public const int MAX_NB_PERSONNES = 15; public function __construct( private readonly Pays $country, diff --git a/sources/AppBundle/Event/Form/SpeakerType.php b/sources/AppBundle/Event/Form/SpeakerType.php index e5fcd285f..ea4acce3c 100644 --- a/sources/AppBundle/Event/Form/SpeakerType.php +++ b/sources/AppBundle/Event/Form/SpeakerType.php @@ -27,8 +27,8 @@ class SpeakerType extends AbstractType { - public const OPT_PHOTO_REQUIRED = 'photo_required'; - public const OPT_USER_GITHUB = 'user_github'; + public const string OPT_PHOTO_REQUIRED = 'photo_required'; + public const string OPT_USER_GITHUB = 'user_github'; public function __construct( private readonly GithubUserRepository $githubUserRepository, diff --git a/sources/AppBundle/Event/Form/Support/EventHelper.php b/sources/AppBundle/Event/Form/Support/EventHelper.php index f5daa21fc..913db27ae 100644 --- a/sources/AppBundle/Event/Form/Support/EventHelper.php +++ b/sources/AppBundle/Event/Form/Support/EventHelper.php @@ -8,16 +8,13 @@ final class EventHelper { - /** - * @param Event|string $event - */ - public function groupByYear($event): string + public function groupByYear(string|Event $event): string { if ($event instanceof Event) { $start = $event->getDateStart(); if ($start !== null) { - return $start->format('Y'); + return 'Année ' . $start->format('Y'); } $title = $event->getTitle(); @@ -26,7 +23,7 @@ public function groupByYear($event): string } if ($title !== null && preg_match('/\d{4}/', $title, $matches)) { - return $matches[0]; + return 'Année ' . $matches[0]; } return 'Année inconnue'; diff --git a/sources/AppBundle/Event/Form/TalkAdminType.php b/sources/AppBundle/Event/Form/TalkAdminType.php index cedf80916..9d13e355f 100644 --- a/sources/AppBundle/Event/Form/TalkAdminType.php +++ b/sources/AppBundle/Event/Form/TalkAdminType.php @@ -21,6 +21,7 @@ class TalkAdminType extends TalkType { public function __construct(private readonly SpeakerRepository $speakerRepository) {} + #[\Override] public function buildForm(FormBuilderInterface $builder, array $options): void { parent::buildForm($builder, $options); @@ -94,8 +95,8 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'choices' => $allSpeakers, 'required' => false, 'data' => $speakers, - 'choice_label' => fn(Speaker $speaker) => $speaker->getLabel(), - 'choice_value' => fn(?Speaker $speaker) => $speaker?->getId(), + 'choice_label' => fn(Speaker $speaker): string => $speaker->getLabel(), + 'choice_value' => fn(?Speaker $speaker): ?int => $speaker?->getId(), 'choice_name' => 'id', ]) ->add('verbatim', TextareaType::class, [ @@ -110,6 +111,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void ; } + #[\Override] public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefault('data_class', Talk::class); diff --git a/sources/AppBundle/Event/Form/TalkType.php b/sources/AppBundle/Event/Form/TalkType.php index 5bd7889ee..d25138547 100644 --- a/sources/AppBundle/Event/Form/TalkType.php +++ b/sources/AppBundle/Event/Form/TalkType.php @@ -15,9 +15,9 @@ class TalkType extends AbstractType { - public const OPT_COC_CHECKED = 'codeOfConductChecked'; - public const OPT_SELECTION_ACKNOWLEDGEMENT_CHECKED = 'selectionAcknowledgementChecked'; - public const IS_AFUP_DAY = 'isAfupDay'; + public const string OPT_COC_CHECKED = 'codeOfConductChecked'; + public const string OPT_SELECTION_ACKNOWLEDGEMENT_CHECKED = 'selectionAcknowledgementChecked'; + public const string IS_AFUP_DAY = 'isAfupDay'; public function buildForm(FormBuilderInterface $builder, array $options): void { diff --git a/sources/AppBundle/Event/Form/TicketAdminType.php b/sources/AppBundle/Event/Form/TicketAdminType.php index afd1eab83..2a83f9ecd 100644 --- a/sources/AppBundle/Event/Form/TicketAdminType.php +++ b/sources/AppBundle/Event/Form/TicketAdminType.php @@ -41,7 +41,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void $event = $options['event']; $ticketOffers = $options['offers']; - usort($ticketOffers, static fn(TicketOffer $a, TicketOffer $b) => $a->name > $b->name ? 1 : -1); + usort($ticketOffers, static fn(TicketOffer $a, TicketOffer $b): int => $a->name > $b->name ? 1 : -1); $builder ->add('civility', ChoiceType::class, [ @@ -82,9 +82,9 @@ public function buildForm(FormBuilderInterface $builder, array $options): void ->add('ticketTypeId', ChoiceType::class, [ 'label' => 'Formule', 'choices' => $ticketOffers, - 'choice_label' => fn(TicketOffer $offer) => sprintf('%s - [%d €]', $offer->name, $offer->price), - 'choice_value' => fn(?TicketOffer $offer) => $offer->ticketTypeId ?? null, - 'group_by' => fn(TicketOffer $choice) => $choice->event ? 'Offre de l\'évènement' : 'Offre global', + 'choice_label' => fn(TicketOffer $offer): string => sprintf('%s - [%d €]', $offer->name, $offer->price), + 'choice_value' => fn(?TicketOffer $offer): ?int => $offer->ticketTypeId ?? null, + 'group_by' => fn(TicketOffer $choice): string => $choice->event ? 'Offre de l\'évènement' : 'Offre global', ]) ->add('status', ChoiceType::class, [ 'label' => "État de l'inscription", diff --git a/sources/AppBundle/Event/Form/TicketType.php b/sources/AppBundle/Event/Form/TicketType.php index cd16e2eca..6709e1bc7 100644 --- a/sources/AppBundle/Event/Form/TicketType.php +++ b/sources/AppBundle/Event/Form/TicketType.php @@ -25,9 +25,9 @@ class TicketType extends AbstractType { - public const MEMBER_NOT = 0; - public const MEMBER_PERSONAL = 1; - public const MEMBER_CORPORATE = 2; + public const int MEMBER_NOT = 0; + public const int MEMBER_PERSONAL = 1; + public const int MEMBER_CORPORATE = 2; public function __construct( private readonly EventRepository $eventRepository, diff --git a/sources/AppBundle/Event/Model/Repository/EventRepository.php b/sources/AppBundle/Event/Model/Repository/EventRepository.php index 2a4252bae..2a5aec491 100644 --- a/sources/AppBundle/Event/Model/Repository/EventRepository.php +++ b/sources/AppBundle/Event/Model/Repository/EventRepository.php @@ -25,11 +25,9 @@ class EventRepository extends Repository implements MetadataInitializer { /** - * @deprecated TODO: à remplacer par getNextEvents de partout - * * @return Event|null */ - public function getNextEvent() + public function getNextEvent(): ?Event { $events = $this->getNextEvents(); if ($events === null || $events->count() === 0) { @@ -41,7 +39,7 @@ public function getNextEvent() /** * @return CollectionInterface|null */ - public function getNextEvents() + public function getNextEvents(): ?CollectionInterface { $query = $this ->getQuery('SELECT id, path, titre, text, date_debut, date_fin, date_debut_appel_conferencier, date_fin_appel_conferencier, date_fin_vente, nb_places FROM afup_forum WHERE date_debut > NOW() ORDER BY date_debut') @@ -145,7 +143,7 @@ public function getList($id = null): array $data = []; foreach ($results as $result) { - $result['est_supprimable'] = !array_key_exists($result['id'], $sessions) && !array_key_exists($result['id'], $inscriptions); + $result['est_supprimable'] = !array_key_exists((string) $result['id'], $sessions) && !array_key_exists((string) $result['id'], $inscriptions); $data[] = $result; } diff --git a/sources/AppBundle/Event/Model/Repository/EventStatsRepository.php b/sources/AppBundle/Event/Model/Repository/EventStatsRepository.php index 50e190759..36b5ff032 100644 --- a/sources/AppBundle/Event/Model/Repository/EventStatsRepository.php +++ b/sources/AppBundle/Event/Model/Repository/EventStatsRepository.php @@ -17,9 +17,9 @@ class EventStatsRepository { - private const DAY_ONE = 'one'; - private const DAY_TWO = 'two'; - private const DAYS = [self::DAY_ONE, self::DAY_TWO]; + private const string DAY_ONE = 'one'; + private const string DAY_TWO = 'two'; + private const array DAYS = [self::DAY_ONE, self::DAY_TWO]; public function __construct( private readonly Connection $connection, diff --git a/sources/AppBundle/Event/Model/Repository/TicketEventTypeRepository.php b/sources/AppBundle/Event/Model/Repository/TicketEventTypeRepository.php index e3b14bf7f..f711bc6a2 100644 --- a/sources/AppBundle/Event/Model/Repository/TicketEventTypeRepository.php +++ b/sources/AppBundle/Event/Model/Repository/TicketEventTypeRepository.php @@ -19,9 +19,9 @@ */ class TicketEventTypeRepository extends Repository implements MetadataInitializer { - public const REMOVE_PAST_TICKETS = 1; - public const REMOVE_FUTURE_TICKETS = 2; - public const ACTUAL_TICKETS_ONLY = 3; // Combination of REMOVE_PAST_TICKETS and REMOVE_FUTURE_TICKETS + public const int REMOVE_PAST_TICKETS = 1; + public const int REMOVE_FUTURE_TICKETS = 2; + public const int ACTUAL_TICKETS_ONLY = 3; // Combination of REMOVE_PAST_TICKETS and REMOVE_FUTURE_TICKETS /** * @param bool $publicOnly * @param null|int $datesFilter can be one of self::REMOVE_PAST_TICKETS, self::REMOVE_FUTURE_TICKETS. self::ACTUAL_TICKETS == self::REMOVE_PAST_TICKETS | self::REMOVE_FUTURE_TICKETS. Default value is ACTUAL_TICKETS @@ -59,7 +59,7 @@ public function getTicketsByEvent(Event $event, $publicOnly = true, $datesFilter return $query->query( $this->getCollection( - (new HydratorSingleObject())->mapObjectTo('tarif', 'tarif_event', 'setTicketType'), + new HydratorSingleObject()->mapObjectTo('tarif', 'tarif_event', 'setTicketType'), ), ); } diff --git a/sources/AppBundle/Event/Model/Repository/TicketRepository.php b/sources/AppBundle/Event/Model/Repository/TicketRepository.php index d0b6e1da0..8fec0dfa5 100644 --- a/sources/AppBundle/Event/Model/Repository/TicketRepository.php +++ b/sources/AppBundle/Event/Model/Repository/TicketRepository.php @@ -107,7 +107,7 @@ public function getByInvoiceWithDetail(Invoice $invoice) ', )->setParams(['ref' => $invoice->getReference()])->query( $this->getCollection( - (new HydratorSingleObject()) + new HydratorSingleObject() ->mapObjectTo('tarif', 'tarif_event', 'setTicketType') ->mapObjectTo('tarif_event', 'inscriptions', 'setTicketEventType'), ), diff --git a/sources/AppBundle/Event/Model/Repository/UserBadgeRepository.php b/sources/AppBundle/Event/Model/Repository/UserBadgeRepository.php index 02fac965d..56a194e93 100644 --- a/sources/AppBundle/Event/Model/Repository/UserBadgeRepository.php +++ b/sources/AppBundle/Event/Model/Repository/UserBadgeRepository.php @@ -35,7 +35,7 @@ public function findByUserId($userId) private function getHydratorForUserBadge() { - return (new HydratorSingleObject()) + return new HydratorSingleObject() ->mapObjectTo('afup_badge', 'afup_personnes_physiques_badge', 'setBadge') ; } diff --git a/sources/AppBundle/Event/Model/Speaker.php b/sources/AppBundle/Event/Model/Speaker.php index d686aefbf..528535895 100644 --- a/sources/AppBundle/Event/Model/Speaker.php +++ b/sources/AppBundle/Event/Model/Speaker.php @@ -15,11 +15,11 @@ class Speaker implements NotifyPropertyInterface { use NotifyProperty; - public const NIGHT_BEFORE = 'before'; - public const NIGHT_BETWEEN = 'between'; - public const NIGHT_AFTER = 'after'; + public const string NIGHT_BEFORE = 'before'; + public const string NIGHT_BETWEEN = 'between'; + public const string NIGHT_AFTER = 'after'; - private const LINKEDIN_URL_PREFIX = "https://www.linkedin.com/in/"; + private const string LINKEDIN_URL_PREFIX = "https://www.linkedin.com/in/"; private ?int $id = null; diff --git a/sources/AppBundle/Event/Model/Talk.php b/sources/AppBundle/Event/Model/Talk.php index 49ae8b264..dde1ffd86 100644 --- a/sources/AppBundle/Event/Model/Talk.php +++ b/sources/AppBundle/Event/Model/Talk.php @@ -13,22 +13,22 @@ class Talk implements NotifyPropertyInterface { use NotifyProperty; - public const TYPE_FULL_LONG = 1; - public const TYPE_FULL_SHORT = 3; - public const TYPE_WORKSHOP = 2; - public const TYPE_KEYNOTE = 4; - public const TYPE_LIGHTNING_TALK = 5; - public const TYPE_CLINIC = 6; - public const TYPE_PHP_PROJECT = 9; - public const TYPE_SPEAKER_INTRODUCTIONS = 7; - - public const SKILL_JUNIOR = 1; - public const SKILL_MEDIOR = 2; - public const SKILL_SENIOR = 3; - public const SKILL_NA = 0; - - public const LANGUAGE_CODE_FR = 'fr'; - public const LANGUAGE_CODE_EN = 'en'; + public const int TYPE_FULL_LONG = 1; + public const int TYPE_FULL_SHORT = 3; + public const int TYPE_WORKSHOP = 2; + public const int TYPE_KEYNOTE = 4; + public const int TYPE_LIGHTNING_TALK = 5; + public const int TYPE_CLINIC = 6; + public const int TYPE_PHP_PROJECT = 9; + public const int TYPE_SPEAKER_INTRODUCTIONS = 7; + + public const int SKILL_JUNIOR = 1; + public const int SKILL_MEDIOR = 2; + public const int SKILL_SENIOR = 3; + public const int SKILL_NA = 0; + + public const string LANGUAGE_CODE_FR = 'fr'; + public const string LANGUAGE_CODE_EN = 'en'; private ?int $id = null; diff --git a/sources/AppBundle/Event/Model/TalkInvitation.php b/sources/AppBundle/Event/Model/TalkInvitation.php index 26d5fcadc..1df4741c5 100644 --- a/sources/AppBundle/Event/Model/TalkInvitation.php +++ b/sources/AppBundle/Event/Model/TalkInvitation.php @@ -12,8 +12,8 @@ class TalkInvitation implements NotifyPropertyInterface { use NotifyProperty; - public const STATE_PENDING = 0; - public const STATE_ACCEPTED = 1; + public const int STATE_PENDING = 0; + public const int STATE_ACCEPTED = 1; /** * @var int diff --git a/sources/AppBundle/Event/Model/Ticket.php b/sources/AppBundle/Event/Model/Ticket.php index 30ef3995d..d937c9223 100644 --- a/sources/AppBundle/Event/Model/Ticket.php +++ b/sources/AppBundle/Event/Model/Ticket.php @@ -15,7 +15,7 @@ class Ticket implements NotifyPropertyInterface { use NotifyProperty; - public const TRANSPORT_MODES = [ + public const array TRANSPORT_MODES = [ AFUP_TRANSPORT_MODE_SEUL_THERMIQUE => 'Voiture seul·e', AFUP_TRANSPORT_MODE_SEUL_ELECTRIQUE => 'Voiture seul·e électrique', AFUP_TRANSPORT_MODE_SEUL_HYBRIDE => 'Voiture seul·e hybride', @@ -29,7 +29,7 @@ class Ticket implements NotifyPropertyInterface AFUP_TRANSPORT_MODE_COMMUN => 'Transports en commun', ]; - public const TRANSPORT_DISTANCES = [ + public const array TRANSPORT_DISTANCES = [ AFUP_TRANSPORT_DISTANCE_0 => '< 25 km', AFUP_TRANSPORT_DISTANCE_25_50 => 'entre 25 et 50 km', AFUP_TRANSPORT_DISTANCE_50_100 => 'entre 50 et 100 km', @@ -38,33 +38,33 @@ class Ticket implements NotifyPropertyInterface AFUP_TRANSPORT_DISTANCE_1000 => '> 1000 km', ]; - public const STATUS_CREATED = 0; - public const STATUS_CANCELLED = 1; - public const STATUS_ERROR = 2; - public const STATUS_DECLINED = 3; - public const STATUS_PAID = 4; - public const STATUS_GUEST = 5; - public const STATUS_WAITING = 6; - public const STATUS_CONFIRMED = 7; - public const STATUS_PAID_AFTER = 8; - - public const INVOICE_TODO = 0; - public const INVOICE_SENT = 1; - public const INVOICE_RECEIVED = 2; - - public const TYPE_ORGANIZATION = 9; - public const TYPE_SPONSOR = 10; - public const TYPE_PRESS = 11; - public const TYPE_SPEAKER = 12; - public const TYPE_SPECIAL_PRICE = 108; - - public const PAYMENT_CREDIT_CARD = 0; - public const PAYMENT_CHEQUE = 1; - public const PAYMENT_BANKWIRE = 2; - public const PAYMENT_NONE = 3; - - public const DAY_ONE = 'one'; - public const DAY_TWO = 'two'; + public const int STATUS_CREATED = 0; + public const int STATUS_CANCELLED = 1; + public const int STATUS_ERROR = 2; + public const int STATUS_DECLINED = 3; + public const int STATUS_PAID = 4; + public const int STATUS_GUEST = 5; + public const int STATUS_WAITING = 6; + public const int STATUS_CONFIRMED = 7; + public const int STATUS_PAID_AFTER = 8; + + public const int INVOICE_TODO = 0; + public const int INVOICE_SENT = 1; + public const int INVOICE_RECEIVED = 2; + + public const int TYPE_ORGANIZATION = 9; + public const int TYPE_SPONSOR = 10; + public const int TYPE_PRESS = 11; + public const int TYPE_SPEAKER = 12; + public const int TYPE_SPECIAL_PRICE = 108; + + public const int PAYMENT_CREDIT_CARD = 0; + public const int PAYMENT_CHEQUE = 1; + public const int PAYMENT_BANKWIRE = 2; + public const int PAYMENT_NONE = 3; + + public const string DAY_ONE = 'one'; + public const string DAY_TWO = 'two'; private ?int $id = null; diff --git a/sources/AppBundle/Event/Model/TicketType.php b/sources/AppBundle/Event/Model/TicketType.php index 26287d740..970fa9642 100644 --- a/sources/AppBundle/Event/Model/TicketType.php +++ b/sources/AppBundle/Event/Model/TicketType.php @@ -11,8 +11,8 @@ class TicketType implements NotifyPropertyInterface { use NotifyProperty; - public const SPECIAL_PRICE_TECHNICAL_NAME = 'SPECIAL_PRICE'; - public const EARLY_BIRD_TECHNICAL_NAME = ['EARLY_BIRD', 'EARLY_BIRD_AFUP', 'AFUP_DAY_EARLY']; + public const string SPECIAL_PRICE_TECHNICAL_NAME = 'SPECIAL_PRICE'; + public const array EARLY_BIRD_TECHNICAL_NAME = ['EARLY_BIRD', 'EARLY_BIRD_AFUP', 'AFUP_DAY_EARLY']; /** * @var int diff --git a/sources/AppBundle/Event/Speaker/ExportGenerator.php b/sources/AppBundle/Event/Speaker/ExportGenerator.php index f8ca5589c..4602089a6 100644 --- a/sources/AppBundle/Event/Speaker/ExportGenerator.php +++ b/sources/AppBundle/Event/Speaker/ExportGenerator.php @@ -36,7 +36,7 @@ public function export(Event $event, \SplFileObject $toFile): void 'commentaire', ]; - $toFile->fputcsv($columns); + $toFile->fputcsv($columns, escape: '\\'); foreach ($this->getFromRegistrationsOnEvent($event) as $row) { $preparedRow = []; @@ -46,7 +46,7 @@ public function export(Event $event, \SplFileObject $toFile): void } $preparedRow[] = $row[$column]; } - $toFile->fputcsv($preparedRow); + $toFile->fputcsv($preparedRow, escape: '\\'); } } diff --git a/sources/AppBundle/Event/Talk/ExportGenerator.php b/sources/AppBundle/Event/Talk/ExportGenerator.php index c28ca65a2..472d3ebf2 100644 --- a/sources/AppBundle/Event/Talk/ExportGenerator.php +++ b/sources/AppBundle/Event/Talk/ExportGenerator.php @@ -35,7 +35,7 @@ public function export(Event $event, \SplFileObject $toFile): void 'youtube_id', ]; - $toFile->fputcsv($columns); + $toFile->fputcsv($columns, escape: '\\'); foreach ($this->getFromRegistrationsOnEvent($event) as $row) { $preparedRow = []; @@ -45,7 +45,7 @@ public function export(Event $event, \SplFileObject $toFile): void } $preparedRow[] = $row[$column]; } - $toFile->fputcsv($preparedRow); + $toFile->fputcsv($preparedRow, escape: '\\'); } } @@ -54,7 +54,7 @@ public function exportJoindIn(Event $event, \SplFileObject $toFile): void // Récupération des données $talkAggregates = $this->talkRepository->getByEventWithSpeakers($event); - $toFile->fputcsv(['Title','Description','Speaker','Date','Time','Type']); + $toFile->fputcsv(['Title','Description','Speaker','Date','Time','Type'], escape: '\\'); foreach ($talkAggregates as $talkAggregate) { @@ -88,7 +88,7 @@ public function exportJoindIn(Event $event, \SplFileObject $toFile): void $talkAggregate->planning?->getStart()?->format('Y-m-d'), $talkAggregate->planning?->getStart()?->format('H:i'), $type, - ]); + ], escape: '\\'); } } diff --git a/sources/AppBundle/Event/Ticket/RegistrationsExportGenerator.php b/sources/AppBundle/Event/Ticket/RegistrationsExportGenerator.php index f1af1a5e9..149e6081c 100644 --- a/sources/AppBundle/Event/Ticket/RegistrationsExportGenerator.php +++ b/sources/AppBundle/Event/Ticket/RegistrationsExportGenerator.php @@ -41,7 +41,7 @@ public function export(Event $event, \SplFileObject $toFile): void 'office', ]; - $toFile->fputcsv($columns); + $toFile->fputcsv($columns, escape: '\\'); foreach ($this->getFromRegistrationsOnEvent($event) as $row) { $preparedRow = []; @@ -51,7 +51,7 @@ public function export(Event $event, \SplFileObject $toFile): void } $preparedRow[] = $row[$column]; } - $toFile->fputcsv($preparedRow); + $toFile->fputcsv($preparedRow, escape: '\\'); } } diff --git a/sources/AppBundle/Event/Ticket/TicketTypeAvailability.php b/sources/AppBundle/Event/Ticket/TicketTypeAvailability.php index 2f5762375..8b80b7469 100644 --- a/sources/AppBundle/Event/Ticket/TicketTypeAvailability.php +++ b/sources/AppBundle/Event/Ticket/TicketTypeAvailability.php @@ -11,9 +11,9 @@ class TicketTypeAvailability { - public const DAY_ONE = 'one'; - public const DAY_TWO = 'two'; - public const DAY_BOTH = 'both'; + public const string DAY_ONE = 'one'; + public const string DAY_TWO = 'two'; + public const string DAY_BOTH = 'both'; public function __construct(private readonly TicketRepository $ticketRepository) {} diff --git a/sources/AppBundle/Event/Validator/Constraints/AvailableTicket.php b/sources/AppBundle/Event/Validator/Constraints/AvailableTicket.php index 3bdabce39..7c2fd4e74 100644 --- a/sources/AppBundle/Event/Validator/Constraints/AvailableTicket.php +++ b/sources/AppBundle/Event/Validator/Constraints/AvailableTicket.php @@ -11,6 +11,7 @@ class AvailableTicket extends Constraint { public string $message = 'This ticket is not available anymore.'; + #[\Override] public function getTargets(): string { return self::CLASS_CONSTRAINT; diff --git a/sources/AppBundle/Event/Validator/Constraints/CorporateMember.php b/sources/AppBundle/Event/Validator/Constraints/CorporateMember.php index ab8749358..f7d0ef1d1 100644 --- a/sources/AppBundle/Event/Validator/Constraints/CorporateMember.php +++ b/sources/AppBundle/Event/Validator/Constraints/CorporateMember.php @@ -13,6 +13,7 @@ class CorporateMember extends Constraint public string $messageFeeOutOfDate = 'You must have paid your membership fee to order this ticket.'; public string $messageTooMuchRestrictedTickets = 'You cannot order as many tickets at the discounted rate.'; + #[\Override] public function getTargets(): string { return self::PROPERTY_CONSTRAINT; diff --git a/sources/AppBundle/Event/Validator/Constraints/EarlyBirdTicket.php b/sources/AppBundle/Event/Validator/Constraints/EarlyBirdTicket.php index a0ba0185d..c1d84cb39 100644 --- a/sources/AppBundle/Event/Validator/Constraints/EarlyBirdTicket.php +++ b/sources/AppBundle/Event/Validator/Constraints/EarlyBirdTicket.php @@ -11,6 +11,7 @@ class EarlyBirdTicket extends Constraint { public string $message = 'You can only order one early bird ticket "{{ ticket_pretty_name }}".'; + #[\Override] public function getTargets(): string { return self::PROPERTY_CONSTRAINT; diff --git a/sources/AppBundle/Event/Validator/Constraints/LoggedInMember.php b/sources/AppBundle/Event/Validator/Constraints/LoggedInMember.php index 99f80bec1..0b42f20b2 100644 --- a/sources/AppBundle/Event/Validator/Constraints/LoggedInMember.php +++ b/sources/AppBundle/Event/Validator/Constraints/LoggedInMember.php @@ -13,6 +13,7 @@ class LoggedInMember extends Constraint public string $messageBadMail = 'You must use the same email for your ticket and you membership.'; public string $messageFeeOutOfDate = 'You must have paid your membership fee to order this ticket.'; + #[\Override] public function getTargets(): string { return self::CLASS_CONSTRAINT; diff --git a/sources/AppBundle/Event/Validator/Constraints/PublicTicket.php b/sources/AppBundle/Event/Validator/Constraints/PublicTicket.php index c49598c94..c9df47a40 100644 --- a/sources/AppBundle/Event/Validator/Constraints/PublicTicket.php +++ b/sources/AppBundle/Event/Validator/Constraints/PublicTicket.php @@ -11,6 +11,7 @@ class PublicTicket extends Constraint { public string $messageNotLoggedIn = 'You must be connected with a valid membership to order this ticket.'; + #[\Override] public function getTargets(): string { return self::CLASS_CONSTRAINT; diff --git a/sources/AppBundle/Event/Validator/Constraints/TicketsCfpSubmitter.php b/sources/AppBundle/Event/Validator/Constraints/TicketsCfpSubmitter.php index 26591664a..bc9d297ec 100644 --- a/sources/AppBundle/Event/Validator/Constraints/TicketsCfpSubmitter.php +++ b/sources/AppBundle/Event/Validator/Constraints/TicketsCfpSubmitter.php @@ -11,6 +11,7 @@ class TicketsCfpSubmitter extends Constraint { public string $messageTooMuchCfpSubmitterTickets = 'You can only order one ticket "{{ ticket_pretty_name }}".'; + #[\Override] public function getTargets(): string { return self::PROPERTY_CONSTRAINT; diff --git a/sources/AppBundle/Form/BooleanType.php b/sources/AppBundle/Form/BooleanType.php index 1aca9409d..a26043807 100644 --- a/sources/AppBundle/Form/BooleanType.php +++ b/sources/AppBundle/Form/BooleanType.php @@ -22,6 +22,7 @@ public function configureOptions(OptionsResolver $resolver): void ]); } + #[\Override] public function getParent(): string { return ChoiceType::class; diff --git a/sources/AppBundle/GeneralMeeting/GeneralMeetingRepository.php b/sources/AppBundle/GeneralMeeting/GeneralMeetingRepository.php index f738cb93d..430014144 100644 --- a/sources/AppBundle/GeneralMeeting/GeneralMeetingRepository.php +++ b/sources/AppBundle/GeneralMeeting/GeneralMeetingRepository.php @@ -318,7 +318,7 @@ public function addAttendee($personId, DateTimeInterface $date, $presence, $powe $query->bindValue('date', $date->getTimestamp()); $query->bindValue('presence', $presence); $query->bindValue('powerId', $powerId); - $query->bindValue('modificationDate', (new DateTimeImmutable())->getTimestamp()); + $query->bindValue('modificationDate', new DateTimeImmutable()->getTimestamp()); return $query->executeStatement() > 0; } @@ -346,7 +346,7 @@ public function editAttendee($login, DateTimeInterface $date, $presence, $powerI $query->bindValue('date', $date->getTimestamp()); $query->bindValue('presence', $presence); $query->bindValue('powerId', $powerId); - $query->bindValue('modificationDate', (new DateTimeImmutable())->getTimestamp()); + $query->bindValue('modificationDate', new DateTimeImmutable()->getTimestamp()); return $query->executeStatement() > 0; } diff --git a/sources/AppBundle/GeneralMeeting/ReportListBuilder.php b/sources/AppBundle/GeneralMeeting/ReportListBuilder.php index 8fcd9b363..9aed1ae3c 100644 --- a/sources/AppBundle/GeneralMeeting/ReportListBuilder.php +++ b/sources/AppBundle/GeneralMeeting/ReportListBuilder.php @@ -23,7 +23,7 @@ public function prepareGeneralMeetingsReportsList(): array return []; } - $files = (new Finder())->name("*.pdf")->in($this->storageDir); + $files = new Finder()->name("*.pdf")->in($this->storageDir); $reports = []; foreach ($files as $file) { diff --git a/sources/AppBundle/Indexation/Meetups/MeetupClient.php b/sources/AppBundle/Indexation/Meetups/MeetupClient.php index 33ae2b076..3382f430f 100644 --- a/sources/AppBundle/Indexation/Meetups/MeetupClient.php +++ b/sources/AppBundle/Indexation/Meetups/MeetupClient.php @@ -13,8 +13,8 @@ final readonly class MeetupClient { - private const QUANTITY_PAST_EVENTS = 2; - private const QUANTITY_UPCOMING_EVENTS = 10; + private const int QUANTITY_PAST_EVENTS = 2; + private const int QUANTITY_UPCOMING_EVENTS = 10; public function __construct( private HttpClientInterface $httpClient, diff --git a/sources/AppBundle/Indexation/Meetups/Transformer.php b/sources/AppBundle/Indexation/Meetups/Transformer.php index cb96aacf8..942aebcf9 100644 --- a/sources/AppBundle/Indexation/Meetups/Transformer.php +++ b/sources/AppBundle/Indexation/Meetups/Transformer.php @@ -10,7 +10,7 @@ class Transformer { - public const MEETUP_URL = 'https://www.meetup.com/fr-FR/'; + public const string MEETUP_URL = 'https://www.meetup.com/fr-FR/'; public function __construct(private readonly AntenneRepository $antennesCollection) {} diff --git a/sources/AppBundle/Listener/DetectClockMockingListener.php b/sources/AppBundle/Listener/DetectClockMockingListener.php index 715719714..07c2bc615 100644 --- a/sources/AppBundle/Listener/DetectClockMockingListener.php +++ b/sources/AppBundle/Listener/DetectClockMockingListener.php @@ -25,7 +25,7 @@ public function __invoke(RequestEvent $event): void return; } - $currentDateMock = (new TimeMocker())->getCurrentDateMock(); + $currentDateMock = new TimeMocker()->getCurrentDateMock(); if ($currentDateMock === null) { return; } diff --git a/sources/AppBundle/Mailchimp/Mailchimp.php b/sources/AppBundle/Mailchimp/Mailchimp.php index 26ac1ce01..48abe8487 100644 --- a/sources/AppBundle/Mailchimp/Mailchimp.php +++ b/sources/AppBundle/Mailchimp/Mailchimp.php @@ -8,7 +8,7 @@ class Mailchimp { - private const MAX_MEMBERS_PER_PAGE = 50; + private const int MAX_MEMBERS_PER_PAGE = 50; public function __construct(private readonly DrewMailChimp $client) {} diff --git a/sources/AppBundle/Mailchimp/MailchimpMembersAutoListSynchronizer.php b/sources/AppBundle/Mailchimp/MailchimpMembersAutoListSynchronizer.php index a0e1c6fbf..babed521a 100644 --- a/sources/AppBundle/Mailchimp/MailchimpMembersAutoListSynchronizer.php +++ b/sources/AppBundle/Mailchimp/MailchimpMembersAutoListSynchronizer.php @@ -22,10 +22,10 @@ public function __construct( public function synchronize(): void { - $subscribedEmailsOnMailchimp = array_map('strtolower', $this->mailchimp->getAllSubscribedMembersAddresses($this->listId)); - $unSubscribedEmailsOnMailchimp = array_map('strtolower', $this->mailchimp->getAllUnSubscribedMembersAddresses($this->listId)); - $cleanedEmailsOnMailchimp = array_map('strtolower', $this->mailchimp->getAllCleanedMembersAddresses($this->listId)); - $subscribedEmailsOnWebsite = array_map('strtolower', $this->getSubscribedEmailsOnWebsite()); + $subscribedEmailsOnMailchimp = array_map(strtolower(...), $this->mailchimp->getAllSubscribedMembersAddresses($this->listId)); + $unSubscribedEmailsOnMailchimp = array_map(strtolower(...), $this->mailchimp->getAllUnSubscribedMembersAddresses($this->listId)); + $cleanedEmailsOnMailchimp = array_map(strtolower(...), $this->mailchimp->getAllCleanedMembersAddresses($this->listId)); + $subscribedEmailsOnWebsite = array_map(strtolower(...), $this->getSubscribedEmailsOnWebsite()); $addressesToArchive = array_diff($subscribedEmailsOnMailchimp, $subscribedEmailsOnWebsite); // Vu qu'on archive les personnes qui ne sont plus à jour de cotisation, les adresses unsubscribed sont seulemnt les personnes diff --git a/sources/AppBundle/Model/ComptaCategorie.php b/sources/AppBundle/Model/ComptaCategorie.php index 914e8bcfe..76a917e5e 100644 --- a/sources/AppBundle/Model/ComptaCategorie.php +++ b/sources/AppBundle/Model/ComptaCategorie.php @@ -6,12 +6,12 @@ class ComptaCategorie { - public const GOODIES = 13; - public const FRAIS_DE_COMPTE = 28; - public const MAILCHIMP = 31; - public const CHARGES_SOCIALES = 32; - public const GANDI = 37; - public const MEETUP = 45; - public const OUTILS = 48; - public const PRELEVEMENT_SOURCE = 51; + public const int GOODIES = 13; + public const int FRAIS_DE_COMPTE = 28; + public const int MAILCHIMP = 31; + public const int CHARGES_SOCIALES = 32; + public const int GANDI = 37; + public const int MEETUP = 45; + public const int OUTILS = 48; + public const int PRELEVEMENT_SOURCE = 51; } diff --git a/sources/AppBundle/Model/ComptaCompte.php b/sources/AppBundle/Model/ComptaCompte.php index b63772627..94371f0b8 100644 --- a/sources/AppBundle/Model/ComptaCompte.php +++ b/sources/AppBundle/Model/ComptaCompte.php @@ -6,7 +6,7 @@ class ComptaCompte { - public const COURANT_CE = 1; - public const COURANT_CMUT = 5; - public const LIVRET_CMUT = 6; + public const int COURANT_CE = 1; + public const int COURANT_CMUT = 5; + public const int LIVRET_CMUT = 6; } diff --git a/sources/AppBundle/Model/ComptaEvenement.php b/sources/AppBundle/Model/ComptaEvenement.php index 34a84098f..808033cf5 100644 --- a/sources/AppBundle/Model/ComptaEvenement.php +++ b/sources/AppBundle/Model/ComptaEvenement.php @@ -6,6 +6,6 @@ class ComptaEvenement { - public const GESTION = 26; - public const ASSOCIATION_AFUP = 27; + public const int GESTION = 26; + public const int ASSOCIATION_AFUP = 27; } diff --git a/sources/AppBundle/Model/ComptaModeReglement.php b/sources/AppBundle/Model/ComptaModeReglement.php index 95906ddbe..de31c22be 100644 --- a/sources/AppBundle/Model/ComptaModeReglement.php +++ b/sources/AppBundle/Model/ComptaModeReglement.php @@ -6,10 +6,10 @@ class ComptaModeReglement { - public const CB = 2; - public const VIREMENT = 3; - public const CHEQUE = 4; - public const PRELEVEMENT = 5; + public const int CB = 2; + public const int VIREMENT = 3; + public const int CHEQUE = 4; + public const int PRELEVEMENT = 5; public static function list(): array { diff --git a/sources/AppBundle/Offices/NullOfficeFinder.php b/sources/AppBundle/Offices/NullOfficeFinder.php index 3a46a64a2..07a53d19d 100644 --- a/sources/AppBundle/Offices/NullOfficeFinder.php +++ b/sources/AppBundle/Offices/NullOfficeFinder.php @@ -9,6 +9,7 @@ class NullOfficeFinder extends OfficeFinder { + #[\Override] public function findOffice(Invoice $invoice, ?User $user = null): ?string { return null; diff --git a/sources/AppBundle/Offices/OfficeFinder.php b/sources/AppBundle/Offices/OfficeFinder.php index 8c8b4d526..dca3343cb 100644 --- a/sources/AppBundle/Offices/OfficeFinder.php +++ b/sources/AppBundle/Offices/OfficeFinder.php @@ -13,7 +13,7 @@ class OfficeFinder { - public const MAX_DISTANCE_TO_OFFICE = 50000; + public const int MAX_DISTANCE_TO_OFFICE = 50000; private array $geocodeCache = []; diff --git a/sources/AppBundle/Payment/Paybox.php b/sources/AppBundle/Payment/Paybox.php index 53d292591..521ddba85 100644 --- a/sources/AppBundle/Payment/Paybox.php +++ b/sources/AppBundle/Payment/Paybox.php @@ -6,25 +6,25 @@ class Paybox { - public const DEVISE_EURO = 978; + public const int DEVISE_EURO = 978; - public const SPECIAL_CHARS_INPUTS = [ + public const array SPECIAL_CHARS_INPUTS = [ 'PBX_SHOPPINGCART', 'PBX_BILLING', ]; - public const PAYBOX_SHOPPING_MAX_QUANTITY = 99; - public const PAYBOX_DEFAULT_STRING = 'Inconnu'; - public const PAYBOX_DEFAULT_COUNTRY = 250; // correspond à la France en iso3166 + public const int PAYBOX_SHOPPING_MAX_QUANTITY = 99; + public const string PAYBOX_DEFAULT_STRING = 'Inconnu'; + public const int PAYBOX_DEFAULT_COUNTRY = 250; // correspond à la France en iso3166 /** * cf http://www.paybox.com/espace-integrateur-documentation/dictionnaire-des-donnees/paybox-system/ */ - public const RETOUR = 'total:M;cmd:R;autorisation:A;transaction:T;status:E'; - public const SOURCE = 'HTML'; - public const HASH = 'SHA512'; - public const TYPE_PAIEMENT = 'CARTE'; - public const TYPECARTE = 'CB'; + public const string RETOUR = 'total:M;cmd:R;autorisation:A;transaction:T;status:E'; + public const string SOURCE = 'HTML'; + public const string HASH = 'SHA512'; + public const string TYPE_PAIEMENT = 'CARTE'; + public const string TYPECARTE = 'CB'; private $total = 0; private $cmd; diff --git a/sources/AppBundle/Payment/PayboxBilling.php b/sources/AppBundle/Payment/PayboxBilling.php index 527a3684a..b5f14fe6c 100644 --- a/sources/AppBundle/Payment/PayboxBilling.php +++ b/sources/AppBundle/Payment/PayboxBilling.php @@ -71,7 +71,7 @@ public function getCountryCodeIso3166Numeric() $country = $this->getCountryCode(); try { - $data = (new ISO3166())->alpha2($country); + $data = new ISO3166()->alpha2($country); return $data['numeric']; } catch (\Exception) { diff --git a/sources/AppBundle/Payment/PayboxResponse.php b/sources/AppBundle/Payment/PayboxResponse.php index 0b9618d30..a557b09a3 100644 --- a/sources/AppBundle/Payment/PayboxResponse.php +++ b/sources/AppBundle/Payment/PayboxResponse.php @@ -6,13 +6,13 @@ class PayboxResponse { - public const STATUS_SUCCESS = '00000'; + public const string STATUS_SUCCESS = '00000'; - public const STATUS_CANCELED = ''; + public const string STATUS_CANCELED = ''; - public const STATUS_ERROR = ''; + public const string STATUS_ERROR = ''; - public const STATUS_DUPLICATE = '00015'; + public const string STATUS_DUPLICATE = '00015'; /** * @param string $cmd diff --git a/sources/AppBundle/Planete/FeedFormType.php b/sources/AppBundle/Planete/FeedFormType.php index 42a68d563..a742ddf93 100644 --- a/sources/AppBundle/Planete/FeedFormType.php +++ b/sources/AppBundle/Planete/FeedFormType.php @@ -20,7 +20,7 @@ public function __construct(private readonly UserRepository $userRepository) {} public function buildForm(FormBuilderInterface $builder, array $options): void { - $users = [null => null]; + $users = ['' => null]; foreach ($this->userRepository->search() as $user) { $users[$user->getLastName() . ' ' . $user->getFirstName()] = $user->getId(); } diff --git a/sources/AppBundle/Security/ActionThrottling/Log.php b/sources/AppBundle/Security/ActionThrottling/Log.php index 45efaf8ba..ed58844d8 100644 --- a/sources/AppBundle/Security/ActionThrottling/Log.php +++ b/sources/AppBundle/Security/ActionThrottling/Log.php @@ -11,8 +11,8 @@ class Log implements NotifyPropertyInterface { use NotifyProperty; - public const ACTION_SPONSOR_TOKEN = 'sponsor_token'; - public const LIMITATIONS = [ + public const string ACTION_SPONSOR_TOKEN = 'sponsor_token'; + public const array LIMITATIONS = [ self::ACTION_SPONSOR_TOKEN => ['delay' => 'PT1H', 'limit' => 10], ]; diff --git a/sources/AppBundle/Security/ActionThrottling/LogRepository.php b/sources/AppBundle/Security/ActionThrottling/LogRepository.php index 0401938d5..bc7bd3721 100644 --- a/sources/AppBundle/Security/ActionThrottling/LogRepository.php +++ b/sources/AppBundle/Security/ActionThrottling/LogRepository.php @@ -84,7 +84,7 @@ public function clearOldLogs(\DateInterval $delay): void DELETE FROM afup_throttling WHERE `created_on` < :date '); - $date = (new \DateTime())->sub($delay); + $date = new \DateTime()->sub($delay); $query->setParams([ 'date' => $date->format('Y-m-d H:i:s'), ]); diff --git a/sources/AppBundle/Security/MembershipFeeVoter.php b/sources/AppBundle/Security/MembershipFeeVoter.php index cdd7c57a0..daf627af3 100644 --- a/sources/AppBundle/Security/MembershipFeeVoter.php +++ b/sources/AppBundle/Security/MembershipFeeVoter.php @@ -14,7 +14,7 @@ class MembershipFeeVoter extends Voter { - public const READ_INVOICE = 'membership_fee_read_invoice'; + public const string READ_INVOICE = 'membership_fee_read_invoice'; public function __construct( private readonly Droits $droits, diff --git a/sources/AppBundle/Site/Entity/Rubrique.php b/sources/AppBundle/Site/Entity/Rubrique.php index 5f3037c42..3801701d6 100644 --- a/sources/AppBundle/Site/Entity/Rubrique.php +++ b/sources/AppBundle/Site/Entity/Rubrique.php @@ -11,11 +11,11 @@ #[ORM\Table(name: 'afup_site_rubrique')] class Rubrique { - public const ID_RUBRIQUE_ACTUALITES = 9; - public const ID_RUBRIQUE_ASSOCIATION = 85; - public const ID_RUBRIQUE_ANTENNES = 84; - public const ID_RUBRIQUE_INFORMATIONS_PRATIQUES = 86; - public const ID_RUBRIQUE_NOS_ACTIONS = 88; + public const int ID_RUBRIQUE_ACTUALITES = 9; + public const int ID_RUBRIQUE_ASSOCIATION = 85; + public const int ID_RUBRIQUE_ANTENNES = 84; + public const int ID_RUBRIQUE_INFORMATIONS_PRATIQUES = 86; + public const int ID_RUBRIQUE_NOS_ACTIONS = 88; #[ORM\Id] #[ORM\GeneratedValue] diff --git a/sources/AppBundle/Site/Form/ArticleType.php b/sources/AppBundle/Site/Form/ArticleType.php index fd8fc4907..e3fbe1264 100644 --- a/sources/AppBundle/Site/Form/ArticleType.php +++ b/sources/AppBundle/Site/Form/ArticleType.php @@ -4,6 +4,7 @@ namespace AppBundle\Site\Form; +use AppBundle\Site\Model\Article; use AppBundle\Event\Model\Repository\EventRepository; use AppBundle\Site\Enum\ArticleTheme; use AppBundle\Site\Entity\Repository\RubriqueRepository; @@ -18,7 +19,7 @@ class ArticleType extends AbstractType { - public const POSITIONS_RUBRIQUES = 9; + public const int POSITIONS_RUBRIQUES = 9; public function __construct( private readonly RubriqueRepository $rubriqueRepository, @@ -41,7 +42,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void $events[$event->getTitle()] = $event->getId(); } - /** @var \AppBundle\Site\Model\Article|null $article */ + /** @var Article|null $article */ $article = $builder->getData(); $textareaCssClass = 'easymde'; diff --git a/sources/AppBundle/Site/Form/FeuilleType.php b/sources/AppBundle/Site/Form/FeuilleType.php index fa9e769ee..e5ec46296 100644 --- a/sources/AppBundle/Site/Form/FeuilleType.php +++ b/sources/AppBundle/Site/Form/FeuilleType.php @@ -16,7 +16,7 @@ class FeuilleType extends AbstractType { - public const POSITIONS_RUBRIQUES = 9; + public const int POSITIONS_RUBRIQUES = 9; public function __construct(private readonly FeuilleRepository $feuilleRepository) {} diff --git a/sources/AppBundle/Site/Form/RubriqueType.php b/sources/AppBundle/Site/Form/RubriqueType.php index 9527f83e6..8dfa15f32 100644 --- a/sources/AppBundle/Site/Form/RubriqueType.php +++ b/sources/AppBundle/Site/Form/RubriqueType.php @@ -19,7 +19,7 @@ class RubriqueType extends AbstractType { - public const POSITIONS_RUBRIQUES = 9; + public const int POSITIONS_RUBRIQUES = 9; public function __construct( private readonly RubriqueRepository $rubriqueRepository, diff --git a/sources/AppBundle/Site/Model/Rubrique.php b/sources/AppBundle/Site/Model/Rubrique.php index eb87195e0..8e53cf4b1 100644 --- a/sources/AppBundle/Site/Model/Rubrique.php +++ b/sources/AppBundle/Site/Model/Rubrique.php @@ -12,11 +12,11 @@ class Rubrique implements NotifyPropertyInterface { use NotifyProperty; - public const ID_RUBRIQUE_ACTUALITES = 9; - public const ID_RUBRIQUE_ASSOCIATION = 85; - public const ID_RUBRIQUE_ANTENNES = 84; - public const ID_RUBRIQUE_INFORMATIONS_PRATIQUES = 86; - public const ID_RUBRIQUE_NOS_ACTIONS = 88; + public const int ID_RUBRIQUE_ACTUALITES = 9; + public const int ID_RUBRIQUE_ASSOCIATION = 85; + public const int ID_RUBRIQUE_ANTENNES = 84; + public const int ID_RUBRIQUE_INFORMATIONS_PRATIQUES = 86; + public const int ID_RUBRIQUE_NOS_ACTIONS = 88; #[Assert\Type('integer')] private $id; @@ -173,7 +173,7 @@ public function getPagination() public function setPagination($pagination = 0): void { - $pagination = is_null($pagination) ? 0 : $pagination; + $pagination ??= 0; $this->propertyChanged('pagination', $this->pagination, $pagination); $this->pagination = $pagination; } diff --git a/sources/AppBundle/Slack/MessageFactory.php b/sources/AppBundle/Slack/MessageFactory.php index eaa7512b5..93d19f469 100644 --- a/sources/AppBundle/Slack/MessageFactory.php +++ b/sources/AppBundle/Slack/MessageFactory.php @@ -46,10 +46,10 @@ public function createMessageForVote(Vote $vote): Message $attachment ->addField( - (new Field())->setShort(false)->setTitle('Talk')->setValue($vote->getTalk()->getTitle()), + new Field()->setShort(false)->setTitle('Talk')->setValue($vote->getTalk()->getTitle()), ) ->addField( - (new Field())->setShort(false)->setTitle('Nouveau vote')->setValue( + new Field()->setShort(false)->setTitle('Nouveau vote')->setValue( str_repeat(':star:', $vote->getVote()), ), ) @@ -57,7 +57,7 @@ public function createMessageForVote(Vote $vote): Message if ($vote->getComment() !== null) { $attachment ->addField( - (new Field())->setShort(false)->setTitle('Commentaire')->setValue($vote->getComment()), + new Field()->setShort(false)->setTitle('Commentaire')->setValue($vote->getComment()), ) ; } @@ -98,19 +98,19 @@ public function createMessageForTalk(Talk $talk, Event $event): Message $attachment ->addField( - (new Field())->setShort(false)->setTitle('Talk')->setValue($talk->getTitle()), + new Field()->setShort(false)->setTitle('Talk')->setValue($talk->getTitle()), ) ->addField( - (new Field())->setShort(false)->setTitle('Résumé')->setValue(substr($talk->getAbstract(), 0, 300)), + new Field()->setShort(false)->setTitle('Résumé')->setValue(substr($talk->getAbstract(), 0, 300)), ) ->addField( - (new Field())->setShort(false)->setTitle('Accompagnement')->setValue($talk->getNeedsMentoring() ? "Oui" : "Non"), + new Field()->setShort(false)->setTitle('Accompagnement')->setValue($talk->getNeedsMentoring() ? "Oui" : "Non"), ) ->addField( - (new Field())->setShort(true)->setTitle('Type')->setValue($this->translator->trans($talk->getTypeTranslationKey())), + new Field()->setShort(true)->setTitle('Type')->setValue($this->translator->trans($talk->getTypeTranslationKey())), ) ->addField( - (new Field())->setShort(true)->setTitle('Public')->setValue($this->translator->trans($talk->getSkillTranslationKey())), + new Field()->setShort(true)->setTitle('Public')->setValue($this->translator->trans($talk->getSkillTranslationKey())), ) ; @@ -133,7 +133,7 @@ public function createMessageForMemberNotification(string $membersToCheckCount): ->setTitleLink('https://afup.org/admin/slackmembers/check') ->setColor('#FF0000') ->addField( - (new Field())->setShort(false)->setTitle('Membres à vérifier')->setValue($membersToCheckCount), + new Field()->setShort(false)->setTitle('Membres à vérifier')->setValue($membersToCheckCount), ) ; @@ -164,13 +164,13 @@ public function createMessageForGeneralMeeting(GeneralMeetingRepository $general $attachment = new Attachment(); $attachment ->setTitleLink($urlGenerator->generate('admin_members_general_meeting', [], UrlGeneratorInterface::ABSOLUTE_URL)) - ->addField((new Field())->setShort(true)->setTitle('Membres à jour de cotisation') + ->addField(new Field()->setShort(true)->setTitle('Membres à jour de cotisation') ->setValue($nombrePersonnesAJourDeCotisation)) - ->addField((new Field())->setShort(true)->setTitle('Présences et pouvoirs') + ->addField(new Field()->setShort(true)->setTitle('Présences et pouvoirs') ->setValue($generalMeetingRepository->countAttendeesAndPowers($latestDate))) - ->addField((new Field())->setShort(true)->setTitle('Présences') + ->addField(new Field()->setShort(true)->setTitle('Présences') ->setValue($generalMeetingRepository->countAttendees($latestDate))) - ->addField((new Field())->setShort(true)->setTitle('Quorum') + ->addField(new Field()->setShort(true)->setTitle('Quorum') ->setValue($generalMeetingRepository->obtenirEcartQuorum($latestDate, $nombrePersonnesAJourDeCotisation))) ; $message->addAttachment($attachment); @@ -199,7 +199,7 @@ public function createMessageForTicketStats(Event $event, EventStatsRepository $ if (0 === $value) { continue; } - $attachment->addField((new Field())->setShort(true)->setTitle($ticketRepository->get($typeId)->getPrettyName())->setValue($value)); + $attachment->addField(new Field()->setShort(true)->setTitle($ticketRepository->get($typeId)->getPrettyName())->setValue($value)); } $message->addAttachment($attachment); @@ -218,13 +218,13 @@ public function createMessageForTicketStats(Event $event, EventStatsRepository $ $tickets = $tickets . ' / ' . $event->getSeats() . " ($percentage%)"; } - $attachment->addField((new Field())->setShort(true)->setTitle('Journée unique') + $attachment->addField(new Field()->setShort(true)->setTitle('Journée unique') ->setValue($tickets)); } else { $attachment - ->addField((new Field())->setShort(true)->setTitle('Premier jour') + ->addField(new Field()->setShort(true)->setTitle('Premier jour') ->setValue($eventStats->firstDay->paid)) - ->addField((new Field())->setShort(true)->setTitle('Deuxième jour') + ->addField(new Field()->setShort(true)->setTitle('Deuxième jour') ->setValue($eventStats->secondDay->paid)) ; } @@ -300,7 +300,7 @@ private function prepareCfpStatsFields(TalkRepository $talkRepository, TalkToSpe $fields = []; foreach ($infos as $title => $value) { - $fields[] = (new Field())->setShort(true)->setTitle($title)->setValue($value); + $fields[] = new Field()->setShort(true)->setTitle($title)->setValue($value); } return $fields; diff --git a/sources/AppBundle/Slack/UsersChecker.php b/sources/AppBundle/Slack/UsersChecker.php index 56d4dfe3c..3801e211b 100644 --- a/sources/AppBundle/Slack/UsersChecker.php +++ b/sources/AppBundle/Slack/UsersChecker.php @@ -10,7 +10,7 @@ class UsersChecker { - public const SUBSCRIPTION_DELAY = '+15 days'; + public const string SUBSCRIPTION_DELAY = '+15 days'; public function __construct( private readonly UsersClient $usersClient, diff --git a/sources/AppBundle/Slack/UsersClient.php b/sources/AppBundle/Slack/UsersClient.php index 7b8014352..074989866 100644 --- a/sources/AppBundle/Slack/UsersClient.php +++ b/sources/AppBundle/Slack/UsersClient.php @@ -9,7 +9,7 @@ final readonly class UsersClient { - public const USER_LIST_API = '/users.list'; + public const string USER_LIST_API = '/users.list'; public function __construct( #[Autowire('%slack_membre_token%')] diff --git a/sources/AppBundle/SocialNetwork/Bluesky/BlueskyPolyfill.php b/sources/AppBundle/SocialNetwork/Bluesky/BlueskyPolyfill.php index c31c272e6..1d4afe082 100644 --- a/sources/AppBundle/SocialNetwork/Bluesky/BlueskyPolyfill.php +++ b/sources/AppBundle/SocialNetwork/Bluesky/BlueskyPolyfill.php @@ -86,7 +86,7 @@ private function getMatchAndPosition(AbstractString $text, string $regex): array while (null !== $start = $text->indexOf($match, min($length, $end + 1))) { $output[] = [ 'start' => $start, - 'end' => $end = $start + (new ByteString($match))->length(), + 'end' => $end = $start + new ByteString($match)->length(), 'match' => $match, ]; } diff --git a/sources/AppBundle/SocialNetwork/Bluesky/BlueskyTransport.php b/sources/AppBundle/SocialNetwork/Bluesky/BlueskyTransport.php index efddc3205..4639d1d78 100644 --- a/sources/AppBundle/SocialNetwork/Bluesky/BlueskyTransport.php +++ b/sources/AppBundle/SocialNetwork/Bluesky/BlueskyTransport.php @@ -42,7 +42,7 @@ public function send(Status $status): ?StatusId $record['embed'] = $this->buildEmbed($status->embed); } - $facets = (new BlueskyPolyfill($this->httpClient))->parseFacets($status->text); + $facets = new BlueskyPolyfill($this->httpClient)->parseFacets($status->text); if ($facets !== []) { $record['facets'] = $facets; diff --git a/sources/AppBundle/SpeakerInfos/Form/HotelReservationType.php b/sources/AppBundle/SpeakerInfos/Form/HotelReservationType.php index c17edc0e6..7f5d9c140 100644 --- a/sources/AppBundle/SpeakerInfos/Form/HotelReservationType.php +++ b/sources/AppBundle/SpeakerInfos/Form/HotelReservationType.php @@ -18,8 +18,8 @@ class HotelReservationType extends AbstractType { - public const NIGHT_NONE = 'none'; - public const NIGHT_TRAVEL_SPONSOR = 'hosting_sponsor'; + public const string NIGHT_NONE = 'none'; + public const string NIGHT_TRAVEL_SPONSOR = 'hosting_sponsor'; public function __construct(private readonly TranslatorInterface $translator) {} diff --git a/sources/AppBundle/SpeakerInfos/Form/SpeakersMicrophoneType.php b/sources/AppBundle/SpeakerInfos/Form/SpeakersMicrophoneType.php index 49d6a5e7c..2d63205f3 100644 --- a/sources/AppBundle/SpeakerInfos/Form/SpeakersMicrophoneType.php +++ b/sources/AppBundle/SpeakerInfos/Form/SpeakersMicrophoneType.php @@ -21,7 +21,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'label' => 'speaker_infos.microphone.label', 'expanded' => true, 'placeholder' => 'speaker_infos.microphone.placeholder', - 'choice_label' => fn(MicrophoneType $type) => match ($type) { + 'choice_label' => fn(MicrophoneType $type): string => match ($type) { MicrophoneType::Headset => 'speaker_infos.microphone.choice.headset', MicrophoneType::Handheld => 'speaker_infos.microphone.choice.handheld', }, diff --git a/sources/AppBundle/SpeakerInfos/Form/TravelSponsorType.php b/sources/AppBundle/SpeakerInfos/Form/TravelSponsorType.php index 7a1b6198e..ecd9890e5 100644 --- a/sources/AppBundle/SpeakerInfos/Form/TravelSponsorType.php +++ b/sources/AppBundle/SpeakerInfos/Form/TravelSponsorType.php @@ -13,8 +13,8 @@ final class TravelSponsorType extends AbstractType { - public const OPTION_SPONSORED = 'sponsored'; - public const OPTION_NOT_NEEDED = 'not_needed'; + public const string OPTION_SPONSORED = 'sponsored'; + public const string OPTION_NOT_NEEDED = 'not_needed'; public function buildForm(FormBuilderInterface $builder, array $options): void { diff --git a/sources/AppBundle/StaticAnalysis/Rule/DoctrineDisableDQLRule.php b/sources/AppBundle/StaticAnalysis/Rule/DoctrineDisableDQLRule.php index 280b27745..8692e8bb4 100644 --- a/sources/AppBundle/StaticAnalysis/Rule/DoctrineDisableDQLRule.php +++ b/sources/AppBundle/StaticAnalysis/Rule/DoctrineDisableDQLRule.php @@ -4,6 +4,7 @@ namespace AppBundle\StaticAnalysis\Rule; +use PhpParser\Node\Identifier; use Doctrine\ORM\EntityManagerInterface; use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; @@ -33,7 +34,7 @@ public function getNodeType(): string public function processNode(Node $node, Scope $scope): array { - if (!$node->name instanceof Node\Identifier) { + if (!$node->name instanceof Identifier) { return []; } @@ -56,15 +57,7 @@ public function processNode(Node $node, Scope $scope): array private function isEntityManager(Type $type): bool { - foreach ($type->getObjectClassNames() as $className) { - if ( - $className === $this->entityManagerClass->getName() - || $this->reflectionProvider->getClass($className)->isSubclassOfClass($this->entityManagerClass) - ) { - return true; - } - } - - return false; + return array_any($type->getObjectClassNames(), fn($className): bool => $className === $this->entityManagerClass->getName() + || $this->reflectionProvider->getClass($className)->isSubclassOfClass($this->entityManagerClass)); } } diff --git a/sources/AppBundle/StaticAnalysis/Rule/DoctrineRepositoryRule.php b/sources/AppBundle/StaticAnalysis/Rule/DoctrineRepositoryRule.php index 2d95bd75e..9e2be0fe1 100644 --- a/sources/AppBundle/StaticAnalysis/Rule/DoctrineRepositoryRule.php +++ b/sources/AppBundle/StaticAnalysis/Rule/DoctrineRepositoryRule.php @@ -4,6 +4,7 @@ namespace AppBundle\StaticAnalysis\Rule; +use PhpParser\Node\Identifier; use Doctrine\ORM\EntityRepository; use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; @@ -20,7 +21,7 @@ */ final readonly class DoctrineRepositoryRule implements Rule { - private const FORBIDDEN_METHODS = [ + private const array FORBIDDEN_METHODS = [ 'createQueryBuilder', 'createResultSetMappingBuilder', 'getClassName', @@ -44,7 +45,7 @@ public function getNodeType(): string public function processNode(Node $node, Scope $scope): array { - if (!$node->name instanceof Node\Identifier) { + if (!$node->name instanceof Identifier) { return []; } diff --git a/sources/AppBundle/StaticAnalysis/Rule/NoDebugFunctionsRule.php b/sources/AppBundle/StaticAnalysis/Rule/NoDebugFunctionsRule.php index 17e1cb3a2..cbf6148fb 100644 --- a/sources/AppBundle/StaticAnalysis/Rule/NoDebugFunctionsRule.php +++ b/sources/AppBundle/StaticAnalysis/Rule/NoDebugFunctionsRule.php @@ -18,7 +18,7 @@ */ final class NoDebugFunctionsRule implements Rule { - private const FORBIDDEN_FUNCTIONS = ['var_dump', 'dump', 'dd', 'print_r']; + private const array FORBIDDEN_FUNCTIONS = ['var_dump', 'dump', 'dd', 'print_r']; public function getNodeType(): string { diff --git a/sources/AppBundle/StaticAnalysis/Rule/NoGetUserMethodRule.php b/sources/AppBundle/StaticAnalysis/Rule/NoGetUserMethodRule.php index 80d0bcbc7..8606aca5c 100644 --- a/sources/AppBundle/StaticAnalysis/Rule/NoGetUserMethodRule.php +++ b/sources/AppBundle/StaticAnalysis/Rule/NoGetUserMethodRule.php @@ -4,6 +4,7 @@ namespace AppBundle\StaticAnalysis\Rule; +use PhpParser\Node\Identifier; use AppBundle\Security\Authentication; use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; @@ -32,7 +33,7 @@ public function getNodeType(): string public function processNode(Node $node, Scope $scope): array { - if (!$node->name instanceof Node\Identifier) { + if (!$node->name instanceof Identifier) { return []; } diff --git a/sources/AppBundle/SuperApero/Entity/Repository/SuperAperoRepository.php b/sources/AppBundle/SuperApero/Entity/Repository/SuperAperoRepository.php index 4635e2899..2737bdaa2 100644 --- a/sources/AppBundle/SuperApero/Entity/Repository/SuperAperoRepository.php +++ b/sources/AppBundle/SuperApero/Entity/Repository/SuperAperoRepository.php @@ -15,13 +15,11 @@ */ final class SuperAperoRepository extends EntityRepository { - private ClockInterface $clock; - - public function __construct(ManagerRegistry $registry, ClockInterface $clock) - { + public function __construct( + ManagerRegistry $registry, + private readonly ClockInterface $clock, + ) { parent::__construct($registry, SuperApero::class); - - $this->clock = $clock; } /** diff --git a/sources/AppBundle/TechLetter/DataExtractor.php b/sources/AppBundle/TechLetter/DataExtractor.php index 9f6b97ec3..dcc239b5e 100644 --- a/sources/AppBundle/TechLetter/DataExtractor.php +++ b/sources/AppBundle/TechLetter/DataExtractor.php @@ -9,7 +9,7 @@ class DataExtractor /** * @see https://fr.wikipedia.org/wiki/Mot_par_minute */ - public const WORD_READ_BY_MINUTES = 250; + public const int WORD_READ_BY_MINUTES = 250; /** * @return mixed[] @@ -62,7 +62,7 @@ public function extractDataForTechLetter($url): array $data['date'] = $date->format('Y-m-d'); } if (isset($schema['articleBody'])) { - $body = strip_tags($schema['articleBody']); + $body = strip_tags((string) $schema['articleBody']); $data['readingTime'] = floor(str_word_count($body) / self::WORD_READ_BY_MINUTES); } } diff --git a/sources/AppBundle/TechLetter/HtmlParser.php b/sources/AppBundle/TechLetter/HtmlParser.php index c7ff36079..1f5eba929 100644 --- a/sources/AppBundle/TechLetter/HtmlParser.php +++ b/sources/AppBundle/TechLetter/HtmlParser.php @@ -15,8 +15,8 @@ class HtmlParser private readonly \DOMXPath $xpath; - public const OPEN_GRAPH_PREFIX = 'og'; - public const TWITTER_PREFIX = 'twitter'; + public const string OPEN_GRAPH_PREFIX = 'og'; + public const string TWITTER_PREFIX = 'twitter'; public function __construct($html) { diff --git a/sources/AppBundle/TechLetter/Model/Article.php b/sources/AppBundle/TechLetter/Model/Article.php index 0854bc726..a320d6eba 100644 --- a/sources/AppBundle/TechLetter/Model/Article.php +++ b/sources/AppBundle/TechLetter/Model/Article.php @@ -6,7 +6,7 @@ class Article implements \JsonSerializable { - private const DEFAULT_LANGUAGE = 'en'; + private const string DEFAULT_LANGUAGE = 'en'; private readonly string $language; public function __construct( diff --git a/sources/AppBundle/Ting/DateTimeWithTimeZoneSerializer.php b/sources/AppBundle/Ting/DateTimeWithTimeZoneSerializer.php index ab24740ab..7006c7cfa 100644 --- a/sources/AppBundle/Ting/DateTimeWithTimeZoneSerializer.php +++ b/sources/AppBundle/Ting/DateTimeWithTimeZoneSerializer.php @@ -8,6 +8,7 @@ class DateTimeWithTimeZoneSerializer extends DateTime { + #[\Override] public function unserialize($serialized, array $options = []) { $value = parent::unserialize($serialized, $options); diff --git a/sources/AppBundle/Ting/HydratorAggregator.php b/sources/AppBundle/Ting/HydratorAggregator.php index 1721b94c0..969a4113b 100644 --- a/sources/AppBundle/Ting/HydratorAggregator.php +++ b/sources/AppBundle/Ting/HydratorAggregator.php @@ -57,6 +57,7 @@ public function callableFinalizeAggregate(Closure $callableFinalizeAggregate): s /** * @return Generator */ + #[\Override] public function getIterator(): Generator { $knownIdentifiers = []; diff --git a/sources/AppBundle/Twig/AssetsExtension.php b/sources/AppBundle/Twig/AssetsExtension.php index 99d28ee60..b463bef76 100644 --- a/sources/AppBundle/Twig/AssetsExtension.php +++ b/sources/AppBundle/Twig/AssetsExtension.php @@ -15,6 +15,7 @@ public function __construct( private readonly string $kernelProjectDir, ) {} + #[\Override] public function getFunctions(): array { return [ diff --git a/sources/AppBundle/Twig/OfficesExtension.php b/sources/AppBundle/Twig/OfficesExtension.php index 328deebce..72aa16f36 100644 --- a/sources/AppBundle/Twig/OfficesExtension.php +++ b/sources/AppBundle/Twig/OfficesExtension.php @@ -12,6 +12,7 @@ class OfficesExtension extends AbstractExtension { public function __construct(private readonly AntenneRepository $antennesRepository) {} + #[\Override] public function getFunctions(): array { return [ diff --git a/sources/AppBundle/Twig/TwigExtension.php b/sources/AppBundle/Twig/TwigExtension.php index 8f3f1798a..c722bc811 100644 --- a/sources/AppBundle/Twig/TwigExtension.php +++ b/sources/AppBundle/Twig/TwigExtension.php @@ -24,6 +24,7 @@ public function __construct( private readonly string $googleAnalyticsId, ) {} + #[\Override] public function getFunctions(): array { return [ @@ -44,6 +45,7 @@ public function getFunctions(): array ]; } + #[\Override] public function getFilters(): array { return [ diff --git a/sources/AppBundle/Validator/Constraints/UniqueEntity.php b/sources/AppBundle/Validator/Constraints/UniqueEntity.php index 440d575f0..4ca4f6944 100644 --- a/sources/AppBundle/Validator/Constraints/UniqueEntity.php +++ b/sources/AppBundle/Validator/Constraints/UniqueEntity.php @@ -21,6 +21,7 @@ public function __construct( parent::__construct(); } + #[\Override] public function getTargets(): string { return self::CLASS_CONSTRAINT; diff --git a/sources/AppBundle/VideoNotifier/Engine.php b/sources/AppBundle/VideoNotifier/Engine.php index 6a943f936..cc69c5152 100644 --- a/sources/AppBundle/VideoNotifier/Engine.php +++ b/sources/AppBundle/VideoNotifier/Engine.php @@ -16,7 +16,7 @@ final readonly class Engine { - private const VALID_TALK_TYPES = [ + private const array VALID_TALK_TYPES = [ Talk::TYPE_FULL_LONG, Talk::TYPE_FULL_SHORT, ]; diff --git a/sources/PlanetePHP/FeedArticleRepository.php b/sources/PlanetePHP/FeedArticleRepository.php index e5853c66c..8cc6a4a87 100644 --- a/sources/PlanetePHP/FeedArticleRepository.php +++ b/sources/PlanetePHP/FeedArticleRepository.php @@ -10,9 +10,9 @@ class FeedArticleRepository { - public const RELEVANT = 1; - public const IRRELEVANT = 0; - public const PERTINENCE_LIST = 'php|afup|pear|pecl|symfony|copix|jelix|wampserver|simpletest|simplexml|zend|pmo|drupal|ovidentia|mvc|magento|chrome|spip|PDO|mock|cake|hiphop|CMS|Framework|typo3|photon|pattern'; + public const int RELEVANT = 1; + public const int IRRELEVANT = 0; + public const string PERTINENCE_LIST = 'php|afup|pear|pecl|symfony|copix|jelix|wampserver|simpletest|simplexml|zend|pmo|drupal|ovidentia|mvc|magento|chrome|spip|PDO|mock|cake|hiphop|CMS|Framework|typo3|photon|pattern'; private readonly string $pertinenceRegex; public function __construct(private readonly Connection $connection) @@ -136,8 +136,8 @@ private function update(FeedArticle $billet, $id = null) private function insert(FeedArticle $billet) { - $statement = $this->connection->prepare('INSERT INTO afup_planete_billet - (afup_planete_flux_id, clef, titre, url, maj, auteur, resume, contenu, etat) + $statement = $this->connection->prepare('INSERT INTO afup_planete_billet + (afup_planete_flux_id, clef, titre, url, maj, auteur, resume, contenu, etat) VALUES (:feedId, :key, :title, :url, :update, :author, :summary, :content, :status)'); $statement->bindValue('feedId', $billet->feedId); diff --git a/sources/PlanetePHP/FeedRepository.php b/sources/PlanetePHP/FeedRepository.php index 523345730..63a78ff5a 100644 --- a/sources/PlanetePHP/FeedRepository.php +++ b/sources/PlanetePHP/FeedRepository.php @@ -95,7 +95,7 @@ public function delete(int $id): bool private function hydrateAll(array $rows): array { - return array_map(fn(array $row): Feed => $this->hydrate($row), $rows); + return array_map($this->hydrate(...), $rows); } private function hydrate(array $row): Feed diff --git a/tests/behat/bootstrap/EmailContext.php b/tests/behat/bootstrap/EmailContext.php index 728df8d26..2bb0fd355 100644 --- a/tests/behat/bootstrap/EmailContext.php +++ b/tests/behat/bootstrap/EmailContext.php @@ -14,24 +14,24 @@ trait EmailContext { - private const MAILCATCHER_URL = 'http://mailcatcher:1080'; + private const string MAILCATCHER_URL = 'http://mailcatcher:1080'; #[BeforeScenario('@clearAllMailInscriptionAttachments')] - public function beforeScenarioClearAllMailInscriptionAttachments(): void + public static function beforeScenarioClearAllMailInscriptionAttachments(): void { $filesystem = new Filesystem(); $filesystem->remove(Event::getInscriptionAttachmentDir()); } #[BeforeScenario('@clearAllSponsorFiles')] - public function beforeScenarioClearAllSponsorFiles(): void + public static function beforeScenarioClearAllSponsorFiles(): void { $filesystem = new Filesystem(); $filesystem->remove(Event::getSponsorFileDir()); } #[BeforeScenario('@clearEmails')] - public function clearEmails(): void + public static function clearEmails(): void { $ch = curl_init(); @@ -43,8 +43,6 @@ public function clearEmails(): void if (curl_errno($ch) !== 0) { throw new \RuntimeException('Error : ' . curl_error($ch)); } - - curl_close($ch); } #[Then('I should only receive the following emails:')] diff --git a/tests/behat/bootstrap/PdfContext.php b/tests/behat/bootstrap/PdfContext.php index 4e87eca06..880eab3ed 100644 --- a/tests/behat/bootstrap/PdfContext.php +++ b/tests/behat/bootstrap/PdfContext.php @@ -41,9 +41,13 @@ public function iParseThePdfContent(): void #[Then('The page :page of the PDF should contain :content')] public function thePageOfThePdfShouldContain(string $page, string $expectedContent): void { - $pageContent = $this->pdfPages[$page] ?? null; + $pageContent = $this->pdfPages[$page] ?? ''; - if (!str_contains((string) $pageContent, $expectedContent)) { + $search = ["\\t", "\\n", "\\r"]; + $replace = [ "\t", "\n", "\r"]; + $expectedContent = str_replace($search, $replace, $expectedContent); + + if (!str_contains($pageContent, $expectedContent)) { throw new ExpectationException( sprintf('The content "%s" was not found in the content "%s"', $expectedContent, $pageContent), $this->minkContext->getSession()->getDriver(), @@ -63,11 +67,17 @@ public function thePageOfThePdfShouldNotContain(string $page, string $expectedCo $pageContent = $this->pdfPages[$page]; - if (str_contains($pageContent, $expectedContent)) { + if (str_contains((string) $pageContent, $expectedContent)) { throw new ExpectationException( sprintf('The content "%s" was not found in the content "%s"', $expectedContent, $pageContent), $this->minkContext->getSession()->getDriver(), ); } } + + #[Then('print the page :page of the PDF')] + public function thePrint(string $page): void + { + echo $this->pdfPages[$page] ?? null; + } } diff --git a/tests/behat/bootstrap/TimeContext.php b/tests/behat/bootstrap/TimeContext.php index 339f4af27..3d6dd16fe 100644 --- a/tests/behat/bootstrap/TimeContext.php +++ b/tests/behat/bootstrap/TimeContext.php @@ -36,6 +36,6 @@ public function theCurrentDateIs(string $date): void #[Then('the response should contain date :arg1 with format :arg2')] public function responseShouldContainsDate(string $datetimeFormat, string $withFormat = DateTimeInterface::ATOM): void { - $this->minkContext->assertResponseContains((new DateTimeImmutable($datetimeFormat))->format($withFormat)); + $this->minkContext->assertResponseContains(new DateTimeImmutable($datetimeFormat)->format($withFormat)); } } diff --git a/tests/behat/bootstrap/WaitContext.php b/tests/behat/bootstrap/WaitContext.php index c40a8ec73..3bb04f16a 100644 --- a/tests/behat/bootstrap/WaitContext.php +++ b/tests/behat/bootstrap/WaitContext.php @@ -4,6 +4,7 @@ namespace Afup\Tests\Behat\Bootstrap; +use Behat\Mink\Driver\PantherDriver; use Behat\Mink\Exception\ExpectationException; use Behat\Step\Then; use Behat\Step\When; @@ -31,7 +32,7 @@ public function waitToSeeText(string $text, ?string $timeout = null): void $timeoutMs = $timeout !== null ? (int) $timeout : self::DEFAULT_TIMEOUT_MS; $this->waitForCondition( - fn() => str_contains($this->minkContext->getSession()->getPage()->getText(), $text), + fn(): bool => str_contains($this->minkContext->getSession()->getPage()->getText(), $text), sprintf('Text "%s" did not appear within %dms', $text, $timeoutMs), $timeoutMs, ); @@ -48,7 +49,7 @@ public function waitToNotSeeText(string $text, ?string $timeout = null): void $timeoutMs = $timeout !== null ? (int) $timeout : self::DEFAULT_TIMEOUT_MS; $this->waitForCondition( - fn() => !str_contains($this->minkContext->getSession()->getPage()->getText(), $text), + fn(): bool => !str_contains($this->minkContext->getSession()->getPage()->getText(), $text), sprintf('Text "%s" did not disappear within %dms', $text, $timeoutMs), $timeoutMs, ); @@ -81,12 +82,12 @@ public function clickLinkOfTooltipAndWaitToSee(string $tooltip, string $text, ?s $session = $this->minkContext->getSession(); - if ($session->getDriver() instanceof \Behat\Mink\Driver\PantherDriver) { + if ($session->getDriver() instanceof PantherDriver) { $link->click(); $timeoutMs = $timeout !== null ? (int) $timeout : self::DEFAULT_TIMEOUT_MS; $this->waitForCondition( - fn() => str_contains($session->getPage()->getContent(), $text), + fn(): bool => str_contains($session->getPage()->getContent(), $text), sprintf( 'Text "%s" did not appear within %dms. Current URL: %s. Page excerpt: %s', $text, @@ -120,7 +121,7 @@ private function waitForCondition(callable $condition, string $errorMessage, int if ($condition()) { return; } - } catch (\Exception $e) { + } catch (\Exception) { // Ignore exceptions during polling (element might not exist yet) } diff --git a/tests/behat/features/Admin/Events/FacturesEvennement.feature b/tests/behat/features/Admin/Events/FacturesEvennement.feature index 9763869fe..aa5cb4d8a 100644 --- a/tests/behat/features/Admin/Events/FacturesEvennement.feature +++ b/tests/behat/features/Admin/Events/FacturesEvennement.feature @@ -21,12 +21,11 @@ Feature: Administration - Évènements - Factures d'évènement When I parse the pdf downloaded content Then The page "1" of the PDF should contain "Objet : Facture n°REF-TEST-002" Then The page "1" of the PDF should contain "4 allée des platanes" - Then The page "1" of the PDF should contain "Type Personne inscrite Prix" - Then The page "1" of the PDF should contain "2 Jours Maurice Jean 250 €" + Then The page "1" of the PDF should contain "Type\tPersonne inscrite\tPrix" + Then The page "1" of the PDF should contain "2 Jours\tMaurice Jean\t250 €" Then The page "1" of the PDF should not contain "Total HT" Then The page "1" of the PDF should not contain "Total TVA" - Then The page "1" of the PDF should contain "FRAIS Paiement par chèque 25 €" - Then The page "1" of the PDF should contain "TOTAL 275 €" + Then The page "1" of the PDF should contain "TOTAL\t275 €" Then The page "1" of the PDF should not contain "Total TTC" Then The page "1" of the PDF should contain "Payé par chèque le 25/06/2023" Then The page "1" of the PDF should contain "TVA non applicable - art. 293B du CGI" @@ -45,14 +44,14 @@ Feature: Administration - Évènements - Factures d'évènement When I parse the pdf downloaded content Then The page "1" of the PDF should contain "Objet : Facture n°REF-TEST-003" Then The page "1" of the PDF should contain "3 avenue de l'enterprise" - Then The page "1" of the PDF should contain "Type Personne inscrite Prix HT TVA Prix TTC" - Then The page "1" of the PDF should contain "2 Jours James Tiberius Kirk 227,27 € 10% 250,00 €" + Then The page "1" of the PDF should contain "Type\tPersonne inscrite\tPrix HTTVA Prix TTC" + Then The page "1" of the PDF should contain "2 Jours\tJames Tiberius Kirk\t227,27 €10% 250,00 €" Then The page "1" of the PDF should contain "Total HT 227,27 €" Then The page "1" of the PDF should contain "Total TVA 10% 22,73 €" Then The page "1" of the PDF should contain "TOTAL TTC 250,00 €" Then The page "1" of the PDF should contain "Payé par virement le 02/01/2024" Then The page "1" of the PDF should not contain "TVA non applicable - art. 293B du CGI" - Then The page "1" of the PDF should contain "Numéro de TVA intracommunautaire FR27 500 869 011" + Then The page "1" of the PDF should contain "Numéro de TVA intracommunautaire\tFR27 500 869 011" Then the checksum of the response content should be "5689b814512a03e2b420272a3fb0711a" @reloadDbWithTestData diff --git a/tests/behat/features/Admin/Tresorerie/DevisFactures.feature b/tests/behat/features/Admin/Tresorerie/DevisFactures.feature index 8773eaafc..af7c22e0d 100644 --- a/tests/behat/features/Admin/Tresorerie/DevisFactures.feature +++ b/tests/behat/features/Admin/Tresorerie/DevisFactures.feature @@ -182,11 +182,11 @@ Feature: Administration - Trésorerie - Devis/Facture Then The page "1" of the PDF should contain "Krampouz" Then The page "1" of the PDF should contain "3, rue du port" Then The page "1" of the PDF should contain "Facture n° 2023-01" - Then The page "1" of the PDF should contain "Repère(s) : Forum PHP 2023" + Then The page "1" of the PDF should contain "Repère(s) : Forum PHP 2023" Then The page "1" of the PDF should contain "Comme convenu, nous vous prions de trouver votre facture" - Then The page "1" of the PDF should contain "Type Description Quantite Prix Total" - Then The page "1" of the PDF should contain "forum_php_2023 Forum PHP 2023 - Sponsoring Bronze 1.00 1000.00 € 1000 €" - Then The page "1" of the PDF should contain "TOTAL 1000 €" + Then The page "1" of the PDF should contain "Type Description\tQuantitePrix Total" + Then The page "1" of the PDF should contain "forum_php_2023Forum PHP 2023 - Sponsoring Bronze 1.00 1000.00 € 1000 €" + Then The page "1" of the PDF should contain "TOTAL\t1000 €" Then The page "1" of the PDF should contain "TVA non applicable - art. 293B du CGI" @reloadDbWithTestData @@ -204,11 +204,11 @@ Feature: Administration - Trésorerie - Devis/Facture Then The page "1" of the PDF should contain "Krampouz" Then The page "1" of the PDF should contain "3, rue du port" Then The page "1" of the PDF should contain "Facture n° 2025-02" - Then The page "1" of the PDF should contain "Repère(s) : Forum PHP 2025" + Then The page "1" of the PDF should contain "Repère(s) : Forum PHP 2025" Then The page "1" of the PDF should contain "Comme convenu, nous vous prions de trouver votre facture" - Then The page "1" of the PDF should contain "Type Description Quantite TVA Prix HT Total TTC" - Then The page "1" of the PDF should contain "forum_php_2025 Forum PHP 2025 - Sponsoring" - Then The page "1" of the PDF should contain "Bronze 1.00 20.00% 1 000,00 € 1 200,00 €" + Then The page "1" of the PDF should contain "Type Description\tQuantiteTVA\tPrix HT Total TTC" + Then The page "1" of the PDF should contain "forum_php_2025Forum PHP 2025 - Sponsoring" + Then The page "1" of the PDF should contain "Bronze\n1.00 20.00%1 000,00 € 1 200,00 €" Then The page "1" of the PDF should contain "TOTAL HT 1 000,00 €" Then The page "1" of the PDF should contain "Total TVA 20.00% 200,00 €" Then The page "1" of the PDF should contain "TOTAL TTC 1 200,00 €" @@ -227,11 +227,11 @@ Feature: Administration - Trésorerie - Devis/Facture Then The page "1" of the PDF should contain "Krampouz" Then The page "1" of the PDF should contain "3, rue du port" Then The page "1" of the PDF should contain "Devis n° 2023-01" - Then The page "1" of the PDF should contain "Repère(s) : Forum PHP 2023" + Then The page "1" of the PDF should contain "Repère(s) : Forum PHP 2023" Then The page "1" of the PDF should contain "Comme convenu, nous vous prions de trouver votre devis" - Then The page "1" of the PDF should contain "Type Description Quantite Prix Total" - Then The page "1" of the PDF should contain "forum_php_2023 Forum PHP 2023 - Sponsoring Bronze 1.00 1000.00 € 1000 €" - Then The page "1" of the PDF should contain "TOTAL 1000 €" + Then The page "1" of the PDF should contain "Type Description\tQuantitePrix Total" + Then The page "1" of the PDF should contain "forum_php_2023Forum PHP 2023 - Sponsoring Bronze\t1.00 1000.00 € 1000 €" + Then The page "1" of the PDF should contain "TOTAL\t1000 €" Then The page "1" of the PDF should contain "TVA non applicable - art. 293B du CGI" Then the checksum of the response content should be "c424b17649ae6bfc83bf6791dc1543ab" @@ -249,11 +249,11 @@ Feature: Administration - Trésorerie - Devis/Facture Then The page "1" of the PDF should contain "Krampouz" Then The page "1" of the PDF should contain "3, rue du port" Then The page "1" of the PDF should contain "Devis n° 2025-02" - Then The page "1" of the PDF should contain "Repère(s) : Forum PHP 2025" + Then The page "1" of the PDF should contain "Repère(s) : Forum PHP 2025" Then The page "1" of the PDF should contain "Comme convenu, nous vous prions de trouver votre devis" - Then The page "1" of the PDF should contain "Type Description Quantite TVA Prix HT Total TTC" - Then The page "1" of the PDF should contain "forum_php_2025 Forum PHP 2025 - Sponsoring" - Then The page "1" of the PDF should contain "Bronze 1.00 20.00% 1 000,00 € 1 200,00 €" + Then The page "1" of the PDF should contain "Type Description\tQuantiteTVA\tPrix HT Total TTC" + Then The page "1" of the PDF should contain "forum_php_2025Forum PHP 2025 - Sponsoring" + Then The page "1" of the PDF should contain "Bronze\n1.00 20.00%1 000,00 € 1 200,00 €" Then The page "1" of the PDF should contain "TOTAL HT 1 000,00 €" Then The page "1" of the PDF should contain "Total TVA 20.00% 200,00 €" Then The page "1" of the PDF should contain "TOTAL TTC 1 200,00 €" diff --git a/tests/behat/features/MembersArea/Index.feature b/tests/behat/features/MembersArea/Index.feature index 5c1ed7b44..1da3ab1d7 100644 --- a/tests/behat/features/MembersArea/Index.feature +++ b/tests/behat/features/MembersArea/Index.feature @@ -75,8 +75,8 @@ Feature: Espace membre, accueil Then The page "1" of the PDF should contain "15, main road" Then The page "1" of the PDF should contain "93501-1100" Then The page "1" of the PDF should contain "Mojave, CA" - Then The page "1" of the PDF should contain "Code Désignation Prix" - Then The page "1" of the PDF should contain "ADH Adhésion AFUP jusqu'au 01/01/2024 30.00 €" + Then The page "1" of the PDF should contain "Code\tDésignation\tPrix" + Then The page "1" of the PDF should contain "ADH\tAdhésion AFUP jusqu'au 01/01/2024\t30.00 €" Then The page "1" of the PDF should contain "TVA non applicable - art. 293B du CGI" Then The page "1" of the PDF should not contain "Numéro de TVA intracommunautaire FR27 500 869 011" Then the checksum of the response content should be "1dec9efb3a5b5bb12e873627d81c9e9c" @@ -96,14 +96,14 @@ Feature: Espace membre, accueil Then The page "1" of the PDF should contain "15, main road" Then The page "1" of the PDF should contain "93501-1100" Then The page "1" of the PDF should contain "Mojave, CA" - Then The page "1" of the PDF should contain "Code Désignation Prix" + Then The page "1" of the PDF should contain "Code Désignation\tPrix HT Taux TVA Prix TTC" Then The page "1" of the PDF should contain "ADH-var Adhésion AFUP jusqu'au 01/01/2025 - part variable 1,50 € 20 % 1,80 €" - Then The page "1" of the PDF should contain "ADH-fixe Adhésion AFUP jusqu'au 01/01/2025 - part fixe 28,20 € 0 % 28,20 €" + Then The page "1" of the PDF should contain "ADH-fixeAdhésion AFUP jusqu'au 01/01/2025 - part fixe\t28,20 € 0 % 28,20 €" Then The page "1" of the PDF should contain "Total HT 29,70 €" Then The page "1" of the PDF should contain "Total TVA 20% 0,30 €" Then The page "1" of the PDF should contain "Total TTC 30,00 €" Then The page "1" of the PDF should not contain "TVA non applicable - art. 293B du CGI" - Then The page "1" of the PDF should contain "Numéro de TVA intracommunautaire FR27 500 869 011" + Then The page "1" of the PDF should contain "Numéro de TVA intracommunautaire\tFR27 500 869 011" Then the checksum of the response content should be "388a2cd0bdbdbc0bf1ae8503ab2a4b7c" @reloadDbWithTestData @vat @@ -121,8 +121,8 @@ Feature: Espace membre, accueil Then The page "1" of the PDF should contain "8, main road" Then The page "1" of the PDF should contain "77201" Then The page "1" of the PDF should contain "Houston, TX" - Then The page "1" of the PDF should contain "Code Désignation Prix" - Then The page "1" of the PDF should contain "ADH Adhésion AFUP jusqu'au 02/01/2024 150.00 €" + Then The page "1" of the PDF should contain "Code\tDésignation\tPrix" + Then The page "1" of the PDF should contain "ADH\tAdhésion AFUP jusqu'au 02/01/2024\t150.00 €" Then The page "1" of the PDF should contain "TVA non applicable - art. 293B du CGI" Then The page "1" of the PDF should not contain "Numéro de TVA intracommunautaire FR27 500 869 011" Then the checksum of the response content should be "63abeb3c8a2eb33ef40a7750707b306d" @@ -142,13 +142,13 @@ Feature: Espace membre, accueil Then The page "1" of the PDF should contain "8, main road" Then The page "1" of the PDF should contain "77201" Then The page "1" of the PDF should contain "Houston, TX" - Then The page "1" of the PDF should contain "Code Désignation Prix" - Then The page "1" of the PDF should contain "ADH Adhésion AFUP jusqu'au 02/01/2025 150,00 € 20 % 180,00 €" + Then The page "1" of the PDF should contain "Code Désignation\tPrix HT Taux TVA Prix TTC" + Then The page "1" of the PDF should contain "ADH Adhésion AFUP jusqu'au 02/01/2025\t150,00 € 20 % 180,00 €" Then The page "1" of the PDF should contain "Total HT 150,00 €" Then The page "1" of the PDF should contain "Total TVA 20% 30,00 €" Then The page "1" of the PDF should contain "Total TTC 180,00 €" Then The page "1" of the PDF should not contain "TVA non applicable - art. 293B du CGI" - Then The page "1" of the PDF should contain "Numéro de TVA intracommunautaire FR27 500 869 011" + Then The page "1" of the PDF should contain "Numéro de TVA intracommunautaire\tFR27 500 869 011" Then the checksum of the response content should be "d9b4cf683928f3a2510e44cd2b91210c" diff --git a/tests/stubs/phpstan/Doctrine/FormType.php b/tests/stubs/phpstan/Doctrine/FormType.php index c369b009e..2a6c6c471 100644 --- a/tests/stubs/phpstan/Doctrine/FormType.php +++ b/tests/stubs/phpstan/Doctrine/FormType.php @@ -4,6 +4,7 @@ namespace Afup\Tests\Stubs\PHPStan\Doctrine; +use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\EntityRepository; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\AbstractType; @@ -14,7 +15,7 @@ final class FormType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options): void { $builder->add('stdclass', EntityType::class, [ - 'query_builder' => fn(EntityRepository $er) => $er->createQueryBuilder('foo')->where('foo.id = 1'), + 'query_builder' => fn(EntityRepository $er): QueryBuilder => $er->createQueryBuilder('foo')->where('foo.id = 1'), ]); } } diff --git a/tests/stubs/phpstan/Doctrine/WithOverridesRepository.php b/tests/stubs/phpstan/Doctrine/WithOverridesRepository.php index 73cce92c9..9cef7464b 100644 --- a/tests/stubs/phpstan/Doctrine/WithOverridesRepository.php +++ b/tests/stubs/phpstan/Doctrine/WithOverridesRepository.php @@ -24,36 +24,43 @@ public function someMethod(): void $this->count(); } + #[\Override] public function createQueryBuilder(string $alias, ?string $indexBy = null): QueryBuilder { return parent::createQueryBuilder($alias, $indexBy); } + #[\Override] public function createResultSetMappingBuilder(string $alias): ResultSetMappingBuilder { return parent::createResultSetMappingBuilder($alias); } + #[\Override] public function findBy(array $criteria, ?array $orderBy = null, ?int $limit = null, ?int $offset = null): array { return parent::findBy($criteria, $orderBy, $limit, $offset); } + #[\Override] public function findOneBy(array $criteria, ?array $orderBy = null): ?object { return parent::findOneBy($criteria, $orderBy); } + #[\Override] public function getClassName(): string { return parent::getClassName(); } + #[\Override] public function matching(Criteria $criteria): AbstractLazyCollection&Selectable { return parent::matching($criteria); } + #[\Override] public function count(array $criteria = []): int { return parent::count($criteria); diff --git a/tests/support/DatabaseManager.php b/tests/support/DatabaseManager.php index ec5c779ec..71ad7c497 100644 --- a/tests/support/DatabaseManager.php +++ b/tests/support/DatabaseManager.php @@ -15,7 +15,7 @@ */ final readonly class DatabaseManager { - private const DB_NAME = 'web'; + private const string DB_NAME = 'web'; private PDO $database; private Mysqldump $dumper; diff --git a/tests/support/TimeMocker.php b/tests/support/TimeMocker.php index f03a38359..32c5cf916 100644 --- a/tests/support/TimeMocker.php +++ b/tests/support/TimeMocker.php @@ -9,8 +9,8 @@ final readonly class TimeMocker { - private const MOCK_DIR_PATH = __DIR__ . '/../../var/cache/test/afup/'; - private const MOCK_FILE_PATH = self::MOCK_DIR_PATH . 'current-date-mock'; + private const string MOCK_DIR_PATH = __DIR__ . '/../../var/cache/test/afup/'; + private const string MOCK_FILE_PATH = self::MOCK_DIR_PATH . 'current-date-mock'; private Filesystem $filesystem; diff --git a/tests/unit/AppBundle/Association/Model/CompanyMemberTest.php b/tests/unit/AppBundle/Association/Model/CompanyMemberTest.php index 47ddcac18..6e25bc68d 100644 --- a/tests/unit/AppBundle/Association/Model/CompanyMemberTest.php +++ b/tests/unit/AppBundle/Association/Model/CompanyMemberTest.php @@ -20,10 +20,10 @@ public static function companies(): array { return [ 'null' => [(new CompanyMember()), AFUP_COTISATION_PERSONNE_MORALE], - 'under' => [(new CompanyMember())->setMaxMembers(2), AFUP_COTISATION_PERSONNE_MORALE], - 'equal' => [(new CompanyMember())->setMaxMembers(3), AFUP_COTISATION_PERSONNE_MORALE], - 'just over' => [(new CompanyMember())->setMaxMembers(4), 2 * AFUP_COTISATION_PERSONNE_MORALE], - 'over' => [(new CompanyMember())->setMaxMembers(6), 2 * AFUP_COTISATION_PERSONNE_MORALE], + 'under' => [new CompanyMember()->setMaxMembers(2), AFUP_COTISATION_PERSONNE_MORALE], + 'equal' => [new CompanyMember()->setMaxMembers(3), AFUP_COTISATION_PERSONNE_MORALE], + 'just over' => [new CompanyMember()->setMaxMembers(4), 2 * AFUP_COTISATION_PERSONNE_MORALE], + 'over' => [new CompanyMember()->setMaxMembers(6), 2 * AFUP_COTISATION_PERSONNE_MORALE], ]; } diff --git a/tests/unit/AppBundle/Event/Form/Support/EventHelperTest.php b/tests/unit/AppBundle/Event/Form/Support/EventHelperTest.php index 207c80bd1..63ac08ce1 100644 --- a/tests/unit/AppBundle/Event/Form/Support/EventHelperTest.php +++ b/tests/unit/AppBundle/Event/Form/Support/EventHelperTest.php @@ -25,21 +25,21 @@ public static function groupByYearDataProvider(): \Generator { yield 'with event as string' => [ 'event' => 'Forum PHP 2014', - 'expectedYear' => '2014', + 'expectedYear' => 'Année 2014', ]; yield 'with start date' => [ - 'event' => (new Event())->setDateStart(new \DateTime('1999-12-13')), - 'expectedYear' => '1999', + 'event' => new Event()->setDateStart(new \DateTime('1999-12-13')), + 'expectedYear' => 'Année 1999', ]; yield 'with date in title' => [ - 'event' => (new Event())->setTitle('AFUP Day 2025 Lyon'), - 'expectedYear' => '2025', + 'event' => new Event()->setTitle('AFUP Day 2025 Lyon'), + 'expectedYear' => 'Année 2025', ]; yield 'without date in title' => [ - 'event' => (new Event()) + 'event' => new Event() ->setTitle('PHP Tour'), 'expectedYear' => 'Année inconnue', ]; @@ -53,11 +53,11 @@ public static function groupByYearDataProvider(): \Generator public function testSortEventsByStartDate(): void { $events = [ - (new Event())->setDateStart(new \DateTime('2020-05-03')), - (new Event())->setDateStart(new \DateTime('2021-05-03')), - (new Event())->setDateStart(new \DateTime('2022-05-03')), - (new Event())->setDateStart(new \DateTime('2023-05-03')), - (new Event())->setDateStart(new \DateTime('2024-05-03')), + new Event()->setDateStart(new \DateTime('2020-05-03')), + new Event()->setDateStart(new \DateTime('2021-05-03')), + new Event()->setDateStart(new \DateTime('2022-05-03')), + new Event()->setDateStart(new \DateTime('2023-05-03')), + new Event()->setDateStart(new \DateTime('2024-05-03')), ]; $helper = new EventHelper(); diff --git a/tests/unit/AppBundle/Indexation/Meetups/TransformerTest.php b/tests/unit/AppBundle/Indexation/Meetups/TransformerTest.php index 749c9dd01..b0ea46ce2 100644 --- a/tests/unit/AppBundle/Indexation/Meetups/TransformerTest.php +++ b/tests/unit/AppBundle/Indexation/Meetups/TransformerTest.php @@ -15,7 +15,7 @@ public function testTransform(): void { $transformer = new Transformer(new AntenneRepository()); - $meetup = (new Meetup()) + $meetup = new Meetup() ->setId('244992881') ->setDate(new \DateTime('2050-12-14 17:30:00')) ->setTitle('Apéro PHP') diff --git a/tests/unit/AppBundle/Indexation/Talks/TransformerTest.php b/tests/unit/AppBundle/Indexation/Talks/TransformerTest.php index 0c2ea7513..5f863651f 100644 --- a/tests/unit/AppBundle/Indexation/Talks/TransformerTest.php +++ b/tests/unit/AppBundle/Indexation/Talks/TransformerTest.php @@ -115,7 +115,7 @@ public function testTransformEmpty(): void $result = $transformer->transform( new Planning(), - (new Talk())->setLanguageCode('fr'), + new Talk()->setLanguageCode('fr'), new Event(), new \ArrayObject([new Speaker()]), ); diff --git a/tests/unit/AppBundle/MembershipFee/MembershipFeeServiceTest.php b/tests/unit/AppBundle/MembershipFee/MembershipFeeServiceTest.php index 0721883cc..ba60a12b8 100644 --- a/tests/unit/AppBundle/MembershipFee/MembershipFeeServiceTest.php +++ b/tests/unit/AppBundle/MembershipFee/MembershipFeeServiceTest.php @@ -30,8 +30,8 @@ public static function generateCotisationProvider(): array 'expected' => new \DateTime('+1 year'), ], 'La cotisation précédente expire dans 1 mois, la nouvelle cotisation doit expirer dans 13 mois' => [ - 'dateFin' => (new \DateTimeImmutable('+1 month'))->setTime(14, 0), - 'expected' => (new \DateTimeImmutable('+1 month'))->setTime(14, 0)->add(new \DateInterval('P1Y')), + 'dateFin' => new \DateTimeImmutable('+1 month')->setTime(14, 0), + 'expected' => new \DateTimeImmutable('+1 month')->setTime(14, 0)->add(new \DateInterval('P1Y')), ], ]; } diff --git a/tests/unit/AppBundle/Notifier/SlackNotifierTest.php b/tests/unit/AppBundle/Notifier/SlackNotifierTest.php index c1737498d..898e14ac6 100644 --- a/tests/unit/AppBundle/Notifier/SlackNotifierTest.php +++ b/tests/unit/AppBundle/Notifier/SlackNotifierTest.php @@ -38,7 +38,7 @@ public function testSendMessage(): void $message->setUsername("m3"); $message->setIconUrl("m4"); $message->addAttachment( - (new Attachment()) + new Attachment() ->setText("a1") ->setTitle("a2") ->setColor("a3") @@ -50,7 +50,7 @@ public function testSendMessage(): void ->setPretext("a9") ->setTitleLink("a10") ->addField( - (new Field()) + new Field() ->setTitle("f1") ->setValue("f2") ->setShort(true), diff --git a/tests/unit/AppBundle/SocialNetwork/SocialNetworkTest.php b/tests/unit/AppBundle/SocialNetwork/SocialNetworkTest.php index e948401ba..7ac597a9d 100644 --- a/tests/unit/AppBundle/SocialNetwork/SocialNetworkTest.php +++ b/tests/unit/AppBundle/SocialNetwork/SocialNetworkTest.php @@ -25,25 +25,25 @@ public static function speakerHandleDataProvider(): \Generator { yield 'bluesky without @ prefix' => [ SocialNetwork::Bluesky, - (new Speaker())->setBluesky('foo.bar'), + new Speaker()->setBluesky('foo.bar'), '@foo.bar', ]; yield 'bluesky with @ prefix' => [ SocialNetwork::Bluesky, - (new Speaker())->setBluesky('@foo.bar'), + new Speaker()->setBluesky('@foo.bar'), '@foo.bar', ]; yield 'mastodon without @ prefix' => [ SocialNetwork::Mastodon, - (new Speaker())->setMastodon('foo.bar'), + new Speaker()->setMastodon('foo.bar'), '@foo.bar', ]; yield 'mastodon with @ prefix' => [ SocialNetwork::Mastodon, - (new Speaker())->setMastodon('@foo.bar'), + new Speaker()->setMastodon('@foo.bar'), '@foo.bar', ]; } diff --git a/tests/unit/AppBundle/TechLetter/Model/TechLetterFactoryTest.php b/tests/unit/AppBundle/TechLetter/Model/TechLetterFactoryTest.php index db8f290f8..c202536c3 100644 --- a/tests/unit/AppBundle/TechLetter/Model/TechLetterFactoryTest.php +++ b/tests/unit/AppBundle/TechLetter/Model/TechLetterFactoryTest.php @@ -27,7 +27,7 @@ public function testCreateTechLetterFromJson(?string $jsonFilePath, TechLetter $ self::assertIsString($json); } - $actualTechLetter = (new TechLetterFactory(new MapperBuilder()))->createTechLetterFromJson($json); + $actualTechLetter = new TechLetterFactory(new MapperBuilder())->createTechLetterFromJson($json); self::assertEquals($expectedTechLetter, $actualTechLetter); } diff --git a/tests/unit/AppBundle/VideoNotifier/StatusGeneratorTest.php b/tests/unit/AppBundle/VideoNotifier/StatusGeneratorTest.php index ac37e9ded..354edc378 100644 --- a/tests/unit/AppBundle/VideoNotifier/StatusGeneratorTest.php +++ b/tests/unit/AppBundle/VideoNotifier/StatusGeneratorTest.php @@ -44,18 +44,18 @@ public static function textTooLongDataProvider(): \Generator { yield [ SocialNetwork::Bluesky, - (new Talk())->setTitle(self::faker()->realText(SocialNetwork::Bluesky->statusMaxLength() * 2)), + new Talk()->setTitle(self::faker()->realText(SocialNetwork::Bluesky->statusMaxLength() * 2)), [ - (new Speaker())->setBluesky(self::faker()->domainName()), + new Speaker()->setBluesky(self::faker()->domainName()), ], 'Statut généré pour bluesky trop long', ]; yield [ SocialNetwork::Mastodon, - (new Talk())->setTitle(self::faker()->realText(SocialNetwork::Mastodon->statusMaxLength() * 2)), + new Talk()->setTitle(self::faker()->realText(SocialNetwork::Mastodon->statusMaxLength() * 2)), [ - (new Speaker())->setMastodon(self::faker()->domainName()), + new Speaker()->setMastodon(self::faker()->domainName()), ], 'Statut généré pour mastodon trop long', ]; @@ -79,17 +79,17 @@ public static function validStatusDataProvider(): \Generator { yield 'mastodon full case' => [ SocialNetwork::Mastodon, - (new Talk()) + new Talk() ->setId(123) ->setTitle('Lorem ipsum dolor si amet') ->setAbstract('Foo bar') ->setYoutubeId('abcd1234'), [ - (new Speaker())->setMastodon('foo'), - (new Speaker())->setFirstname('John')->setLastname('Smith'), - (new Speaker())->setMastodon('bar'), - (new Speaker())->setFirstname('Jane')->setLastname('Doe'), - (new Speaker())->setMastodon('fiz'), + new Speaker()->setMastodon('foo'), + new Speaker()->setFirstname('John')->setLastname('Smith'), + new Speaker()->setMastodon('bar'), + new Speaker()->setFirstname('Jane')->setLastname('Doe'), + new Speaker()->setMastodon('fiz'), ], new Status( "« Lorem ipsum dolor si amet », la conférence de @foo, John SMITH, @bar, Jane DOE et @fiz à revoir sur le site de l'AFUP", @@ -104,13 +104,13 @@ public static function validStatusDataProvider(): \Generator yield '1 speaker with username' => [ SocialNetwork::Bluesky, - (new Talk()) + new Talk() ->setId(123) ->setTitle('Lorem ipsum dolor si amet') ->setAbstract('Foo bar') ->setYoutubeId('abcd1234'), [ - (new Speaker())->setBluesky('example.bsky.social'), + new Speaker()->setBluesky('example.bsky.social'), ], new Status( "« Lorem ipsum dolor si amet », la conférence de @example.bsky.social à revoir sur le site de l'AFUP", @@ -125,13 +125,13 @@ public static function validStatusDataProvider(): \Generator yield '1 speaker without username' => [ SocialNetwork::Bluesky, - (new Talk()) + new Talk() ->setId(123) ->setTitle('Lorem ipsum dolor si amet') ->setAbstract('Foo bar') ->setYoutubeId('abcd1234'), [ - (new Speaker())->setFirstname('Jane')->setLastname('Doe'), + new Speaker()->setFirstname('Jane')->setLastname('Doe'), ], new Status( "« Lorem ipsum dolor si amet », la conférence de Jane DOE à revoir sur le site de l'AFUP", @@ -146,14 +146,14 @@ public static function validStatusDataProvider(): \Generator yield '2 speakers' => [ SocialNetwork::Bluesky, - (new Talk()) + new Talk() ->setId(123) ->setTitle('Lorem ipsum dolor si amet') ->setAbstract('Foo bar') ->setYoutubeId('abcd1234'), [ - (new Speaker())->setBluesky('foo'), - (new Speaker())->setBluesky('bar'), + new Speaker()->setBluesky('foo'), + new Speaker()->setBluesky('bar'), ], new Status( "« Lorem ipsum dolor si amet », la conférence de @foo et @bar à revoir sur le site de l'AFUP", @@ -168,15 +168,15 @@ public static function validStatusDataProvider(): \Generator yield '3+ speakers' => [ SocialNetwork::Bluesky, - (new Talk()) + new Talk() ->setId(123) ->setTitle('Lorem ipsum dolor si amet') ->setAbstract('Foo bar') ->setYoutubeId('abcd1234'), [ - (new Speaker())->setBluesky('foo'), - (new Speaker())->setBluesky('bar'), - (new Speaker())->setBluesky('fiz'), + new Speaker()->setBluesky('foo'), + new Speaker()->setBluesky('bar'), + new Speaker()->setBluesky('fiz'), ], new Status( "« Lorem ipsum dolor si amet », la conférence de @foo, @bar et @fiz à revoir sur le site de l'AFUP", @@ -191,13 +191,13 @@ public static function validStatusDataProvider(): \Generator yield 'title a bit too long 1' => [ SocialNetwork::Bluesky, - (new Talk()) + new Talk() ->setId(123) ->setTitle('Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab accusantium architecto assumenda consequuntur corporis dolorem doloremque eaque magnam mollitia necessitatibus neque nesciunt, obcaecati odio odit quam, repellat repellendus.') ->setAbstract('Foo bar') ->setYoutubeId('abcd1234'), [ - (new Speaker())->setBluesky('example.bsky.social'), + new Speaker()->setBluesky('example.bsky.social'), ], new Status( "« Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab accusantium architecto assumenda consequuntur corporis dolorem doloremque eaque magnam mollitia necessitatibus neque nesciunt, obcaecati odio odit quam, repellat repellendus. », par @example.bsky.social à revoir sur le site de l'AFUP", @@ -212,13 +212,13 @@ public static function validStatusDataProvider(): \Generator yield 'title a bit too long 2' => [ SocialNetwork::Bluesky, - (new Talk()) + new Talk() ->setId(123) ->setTitle('Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab accusantium architecto assumenda consequuntur corporis dolorem doloremque eaque magnam mollitia necessitatibus neque nesciunt, obcaecati odio odit quam, repellat repellendus magnam.') ->setAbstract('Foo bar') ->setYoutubeId('abcd1234'), [ - (new Speaker())->setBluesky('example.bsky.social'), + new Speaker()->setBluesky('example.bsky.social'), ], new Status( "« Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab accusantium architecto assumenda consequuntur corporis dolorem doloremque eaque magnam mollitia necessitatibus neque nesciunt, obcaecati odio odit quam, repellat repellendus magnam. », par @example.bsky.social à revoir sur l'AFUP", @@ -233,13 +233,13 @@ public static function validStatusDataProvider(): \Generator yield 'title with consecutive spaces' => [ SocialNetwork::Bluesky, - (new Talk()) + new Talk() ->setId(123) ->setTitle(' Lorem ipsum ') ->setAbstract('Foo bar') ->setYoutubeId('abcd1234'), [ - (new Speaker())->setBluesky('example.bsky.social'), + new Speaker()->setBluesky('example.bsky.social'), ], new Status( "« Lorem ipsum », la conférence de @example.bsky.social à revoir sur le site de l'AFUP",