Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ Latest
------

## Changes
* [#276](https://github.com/cleverage/process-bundle/issues/276) TransformerRegistry: the transformers are loaded lazily from a service locator indexed by code (new internal `TransformerLocatorCompilerPass`, new optional `TransformerRegistry` constructor argument): a transformer is only instantiated when a process uses it. The code is given by the new `code` attribute of the `cleverage.transformer` tag, or by the new `#[AsTransformer(code: '...')]` attribute (autoconfiguration); it must be the one returned by `getCode()`. All the bundle transformers and the generic transformers have their code. Duplicate codes fail the container compilation. A transformer tagged without `code` is still registered eagerly, with `TransformerRegistry::addTransformer()`, which is deprecated (the `code` will be required in v6.0, #280). `RegistryCompilerPass` is no longer used and deprecated. `TransformerInterface::getCode()` is deprecated (`@deprecated` PHPDoc: no runtime notice is possible for an interface method), it will be removed from the interface in v6.0 (#280): keep implementing it, returning the code of the tag until then. Update documentation, add tests.
* [#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(<class>)` 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.
Expand Down
2 changes: 2 additions & 0 deletions config/services/registry.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ services:
cleverage_process.registry.transformer:
class: CleverAge\ProcessBundle\Registry\TransformerRegistry
public: false
arguments:
- ~ # Service locator of the transformers by code, see TransformerLocatorCompilerPass
CleverAge\ProcessBundle\Registry\TransformerRegistry:
alias: cleverage_process.registry.transformer

Expand Down
75 changes: 74 additions & 1 deletion config/services/transformer.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,20 @@ services:
_defaults:
public: false
tags:
- { name: cleverage.transformer }
- { name: monolog.logger, channel: cleverage_process_transformer }

cleverage_process.transformer.array_element:
class: CleverAge\ProcessBundle\Transformer\Array\ArrayElementTransformer
tags:
- { name: cleverage.transformer, code: array_element }
CleverAge\ProcessBundle\Transformer\Array\ArrayElementTransformer:
alias: cleverage_process.transformer.array_element
public: true

cleverage_process.transformer.array_filter:
class: CleverAge\ProcessBundle\Transformer\Array\ArrayFilterTransformer
tags:
- { name: cleverage.transformer, code: array_filter }
arguments:
- '@property_accessor'
CleverAge\ProcessBundle\Transformer\Array\ArrayFilterTransformer:
Expand All @@ -21,18 +24,24 @@ services:

cleverage_process.transformer.array_first:
class: CleverAge\ProcessBundle\Transformer\Array\ArrayFirstTransformer
tags:
- { name: cleverage.transformer, code: array_first }
CleverAge\ProcessBundle\Transformer\Array\ArrayFirstTransformer:
alias: cleverage_process.transformer.array_first
public: true

cleverage_process.transformer.array_last:
class: CleverAge\ProcessBundle\Transformer\Array\ArrayLastTransformer
tags:
- { name: cleverage.transformer, code: array_last }
CleverAge\ProcessBundle\Transformer\Array\ArrayLastTransformer:
alias: cleverage_process.transformer.array_last
public: true

cleverage_process.transformer.array_map:
class: CleverAge\ProcessBundle\Transformer\Array\ArrayMapTransformer
tags:
- { name: cleverage.transformer, code: array_map }
arguments:
- '@cleverage_process.registry.transformer'
CleverAge\ProcessBundle\Transformer\Array\ArrayMapTransformer:
Expand All @@ -41,12 +50,16 @@ services:

cleverage_process.transformer.array_unset:
class: CleverAge\ProcessBundle\Transformer\Array\ArrayUnsetTransformer
tags:
- { name: cleverage.transformer, code: array_unset }
CleverAge\ProcessBundle\Transformer\Array\ArrayUnsetTransformer:
alias: cleverage_process.transformer.array_unset
public: true

cleverage_process.transformer.cached:
class: CleverAge\ProcessBundle\Transformer\CachedTransformer
tags:
- { name: cleverage.transformer, code: cached }
arguments:
- '@cleverage_process.registry.transformer'
- '@cache.app'
Expand All @@ -57,60 +70,80 @@ services:

cleverage_process.transformer.callback:
class: CleverAge\ProcessBundle\Transformer\CallbackTransformer
tags:
- { name: cleverage.transformer, code: callback }
CleverAge\ProcessBundle\Transformer\CallbackTransformer:
alias: cleverage_process.transformer.callback
public: true

cleverage_process.transformer.cast:
class: CleverAge\ProcessBundle\Transformer\CastTransformer
tags:
- { name: cleverage.transformer, code: cast }
CleverAge\ProcessBundle\Transformer\CastTransformer:
alias: cleverage_process.transformer.cast
public: true

cleverage_process.transformer.constant:
class: CleverAge\ProcessBundle\Transformer\ConstantTransformer
tags:
- { name: cleverage.transformer, code: constant }
CleverAge\ProcessBundle\Transformer\ConstantTransformer:
alias: cleverage_process.transformer.constant
public: true

cleverage_process.transformer.convert_value:
class: CleverAge\ProcessBundle\Transformer\ConvertValueTransformer
tags:
- { name: cleverage.transformer, code: convert_value }
CleverAge\ProcessBundle\Transformer\ConvertValueTransformer:
alias: cleverage_process.transformer.convert_value
public: true

cleverage_process.transformer.date_format:
class: CleverAge\ProcessBundle\Transformer\Date\DateFormatTransformer
tags:
- { name: cleverage.transformer, code: date_format }
CleverAge\ProcessBundle\Transformer\Date\DateFormatTransformer:
alias: cleverage_process.transformer.date_format
public: true

cleverage_process.transformer.date_parser:
class: CleverAge\ProcessBundle\Transformer\Date\DateParserTransformer
tags:
- { name: cleverage.transformer, code: date_parser }
CleverAge\ProcessBundle\Transformer\Date\DateParserTransformer:
alias: cleverage_process.transformer.date_parser
public: true

cleverage_process.transformer.debug:
class: CleverAge\ProcessBundle\Transformer\DebugTransformer
tags:
- { name: cleverage.transformer, code: dump }
CleverAge\ProcessBundle\Transformer\DebugTransformer:
alias: cleverage_process.transformer.debug
public: true

cleverage_process.transformer.default:
class: CleverAge\ProcessBundle\Transformer\DefaultTransformer
tags:
- { name: cleverage.transformer, code: default }
CleverAge\ProcessBundle\Transformer\DefaultTransformer:
alias: cleverage_process.transformer.default
public: true

cleverage_process.transformer.evaluator:
class: CleverAge\ProcessBundle\Transformer\EvaluatorTransformer
tags:
- { name: cleverage.transformer, code: evaluator }
CleverAge\ProcessBundle\Transformer\EvaluatorTransformer:
alias: cleverage_process.transformer.evaluator
public: true

cleverage_process.transformer.expression_language_map:
class: CleverAge\ProcessBundle\Transformer\ExpressionLanguageMapTransformer
tags:
- { name: cleverage.transformer, code: expression_language_map }
arguments:
- '@cleverage_process.expression_language'
CleverAge\ProcessBundle\Transformer\ExpressionLanguageMapTransformer:
Expand All @@ -119,6 +152,8 @@ services:

cleverage_process.transformer.mapping:
class: CleverAge\ProcessBundle\Transformer\MappingTransformer
tags:
- { name: cleverage.transformer, code: mapping }
arguments:
- '@cleverage_process.registry.transformer'
- '@logger'
Expand All @@ -129,18 +164,24 @@ services:

cleverage_process.transformer.multi_replace:
class: CleverAge\ProcessBundle\Transformer\MultiReplaceTransformer
tags:
- { name: cleverage.transformer, code: multi_replace }
CleverAge\ProcessBundle\Transformer\MultiReplaceTransformer:
alias: cleverage_process.transformer.multi_replace
public: true

cleverage_process.transformer.instantiate:
class: CleverAge\ProcessBundle\Transformer\Object\InstantiateTransformer
tags:
- { name: cleverage.transformer, code: instantiate }
CleverAge\ProcessBundle\Transformer\Object\InstantiateTransformer:
alias: cleverage_process.transformer.instantiate
public: true

cleverage_process.transformer.property_accessor:
class: CleverAge\ProcessBundle\Transformer\Object\PropertyAccessorTransformer
tags:
- { name: cleverage.transformer, code: property_accessor }
arguments:
- '@property_accessor'
CleverAge\ProcessBundle\Transformer\Object\PropertyAccessorTransformer:
Expand All @@ -149,6 +190,8 @@ services:

cleverage_process.transformer.recursive_property_setter:
class: CleverAge\ProcessBundle\Transformer\Object\RecursivePropertySetterTransformer
tags:
- { name: cleverage.transformer, code: recursive_property_setter }
arguments:
- '@property_accessor'
CleverAge\ProcessBundle\Transformer\Object\RecursivePropertySetterTransformer:
Expand All @@ -157,12 +200,16 @@ services:

cleverage_process.transformer.preg_filter:
class: CleverAge\ProcessBundle\Transformer\PregFilterTransformer
tags:
- { name: cleverage.transformer, code: preg_filter }
CleverAge\ProcessBundle\Transformer\PregFilterTransformer:
alias: cleverage_process.transformer.preg_filter
public: true

cleverage_process.transformer.rules:
class: CleverAge\ProcessBundle\Transformer\RulesTransformer
tags:
- { name: cleverage.transformer, code: rules }
arguments:
- '@cleverage_process.registry.transformer'
- '@cleverage_process.expression_language'
Expand All @@ -172,6 +219,8 @@ services:

cleverage_process.transformer.denormalize:
class: CleverAge\ProcessBundle\Transformer\Serialization\DenormalizeTransformer
tags:
- { name: cleverage.transformer, code: denormalize }
arguments:
- '@serializer'
CleverAge\ProcessBundle\Transformer\Serialization\DenormalizeTransformer:
Expand All @@ -180,6 +229,8 @@ services:

cleverage_process.transformer.normalize:
class: CleverAge\ProcessBundle\Transformer\Serialization\NormalizeTransformer
tags:
- { name: cleverage.transformer, code: normalize }
arguments:
- '@serializer'
CleverAge\ProcessBundle\Transformer\Serialization\NormalizeTransformer:
Expand All @@ -188,54 +239,72 @@ services:

cleverage_process.transformer.explode:
class: CleverAge\ProcessBundle\Transformer\String\ExplodeTransformer
tags:
- { name: cleverage.transformer, code: explode }
CleverAge\ProcessBundle\Transformer\String\ExplodeTransformer:
alias: cleverage_process.transformer.explode
public: true

cleverage_process.transformer.hash:
class: CleverAge\ProcessBundle\Transformer\String\HashTransformer
tags:
- { name: cleverage.transformer, code: hash }
CleverAge\ProcessBundle\Transformer\String\HashTransformer:
alias: cleverage_process.transformer.hash
public: true

cleverage_process.transformer.implode:
class: CleverAge\ProcessBundle\Transformer\String\ImplodeTransformer
tags:
- { name: cleverage.transformer, code: implode }
CleverAge\ProcessBundle\Transformer\String\ImplodeTransformer:
alias: cleverage_process.transformer.implode
public: true

cleverage_process.transformer.preg_match:
class: CleverAge\ProcessBundle\Transformer\String\PregMatchTransformer
tags:
- { name: cleverage.transformer, code: preg_match }
CleverAge\ProcessBundle\Transformer\String\PregMatchTransformer:
alias: cleverage_process.transformer.preg_match
public: true

cleverage_process.transformer.slugify:
class: CleverAge\ProcessBundle\Transformer\String\SlugifyTransformer
tags:
- { name: cleverage.transformer, code: slugify }
CleverAge\ProcessBundle\Transformer\String\SlugifyTransformer:
alias: cleverage_process.transformer.slugify
public: true

cleverage_process.transformer.sprintf:
class: CleverAge\ProcessBundle\Transformer\String\SprintfTransformer
tags:
- { name: cleverage.transformer, code: sprintf }
CleverAge\ProcessBundle\Transformer\String\SprintfTransformer:
alias: cleverage_process.transformer.sprintf
public: true

cleverage_process.transformer.trim:
class: CleverAge\ProcessBundle\Transformer\String\TrimTransformer
tags:
- { name: cleverage.transformer, code: trim }
CleverAge\ProcessBundle\Transformer\String\TrimTransformer:
alias: cleverage_process.transformer.trim
public: true

cleverage_process.transformer.type_setter:
class: CleverAge\ProcessBundle\Transformer\TypeSetterTransformer
tags:
- { name: cleverage.transformer, code: type_setter }
CleverAge\ProcessBundle\Transformer\TypeSetterTransformer:
alias: cleverage_process.transformer.type_setter
public: true

cleverage_process.transformer.unset:
class: CleverAge\ProcessBundle\Transformer\UnsetTransformer
tags:
- { name: cleverage.transformer, code: unset }
arguments:
- '@property_accessor'
CleverAge\ProcessBundle\Transformer\UnsetTransformer:
Expand All @@ -244,12 +313,16 @@ services:

cleverage_process.transformer.wrapper:
class: CleverAge\ProcessBundle\Transformer\WrapperTransformer
tags:
- { name: cleverage.transformer, code: wrapper }
CleverAge\ProcessBundle\Transformer\WrapperTransformer:
alias: cleverage_process.transformer.wrapper
public: true

cleverage_process.transformer.xpath_evaluator:
class: CleverAge\ProcessBundle\Transformer\Xml\XpathEvaluatorTransformer
tags:
- { name: cleverage.transformer, code: xpath_evaluator }
CleverAge\ProcessBundle\Transformer\Xml\XpathEvaluatorTransformer:
alias: cleverage_process.transformer.xpath_evaluator
public: true
10 changes: 6 additions & 4 deletions docs/01-quick_start.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,18 +80,20 @@ bundle configures them:
- services implementing `CleverAge\ProcessBundle\Model\TaskInterface` are not shared (no data shared between task
usages), with a `monolog.logger` tag on the `cleverage_process_task` channel;
- services implementing `CleverAge\ProcessBundle\Transformer\TransformerInterface` get the `cleverage.transformer` tag
(needed by the transformer registry) and a `monolog.logger` tag on the `cleverage_process_transformer` channel.
(needed by the transformer registry) and a `monolog.logger` tag on the `cleverage_process_transformer` channel. Add
the `#[CleverAge\ProcessBundle\Attribute\AsTransformer(code: '...')]` attribute to their class, with the code returned
by `getCode()`: the transformer is then only instantiated when a process uses it (see
[transformers](03-custom_tasks.md#transformers)).

Without autoconfiguration, declare these settings yourself:

```yaml
# config/services.yaml
services:
App\Transformer\:
resource: '../src/Transformer/*'
App\Transformer\VatTransformer: # One definition per transformer, for its code
autowire: true
tags:
- { name: cleverage.transformer } # Needed by the transformer registry to find transformers
- { name: cleverage.transformer, code: app_vat } # Needed by the transformer registry, code returned by getCode()
- { name: monolog.logger, channel: cleverage_process_transformer } # Optional, see logging

App\Task\:
Expand Down
Loading
Loading