Aller au contenu

Services

phil/slug-bundle
IdentifiantClassePublicRôle
phil_slug.slugger.<name>TransliteratingSlugger ou LeadingWordsRemovednonLe générateur d'un nom
Phil\Slug\SluggeraliasnonLe générateur par défaut
Phil\Slug\Slugger $<name>SluggeraliasnonLe générateur d'un nom, par nom d'argument
Phil\Slug\SluggersSluggersouiChaque générateur par nom, et celui par défaut
Phil\SlugBundle\Infrastructure\Twig\SlugExtensionruntime TwignonLe filtre phil_slug, avec Twig

L'autoconnexion par nom

Un argument de constructeur typé Slugger reçoit le générateur par défaut ; un argument nommé $<name>Slugger reçoit le générateur de ce nom, écrit en camel case (directory_names → $directoryNamesSlugger) :

final readonly class DirectoryImport
{
    public function __construct(
        private Slugger $slugger,             // the default one
        private Slugger $directorySlugger,    // phil_slug.slugger.directory
    ) {}
}

Un bundle qui prend un générateur par identifiant de service — la clé slugger de phil/taxonomy-bundle — reçoit phil_slug.slugger.<name>.

Décorer un générateur

Chaque générateur nommé est un service à part : une application en change un en le décorant, comme n'importe quel service Symfony :

use Phil\Slug\Slug;
use Phil\Slug\Slugger;
use Symfony\Component\DependencyInjection\Attribute\AsDecorator;
use Symfony\Component\DependencyInjection\Attribute\AutowireDecorated;

#[AsDecorator('phil_slug.slugger.titles')]
final readonly class NoDigits implements Slugger
{
    public function __construct(#[AutowireDecorated] private Slugger $inner) {}

    public function slug(string $text): Slug
    {
        return $this->inner->slug((string) preg_replace('/\d+/', '', $text));
    }
}

Le décorateur prend la place du générateur partout : dans Sluggers, par les alias, et dans Twig.