Issue #3614981: Decouple MyrestNormalizer from hardcoded module dependencies

MyrestNormalizer referenced myfacet, myrest_metatag and myentity classes directly, so the module could not run without them.

  • Add MyrestMetatagProviderInterface and the "myrest_metatag_provider" service tag. The normalizer collects tagged providers via a tagged iterator instead of injecting MyrestMetatagHelper, and works with an empty collection when no module provides metatags.
  • Add the myrest.normalize and myrest.metatags events so modules can inject data without the normalizer knowing about them.
  • Drop the myfacet.manager injection: it was never used.
  • Replace the MyentityMyrestMetatagInterface check with the core FieldableEntityInterface / referencedEntities() API.
  • Move the ARTICLES_NID / CONTACTS_NID constants from myentity to the new myrest.settings:special_pages configuration, with schema and defaults.
  • Add METATAG_DEFAULTS so downstream logic never reads an undefined "noindex" key when no provider is registered.
  • Fix a fatal error: ByteSizeMarkup was used without a use statement and resolved to the local namespace on every normalized response.
  • Accept a nullable CacheableMetadata in getMetatags(), matching what normalize() actually passes.
  • Replace the untranslated "[Translated]-[Translated]" publisher metatag with the configured site name, and restore the mangled comments.
  • Expand the unit test to cover provider collection, foreign services, missing providers and cacheability.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com

Closes #3614981

Merge request reports

Loading