diff --git a/CHANGELOG.md b/CHANGELOG.md index e1fbab42..e79dc14e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Latest ------ ## Changes +* [#149](https://github.com/cleverage/process-bundle/issues/149) Apply Symfony best practices to the tasks and transformers services: they are defined explicitly (no more autowiring, autoconfiguration nor bindings in the bundle), with `cleverage_process.task.*` / `cleverage_process.transformer.*` ids (private) and a public alias named after their class, so the `service: '@CleverAge\ProcessBundle\Task\...'` references, the autowiring of the transformers by class and `$container->get()` keep working. Same arguments, tags and `shared` settings as before (generated from the previously autowired definitions). Update documentation. * [#275](https://github.com/cleverage/process-bundle/issues/275) The tasks are fetched from a service locator built at compile time from the services referenced by the process configurations (new `TaskRegistry`, `cleverage_process.registry.task`, and internal `TaskLocatorCompilerPass`) instead of the whole service container: a task service can be private. `ProcessManager` and `ProcessHelpCommand` get the registry as a new optional last constructor argument; not passing it is deprecated (the tasks are then fetched from the container), and fetching a task service not referenced by the process configurations known at compile time falls back on the container with a deprecation. Both fallbacks will be removed in v6.0 (#114). Update documentation, add tests. * [#278](https://github.com/cleverage/process-bundle/issues/278) The container no longer fails to compile when the Symfony serializer or validator is not enabled: the tasks and transformers depending on them (`NormalizerTask`, `DenormalizerTask`, `SerializerTask`, `DeserializerTask`, `normalize` and `denormalize` transformers, `ValidatorTask`) are replaced by services failing with an explicit message when they are used (new internal `UnavailableServicesCompilerPass`). `CheckSerializerCompilerPass` is no longer used and deprecated. Update documentation, add tests. * [#272](https://github.com/cleverage/process-bundle/issues/272) DependencyInjection: autoconfiguration of the services implementing `TaskInterface` (`public`, not shared, `monolog.logger` tag on `cleverage_process_task`) and `TransformerInterface` (`cleverage.transformer` tag, `monolog.logger` tag on `cleverage_process_transformer`): the `_instanceof` rules or explicit tags are no longer needed with `autoconfigure: true`; a setting explicitly defined on a service wins. Add FQCN aliases to autowire `ProcessManager`, `ProcessConfigurationRegistry`, `TransformerRegistry` and `ContextualOptionResolver`. Update documentation, add tests. diff --git a/config/services/task.yaml b/config/services/task.yaml index e94b034d..38b3ce38 100644 --- a/config/services/task.yaml +++ b/config/services/task.yaml @@ -1,15 +1,478 @@ services: _defaults: - bind: - $processManager: '@cleverage_process.manager.process' - $processRegistry: '@cleverage_process.registry.process_configuration' - $transformerRegistry: '@cleverage_process.registry.transformer' + public: false + tags: + - { name: monolog.logger, channel: cleverage_process_task } - CleverAge\ProcessBundle\Task\: - resource: '../../src/Task/*' - exclude: '../../src/Task/UnavailableTask.php' - autowire: true + cleverage_process.task.aggregate_iterable: + class: CleverAge\ProcessBundle\Task\AggregateIterableTask + shared: false + CleverAge\ProcessBundle\Task\AggregateIterableTask: + alias: cleverage_process.task.aggregate_iterable public: true + + cleverage_process.task.array_merge: + class: CleverAge\ProcessBundle\Task\ArrayMergeTask shared: false - tags: - - { name: monolog.logger, channel: cleverage_process_task } + CleverAge\ProcessBundle\Task\ArrayMergeTask: + alias: cleverage_process.task.array_merge + public: true + + cleverage_process.task.column_aggregator: + class: CleverAge\ProcessBundle\Task\ColumnAggregatorTask + shared: false + arguments: + - '@property_accessor' + - '@logger' + CleverAge\ProcessBundle\Task\ColumnAggregatorTask: + alias: cleverage_process.task.column_aggregator + public: true + + cleverage_process.task.constant_iterable_output: + class: CleverAge\ProcessBundle\Task\ConstantIterableOutputTask + shared: false + CleverAge\ProcessBundle\Task\ConstantIterableOutputTask: + alias: cleverage_process.task.constant_iterable_output + public: true + + cleverage_process.task.constant_output: + class: CleverAge\ProcessBundle\Task\ConstantOutputTask + shared: false + CleverAge\ProcessBundle\Task\ConstantOutputTask: + alias: cleverage_process.task.constant_output + public: true + + cleverage_process.task.counter: + class: CleverAge\ProcessBundle\Task\CounterTask + shared: false + CleverAge\ProcessBundle\Task\CounterTask: + alias: cleverage_process.task.counter + public: true + + cleverage_process.task.debug: + class: CleverAge\ProcessBundle\Task\Debug\DebugTask + shared: false + CleverAge\ProcessBundle\Task\Debug\DebugTask: + alias: cleverage_process.task.debug + public: true + + cleverage_process.task.die: + class: CleverAge\ProcessBundle\Task\Debug\DieTask + shared: false + CleverAge\ProcessBundle\Task\Debug\DieTask: + alias: cleverage_process.task.die + public: true + + cleverage_process.task.error_forwarder: + class: CleverAge\ProcessBundle\Task\Debug\ErrorForwarderTask + shared: false + CleverAge\ProcessBundle\Task\Debug\ErrorForwarderTask: + alias: cleverage_process.task.error_forwarder + public: true + + cleverage_process.task.stopwatch: + class: CleverAge\ProcessBundle\Task\Debug\StopwatchTask + shared: false + arguments: + - '@logger' + - '@debug.stopwatch' + CleverAge\ProcessBundle\Task\Debug\StopwatchTask: + alias: cleverage_process.task.stopwatch + public: true + + cleverage_process.task.dummy: + class: CleverAge\ProcessBundle\Task\DummyTask + shared: false + CleverAge\ProcessBundle\Task\DummyTask: + alias: cleverage_process.task.dummy + public: true + + cleverage_process.task.event_dispatcher: + class: CleverAge\ProcessBundle\Task\Event\EventDispatcherTask + shared: false + arguments: + - '@event_dispatcher' + CleverAge\ProcessBundle\Task\Event\EventDispatcherTask: + alias: cleverage_process.task.event_dispatcher + public: true + + cleverage_process.task.csv_reader: + class: CleverAge\ProcessBundle\Task\File\Csv\CsvReaderTask + shared: false + arguments: + - '@logger' + CleverAge\ProcessBundle\Task\File\Csv\CsvReaderTask: + alias: cleverage_process.task.csv_reader + public: true + + cleverage_process.task.csv_splitter: + class: CleverAge\ProcessBundle\Task\File\Csv\CsvSplitterTask + shared: false + arguments: + - '@logger' + CleverAge\ProcessBundle\Task\File\Csv\CsvSplitterTask: + alias: cleverage_process.task.csv_splitter + public: true + + cleverage_process.task.csv_writer: + class: CleverAge\ProcessBundle\Task\File\Csv\CsvWriterTask + shared: false + CleverAge\ProcessBundle\Task\File\Csv\CsvWriterTask: + alias: cleverage_process.task.csv_writer + public: true + + cleverage_process.task.input_csv_reader: + class: CleverAge\ProcessBundle\Task\File\Csv\InputCsvReaderTask + shared: false + arguments: + - '@logger' + CleverAge\ProcessBundle\Task\File\Csv\InputCsvReaderTask: + alias: cleverage_process.task.input_csv_reader + public: true + + cleverage_process.task.file_mover: + class: CleverAge\ProcessBundle\Task\File\FileMoverTask + shared: false + CleverAge\ProcessBundle\Task\File\FileMoverTask: + alias: cleverage_process.task.file_mover + public: true + + cleverage_process.task.file_reader: + class: CleverAge\ProcessBundle\Task\File\FileReaderTask + shared: false + CleverAge\ProcessBundle\Task\File\FileReaderTask: + alias: cleverage_process.task.file_reader + public: true + + cleverage_process.task.file_remover: + class: CleverAge\ProcessBundle\Task\File\FileRemoverTask + shared: false + CleverAge\ProcessBundle\Task\File\FileRemoverTask: + alias: cleverage_process.task.file_remover + public: true + + cleverage_process.task.file_splitter: + class: CleverAge\ProcessBundle\Task\File\FileSplitterTask + shared: false + CleverAge\ProcessBundle\Task\File\FileSplitterTask: + alias: cleverage_process.task.file_splitter + public: true + + cleverage_process.task.file_writer: + class: CleverAge\ProcessBundle\Task\File\FileWriterTask + shared: false + CleverAge\ProcessBundle\Task\File\FileWriterTask: + alias: cleverage_process.task.file_writer + public: true + + cleverage_process.task.folder_browser: + class: CleverAge\ProcessBundle\Task\File\FolderBrowserTask + shared: false + arguments: + - '@logger' + CleverAge\ProcessBundle\Task\File\FolderBrowserTask: + alias: cleverage_process.task.folder_browser + public: true + + cleverage_process.task.input_file_reader: + class: CleverAge\ProcessBundle\Task\File\InputFileReaderTask + shared: false + CleverAge\ProcessBundle\Task\File\InputFileReaderTask: + alias: cleverage_process.task.input_file_reader + public: true + + cleverage_process.task.input_folder_browser: + class: CleverAge\ProcessBundle\Task\File\InputFolderBrowserTask + shared: false + arguments: + - '@logger' + CleverAge\ProcessBundle\Task\File\InputFolderBrowserTask: + alias: cleverage_process.task.input_folder_browser + public: true + + cleverage_process.task.input_line_reader: + class: CleverAge\ProcessBundle\Task\File\InputLineReaderTask + shared: false + CleverAge\ProcessBundle\Task\File\InputLineReaderTask: + alias: cleverage_process.task.input_line_reader + public: true + + cleverage_process.task.json_stream_reader: + class: CleverAge\ProcessBundle\Task\File\JsonStream\JsonStreamReaderTask + shared: false + CleverAge\ProcessBundle\Task\File\JsonStream\JsonStreamReaderTask: + alias: cleverage_process.task.json_stream_reader + public: true + + cleverage_process.task.json_stream_writer: + class: CleverAge\ProcessBundle\Task\File\JsonStream\JsonStreamWriterTask + shared: false + CleverAge\ProcessBundle\Task\File\JsonStream\JsonStreamWriterTask: + alias: cleverage_process.task.json_stream_writer + public: true + + cleverage_process.task.line_reader: + class: CleverAge\ProcessBundle\Task\File\LineReaderTask + shared: false + CleverAge\ProcessBundle\Task\File\LineReaderTask: + alias: cleverage_process.task.line_reader + public: true + + cleverage_process.task.xml_reader: + class: CleverAge\ProcessBundle\Task\File\Xml\XmlReaderTask + shared: false + arguments: + - '@logger' + CleverAge\ProcessBundle\Task\File\Xml\XmlReaderTask: + alias: cleverage_process.task.xml_reader + public: true + + cleverage_process.task.xml_stream_reader: + class: CleverAge\ProcessBundle\Task\File\Xml\XmlStreamReaderTask + shared: false + CleverAge\ProcessBundle\Task\File\Xml\XmlStreamReaderTask: + alias: cleverage_process.task.xml_stream_reader + public: true + + cleverage_process.task.xml_writer: + class: CleverAge\ProcessBundle\Task\File\Xml\XmlWriterTask + shared: false + arguments: + - '@logger' + CleverAge\ProcessBundle\Task\File\Xml\XmlWriterTask: + alias: cleverage_process.task.xml_writer + public: true + + cleverage_process.task.yaml_reader: + class: CleverAge\ProcessBundle\Task\File\Yaml\YamlReaderTask + shared: false + CleverAge\ProcessBundle\Task\File\Yaml\YamlReaderTask: + alias: cleverage_process.task.yaml_reader + public: true + + cleverage_process.task.yaml_writer: + class: CleverAge\ProcessBundle\Task\File\Yaml\YamlWriterTask + shared: false + CleverAge\ProcessBundle\Task\File\Yaml\YamlWriterTask: + alias: cleverage_process.task.yaml_writer + public: true + + cleverage_process.task.filter: + class: CleverAge\ProcessBundle\Task\FilterTask + shared: false + CleverAge\ProcessBundle\Task\FilterTask: + alias: cleverage_process.task.filter + public: true + + cleverage_process.task.group_by_aggregate_iterable: + class: CleverAge\ProcessBundle\Task\GroupByAggregateIterableTask + shared: false + arguments: + - '@property_accessor' + CleverAge\ProcessBundle\Task\GroupByAggregateIterableTask: + alias: cleverage_process.task.group_by_aggregate_iterable + public: true + + cleverage_process.task.input_aggregator: + class: CleverAge\ProcessBundle\Task\InputAggregatorTask + shared: false + CleverAge\ProcessBundle\Task\InputAggregatorTask: + alias: cleverage_process.task.input_aggregator + public: true + + cleverage_process.task.input_iterator: + class: CleverAge\ProcessBundle\Task\InputIteratorTask + shared: false + CleverAge\ProcessBundle\Task\InputIteratorTask: + alias: cleverage_process.task.input_iterator + public: true + + cleverage_process.task.iterable_batch: + class: CleverAge\ProcessBundle\Task\IterableBatchTask + shared: false + arguments: + - '@logger' + CleverAge\ProcessBundle\Task\IterableBatchTask: + alias: cleverage_process.task.iterable_batch + public: true + + cleverage_process.task.object_updater: + class: CleverAge\ProcessBundle\Task\ObjectUpdaterTask + shared: false + arguments: + - '@property_accessor' + CleverAge\ProcessBundle\Task\ObjectUpdaterTask: + alias: cleverage_process.task.object_updater + public: true + + cleverage_process.task.command_runner: + class: CleverAge\ProcessBundle\Task\Process\CommandRunnerTask + shared: false + arguments: + - '@kernel' + CleverAge\ProcessBundle\Task\Process\CommandRunnerTask: + alias: cleverage_process.task.command_runner + public: true + + cleverage_process.task.process_executor: + class: CleverAge\ProcessBundle\Task\Process\ProcessExecutorTask + shared: false + arguments: + - '@cleverage_process.manager.process' + - '@cleverage_process.registry.process_configuration' + - '@logger' + CleverAge\ProcessBundle\Task\Process\ProcessExecutorTask: + alias: cleverage_process.task.process_executor + public: true + + cleverage_process.task.process_launcher: + class: CleverAge\ProcessBundle\Task\Process\ProcessLauncherTask + shared: false + arguments: + - '@logger' + - '@cleverage_process.registry.process_configuration' + - '@kernel' + CleverAge\ProcessBundle\Task\Process\ProcessLauncherTask: + alias: cleverage_process.task.process_launcher + public: true + + cleverage_process.task.property_getter: + class: CleverAge\ProcessBundle\Task\PropertyGetterTask + shared: false + arguments: + - '@logger' + - '@property_accessor' + CleverAge\ProcessBundle\Task\PropertyGetterTask: + alias: cleverage_process.task.property_getter + public: true + + cleverage_process.task.property_setter: + class: CleverAge\ProcessBundle\Task\PropertySetterTask + shared: false + arguments: + - '@logger' + - '@property_accessor' + CleverAge\ProcessBundle\Task\PropertySetterTask: + alias: cleverage_process.task.property_setter + public: true + + cleverage_process.task.advanced_stat_counter: + class: CleverAge\ProcessBundle\Task\Reporting\AdvancedStatCounterTask + shared: false + arguments: + - '@logger' + CleverAge\ProcessBundle\Task\Reporting\AdvancedStatCounterTask: + alias: cleverage_process.task.advanced_stat_counter + public: true + + cleverage_process.task.logger: + class: CleverAge\ProcessBundle\Task\Reporting\LoggerTask + shared: false + arguments: + - '@logger' + - '@property_accessor' + CleverAge\ProcessBundle\Task\Reporting\LoggerTask: + alias: cleverage_process.task.logger + public: true + + cleverage_process.task.stat_counter: + class: CleverAge\ProcessBundle\Task\Reporting\StatCounterTask + shared: false + arguments: + - '@logger' + CleverAge\ProcessBundle\Task\Reporting\StatCounterTask: + alias: cleverage_process.task.stat_counter + public: true + + cleverage_process.task.row_aggregator: + class: CleverAge\ProcessBundle\Task\RowAggregatorTask + shared: false + arguments: + - '@logger' + CleverAge\ProcessBundle\Task\RowAggregatorTask: + alias: cleverage_process.task.row_aggregator + public: true + + cleverage_process.task.denormalizer: + class: CleverAge\ProcessBundle\Task\Serialization\DenormalizerTask + shared: false + arguments: + - '@serializer' + CleverAge\ProcessBundle\Task\Serialization\DenormalizerTask: + alias: cleverage_process.task.denormalizer + public: true + + cleverage_process.task.deserializer: + class: CleverAge\ProcessBundle\Task\Serialization\DeserializerTask + shared: false + arguments: + - '@serializer' + CleverAge\ProcessBundle\Task\Serialization\DeserializerTask: + alias: cleverage_process.task.deserializer + public: true + + cleverage_process.task.normalizer: + class: CleverAge\ProcessBundle\Task\Serialization\NormalizerTask + shared: false + arguments: + - '@serializer' + CleverAge\ProcessBundle\Task\Serialization\NormalizerTask: + alias: cleverage_process.task.normalizer + public: true + + cleverage_process.task.serializer: + class: CleverAge\ProcessBundle\Task\Serialization\SerializerTask + shared: false + arguments: + - '@serializer' + CleverAge\ProcessBundle\Task\Serialization\SerializerTask: + alias: cleverage_process.task.serializer + public: true + + cleverage_process.task.simple_batch: + class: CleverAge\ProcessBundle\Task\SimpleBatchTask + shared: false + CleverAge\ProcessBundle\Task\SimpleBatchTask: + alias: cleverage_process.task.simple_batch + public: true + + cleverage_process.task.skip_empty: + class: CleverAge\ProcessBundle\Task\SkipEmptyTask + shared: false + CleverAge\ProcessBundle\Task\SkipEmptyTask: + alias: cleverage_process.task.skip_empty + public: true + + cleverage_process.task.split_join_line: + class: CleverAge\ProcessBundle\Task\SplitJoinLineTask + shared: false + CleverAge\ProcessBundle\Task\SplitJoinLineTask: + alias: cleverage_process.task.split_join_line + public: true + + cleverage_process.task.stop: + class: CleverAge\ProcessBundle\Task\StopTask + shared: false + CleverAge\ProcessBundle\Task\StopTask: + alias: cleverage_process.task.stop + public: true + + cleverage_process.task.transformer: + class: CleverAge\ProcessBundle\Task\TransformerTask + shared: false + arguments: + - '@logger' + - '@cleverage_process.registry.transformer' + CleverAge\ProcessBundle\Task\TransformerTask: + alias: cleverage_process.task.transformer + public: true + + cleverage_process.task.validator: + class: CleverAge\ProcessBundle\Task\Validation\ValidatorTask + shared: false + arguments: + - '@logger' + - '@validator' + CleverAge\ProcessBundle\Task\Validation\ValidatorTask: + alias: cleverage_process.task.validator + public: true diff --git a/config/services/transformer.yaml b/config/services/transformer.yaml index 3f3ab9dc..aafa4cf0 100644 --- a/config/services/transformer.yaml +++ b/config/services/transformer.yaml @@ -1,17 +1,255 @@ services: _defaults: - bind: - $language: '@cleverage_process.expression_language' - $transformerRegistry: '@cleverage_process.registry.transformer' - - CleverAge\ProcessBundle\Transformer\: - resource: '../../src/Transformer/*' - exclude: - - '../../src/Transformer/GenericTransformer.php' - - '../../src/Transformer/UnavailableTransformer.php' - autowire: true - autoconfigure: true - public: true + public: false tags: - { name: cleverage.transformer } - { name: monolog.logger, channel: cleverage_process_transformer } + + cleverage_process.transformer.array_element: + class: CleverAge\ProcessBundle\Transformer\Array\ArrayElementTransformer + CleverAge\ProcessBundle\Transformer\Array\ArrayElementTransformer: + alias: cleverage_process.transformer.array_element + public: true + + cleverage_process.transformer.array_filter: + class: CleverAge\ProcessBundle\Transformer\Array\ArrayFilterTransformer + arguments: + - '@property_accessor' + CleverAge\ProcessBundle\Transformer\Array\ArrayFilterTransformer: + alias: cleverage_process.transformer.array_filter + public: true + + cleverage_process.transformer.array_first: + class: CleverAge\ProcessBundle\Transformer\Array\ArrayFirstTransformer + CleverAge\ProcessBundle\Transformer\Array\ArrayFirstTransformer: + alias: cleverage_process.transformer.array_first + public: true + + cleverage_process.transformer.array_last: + class: CleverAge\ProcessBundle\Transformer\Array\ArrayLastTransformer + CleverAge\ProcessBundle\Transformer\Array\ArrayLastTransformer: + alias: cleverage_process.transformer.array_last + public: true + + cleverage_process.transformer.array_map: + class: CleverAge\ProcessBundle\Transformer\Array\ArrayMapTransformer + arguments: + - '@cleverage_process.registry.transformer' + CleverAge\ProcessBundle\Transformer\Array\ArrayMapTransformer: + alias: cleverage_process.transformer.array_map + public: true + + cleverage_process.transformer.array_unset: + class: CleverAge\ProcessBundle\Transformer\Array\ArrayUnsetTransformer + CleverAge\ProcessBundle\Transformer\Array\ArrayUnsetTransformer: + alias: cleverage_process.transformer.array_unset + public: true + + cleverage_process.transformer.cached: + class: CleverAge\ProcessBundle\Transformer\CachedTransformer + arguments: + - '@cleverage_process.registry.transformer' + - '@cache.app' + - '@logger' + CleverAge\ProcessBundle\Transformer\CachedTransformer: + alias: cleverage_process.transformer.cached + public: true + + cleverage_process.transformer.callback: + class: CleverAge\ProcessBundle\Transformer\CallbackTransformer + CleverAge\ProcessBundle\Transformer\CallbackTransformer: + alias: cleverage_process.transformer.callback + public: true + + cleverage_process.transformer.cast: + class: CleverAge\ProcessBundle\Transformer\CastTransformer + CleverAge\ProcessBundle\Transformer\CastTransformer: + alias: cleverage_process.transformer.cast + public: true + + cleverage_process.transformer.constant: + class: CleverAge\ProcessBundle\Transformer\ConstantTransformer + CleverAge\ProcessBundle\Transformer\ConstantTransformer: + alias: cleverage_process.transformer.constant + public: true + + cleverage_process.transformer.convert_value: + class: CleverAge\ProcessBundle\Transformer\ConvertValueTransformer + CleverAge\ProcessBundle\Transformer\ConvertValueTransformer: + alias: cleverage_process.transformer.convert_value + public: true + + cleverage_process.transformer.date_format: + class: CleverAge\ProcessBundle\Transformer\Date\DateFormatTransformer + CleverAge\ProcessBundle\Transformer\Date\DateFormatTransformer: + alias: cleverage_process.transformer.date_format + public: true + + cleverage_process.transformer.date_parser: + class: CleverAge\ProcessBundle\Transformer\Date\DateParserTransformer + CleverAge\ProcessBundle\Transformer\Date\DateParserTransformer: + alias: cleverage_process.transformer.date_parser + public: true + + cleverage_process.transformer.debug: + class: CleverAge\ProcessBundle\Transformer\DebugTransformer + CleverAge\ProcessBundle\Transformer\DebugTransformer: + alias: cleverage_process.transformer.debug + public: true + + cleverage_process.transformer.default: + class: CleverAge\ProcessBundle\Transformer\DefaultTransformer + CleverAge\ProcessBundle\Transformer\DefaultTransformer: + alias: cleverage_process.transformer.default + public: true + + cleverage_process.transformer.evaluator: + class: CleverAge\ProcessBundle\Transformer\EvaluatorTransformer + CleverAge\ProcessBundle\Transformer\EvaluatorTransformer: + alias: cleverage_process.transformer.evaluator + public: true + + cleverage_process.transformer.expression_language_map: + class: CleverAge\ProcessBundle\Transformer\ExpressionLanguageMapTransformer + arguments: + - '@cleverage_process.expression_language' + CleverAge\ProcessBundle\Transformer\ExpressionLanguageMapTransformer: + alias: cleverage_process.transformer.expression_language_map + public: true + + cleverage_process.transformer.mapping: + class: CleverAge\ProcessBundle\Transformer\MappingTransformer + arguments: + - '@cleverage_process.registry.transformer' + - '@logger' + - '@property_accessor' + CleverAge\ProcessBundle\Transformer\MappingTransformer: + alias: cleverage_process.transformer.mapping + public: true + + cleverage_process.transformer.multi_replace: + class: CleverAge\ProcessBundle\Transformer\MultiReplaceTransformer + CleverAge\ProcessBundle\Transformer\MultiReplaceTransformer: + alias: cleverage_process.transformer.multi_replace + public: true + + cleverage_process.transformer.instantiate: + class: CleverAge\ProcessBundle\Transformer\Object\InstantiateTransformer + CleverAge\ProcessBundle\Transformer\Object\InstantiateTransformer: + alias: cleverage_process.transformer.instantiate + public: true + + cleverage_process.transformer.property_accessor: + class: CleverAge\ProcessBundle\Transformer\Object\PropertyAccessorTransformer + arguments: + - '@property_accessor' + CleverAge\ProcessBundle\Transformer\Object\PropertyAccessorTransformer: + alias: cleverage_process.transformer.property_accessor + public: true + + cleverage_process.transformer.recursive_property_setter: + class: CleverAge\ProcessBundle\Transformer\Object\RecursivePropertySetterTransformer + arguments: + - '@property_accessor' + CleverAge\ProcessBundle\Transformer\Object\RecursivePropertySetterTransformer: + alias: cleverage_process.transformer.recursive_property_setter + public: true + + cleverage_process.transformer.preg_filter: + class: CleverAge\ProcessBundle\Transformer\PregFilterTransformer + CleverAge\ProcessBundle\Transformer\PregFilterTransformer: + alias: cleverage_process.transformer.preg_filter + public: true + + cleverage_process.transformer.rules: + class: CleverAge\ProcessBundle\Transformer\RulesTransformer + arguments: + - '@cleverage_process.registry.transformer' + - '@cleverage_process.expression_language' + CleverAge\ProcessBundle\Transformer\RulesTransformer: + alias: cleverage_process.transformer.rules + public: true + + cleverage_process.transformer.denormalize: + class: CleverAge\ProcessBundle\Transformer\Serialization\DenormalizeTransformer + arguments: + - '@serializer' + CleverAge\ProcessBundle\Transformer\Serialization\DenormalizeTransformer: + alias: cleverage_process.transformer.denormalize + public: true + + cleverage_process.transformer.normalize: + class: CleverAge\ProcessBundle\Transformer\Serialization\NormalizeTransformer + arguments: + - '@serializer' + CleverAge\ProcessBundle\Transformer\Serialization\NormalizeTransformer: + alias: cleverage_process.transformer.normalize + public: true + + cleverage_process.transformer.explode: + class: CleverAge\ProcessBundle\Transformer\String\ExplodeTransformer + CleverAge\ProcessBundle\Transformer\String\ExplodeTransformer: + alias: cleverage_process.transformer.explode + public: true + + cleverage_process.transformer.hash: + class: CleverAge\ProcessBundle\Transformer\String\HashTransformer + CleverAge\ProcessBundle\Transformer\String\HashTransformer: + alias: cleverage_process.transformer.hash + public: true + + cleverage_process.transformer.implode: + class: CleverAge\ProcessBundle\Transformer\String\ImplodeTransformer + CleverAge\ProcessBundle\Transformer\String\ImplodeTransformer: + alias: cleverage_process.transformer.implode + public: true + + cleverage_process.transformer.preg_match: + class: CleverAge\ProcessBundle\Transformer\String\PregMatchTransformer + CleverAge\ProcessBundle\Transformer\String\PregMatchTransformer: + alias: cleverage_process.transformer.preg_match + public: true + + cleverage_process.transformer.slugify: + class: CleverAge\ProcessBundle\Transformer\String\SlugifyTransformer + CleverAge\ProcessBundle\Transformer\String\SlugifyTransformer: + alias: cleverage_process.transformer.slugify + public: true + + cleverage_process.transformer.sprintf: + class: CleverAge\ProcessBundle\Transformer\String\SprintfTransformer + CleverAge\ProcessBundle\Transformer\String\SprintfTransformer: + alias: cleverage_process.transformer.sprintf + public: true + + cleverage_process.transformer.trim: + class: CleverAge\ProcessBundle\Transformer\String\TrimTransformer + CleverAge\ProcessBundle\Transformer\String\TrimTransformer: + alias: cleverage_process.transformer.trim + public: true + + cleverage_process.transformer.type_setter: + class: CleverAge\ProcessBundle\Transformer\TypeSetterTransformer + CleverAge\ProcessBundle\Transformer\TypeSetterTransformer: + alias: cleverage_process.transformer.type_setter + public: true + + cleverage_process.transformer.unset: + class: CleverAge\ProcessBundle\Transformer\UnsetTransformer + arguments: + - '@property_accessor' + CleverAge\ProcessBundle\Transformer\UnsetTransformer: + alias: cleverage_process.transformer.unset + public: true + + cleverage_process.transformer.wrapper: + class: CleverAge\ProcessBundle\Transformer\WrapperTransformer + CleverAge\ProcessBundle\Transformer\WrapperTransformer: + alias: cleverage_process.transformer.wrapper + public: true + + cleverage_process.transformer.xpath_evaluator: + class: CleverAge\ProcessBundle\Transformer\Xml\XpathEvaluatorTransformer + CleverAge\ProcessBundle\Transformer\Xml\XpathEvaluatorTransformer: + alias: cleverage_process.transformer.xpath_evaluator + public: true diff --git a/docs/reference/02-task_definition.md b/docs/reference/02-task_definition.md index 36243957..bcec492f 100644 --- a/docs/reference/02-task_definition.md +++ b/docs/reference/02-task_definition.md @@ -32,9 +32,10 @@ service: '@CleverAge\ArchiveProcessBundle\Task\UnzipTask' # alias, with service: CleverAge\ArchiveProcessBundle\Task\UnzipTask # alias, without @ ``` -The tasks of this bundle are registered with their class name as id (e.g. `'@CleverAge\ProcessBundle\Task\TransformerTask'`), -the tasks of the bridge bundles with a `cleverage_*_process.task.*` id and an alias named after their class, and your -own task services with any id or alias you choose. With an unknown service, a reference with `@` throws the +The tasks of this bundle and of the bridge bundles are registered with a `cleverage_process.task.*` / +`cleverage_*_process.task.*` id and an alias named after their class (e.g. `cleverage_process.task.transformer` and +`'@CleverAge\ProcessBundle\Task\TransformerTask'`, the class name being the reference used in this documentation), and +your own task services with any id or alias you choose. With an unknown service, a reference with `@` throws the `ServiceNotFoundException` of the service container, a reference without `@` an `\UnexpectedValueException` (`Unable to resolve service reference for Task ''`). diff --git a/src/DependencyInjection/Compiler/UnavailableServicesCompilerPass.php b/src/DependencyInjection/Compiler/UnavailableServicesCompilerPass.php index d9ddbea0..d7b381f1 100644 --- a/src/DependencyInjection/Compiler/UnavailableServicesCompilerPass.php +++ b/src/DependencyInjection/Compiler/UnavailableServicesCompilerPass.php @@ -60,19 +60,20 @@ public function process(ContainerBuilder $container): void } /** - * @param list $ids + * @param list $classes the services are registered with an alias named after their class */ - private function replace(ContainerBuilder $container, string $message, array $ids): void + private function replace(ContainerBuilder $container, string $message, array $classes): void { - foreach ($ids as $id) { + foreach ($classes as $class) { + $id = $container->hasAlias($class) ? (string) $container->getAlias($class) : $class; if (!$container->hasDefinition($id)) { continue; } $original = $container->getDefinition($id); - $text = \sprintf($message, $id); - if (is_a($id, TransformerInterface::class, true)) { + $text = \sprintf($message, $class); + if (is_a($class, TransformerInterface::class, true)) { // The code is needed by the transformer registry: the bundle transformers return a constant - $code = (new \ReflectionClass($id))->newInstanceWithoutConstructor()->getCode(); + $code = (new \ReflectionClass($class))->newInstanceWithoutConstructor()->getCode(); $definition = new Definition(UnavailableTransformer::class, [$code, $text]); } else { $definition = new Definition(UnavailableTask::class, [$text]); diff --git a/tests/DependencyInjection/CleverAgeProcessExtensionTest.php b/tests/DependencyInjection/CleverAgeProcessExtensionTest.php index 74c5f496..3194aae2 100644 --- a/tests/DependencyInjection/CleverAgeProcessExtensionTest.php +++ b/tests/DependencyInjection/CleverAgeProcessExtensionTest.php @@ -115,8 +115,8 @@ public function testTasksAndTransformersAreAutoconfigured(): void self::assertSame([[]], $transformer->getTag('cleverage.transformer'), $id); self::assertSame([['channel' => 'cleverage_process_transformer']], $transformer->getTag('monolog.logger'), $id); } - // The bundle transformers (autoconfigured, tagged explicitly) are not tagged twice - self::assertSame([[]], $container->getDefinition(TrimTransformer::class)->getTag('cleverage.transformer')); + // The bundle transformers (explicitly defined and tagged, not autoconfigured) are tagged once + self::assertSame([[]], $container->findDefinition(TrimTransformer::class)->getTag('cleverage.transformer')); } public function testStopCheckersAreInjectedInTheProcessManager(): void diff --git a/tests/DependencyInjection/Compiler/UnavailableServicesCompilerPassTest.php b/tests/DependencyInjection/Compiler/UnavailableServicesCompilerPassTest.php index 205662b1..a420899b 100644 --- a/tests/DependencyInjection/Compiler/UnavailableServicesCompilerPassTest.php +++ b/tests/DependencyInjection/Compiler/UnavailableServicesCompilerPassTest.php @@ -45,7 +45,7 @@ public function testServicesAreKeptWhenTheirDependenciesAreAvailable(): void $container = $this->createContainer(serializer: true, validator: true); foreach ([...self::SERIALIZER_TASKS, NormalizeTransformer::class, DenormalizeTransformer::class, ValidatorTask::class] as $id) { - self::assertSame($id, $container->getDefinition($id)->getClass()); + self::assertSame($id, $container->findDefinition($id)->getClass()); } } @@ -54,34 +54,34 @@ public function testSerializerServicesAreReplacedWithoutSerializer(): void $container = $this->createContainer(serializer: false, validator: true); foreach (self::SERIALIZER_TASKS as $id) { - $definition = $container->getDefinition($id); + $definition = $container->findDefinition($id); self::assertSame(UnavailableTask::class, $definition->getClass(), $id); self::assertSame([\sprintf(UnavailableServicesCompilerPass::SERIALIZER_MESSAGE, $id)], $definition->getArguments()); - // Still fetched by the process manager, and logged in the tasks channel - self::assertTrue($definition->isPublic()); + // Still referenced by the alias named after the class, and logged in the tasks channel + self::assertTrue($container->getAlias($id)->isPublic()); self::assertFalse($definition->isShared()); self::assertSame([['channel' => 'cleverage_process_task']], $definition->getTag('monolog.logger')); } foreach ([NormalizeTransformer::class => 'normalize', DenormalizeTransformer::class => 'denormalize'] as $id => $code) { - $definition = $container->getDefinition($id); + $definition = $container->findDefinition($id); self::assertSame(UnavailableTransformer::class, $definition->getClass(), $id); // Still registered under its code, so that using it gives the explicit message self::assertSame([$code, \sprintf(UnavailableServicesCompilerPass::SERIALIZER_MESSAGE, $id)], $definition->getArguments()); self::assertTrue($definition->hasTag('cleverage.transformer')); } - self::assertSame(ValidatorTask::class, $container->getDefinition(ValidatorTask::class)->getClass()); + self::assertSame(ValidatorTask::class, $container->findDefinition(ValidatorTask::class)->getClass()); } public function testValidatorTaskIsReplacedWithoutValidator(): void { $container = $this->createContainer(serializer: true, validator: false); - $definition = $container->getDefinition(ValidatorTask::class); + $definition = $container->findDefinition(ValidatorTask::class); self::assertSame(UnavailableTask::class, $definition->getClass()); self::assertSame([\sprintf(UnavailableServicesCompilerPass::VALIDATOR_MESSAGE, ValidatorTask::class)], $definition->getArguments()); - self::assertTrue($definition->isPublic()); + self::assertTrue($container->getAlias(ValidatorTask::class)->isPublic()); self::assertFalse($definition->isShared()); - self::assertSame(NormalizerTask::class, $container->getDefinition(NormalizerTask::class)->getClass()); + self::assertSame(NormalizerTask::class, $container->findDefinition(NormalizerTask::class)->getClass()); } private function createContainer(bool $serializer, bool $validator): ContainerBuilder