Installation:
composer require dompat/stemmer-bundle
Enable the bundle in config/bundles.php:
Dompat\StemmerBundle\DompatStemmerBundle::class => ['all' => true],
First Use Case:
Use the Twig |stem filter directly in templates:
{{ 'running' | stem }} {# Outputs: "run" #}
Or inject the Stemmer service in a controller/service:
use Dompat\Stemmer\Stemmer;
public function __construct(private Stemmer $stemmer) {}
public function index(): string
{
return $this->stemmer->stem('running'); // Returns "run"
}
Check Configuration:
Verify config/packages/dompat_stemmer.yaml (auto-generated) for available drivers (e.g., english, german). Modify if needed:
dompat_stemmer:
drivers:
default: english
custom_locale: german
Stemming in Controllers/Services:
Inject Stemmer and use stem() for single words or stemAll() for arrays:
$stemmer->stem('quickly'); // "quick"
$stemmer->stemAll(['running', 'jumps']); // ["run", "jump"]
Twig Integration:
Use the |stem filter in templates for dynamic stemming:
{% for word in ['running', 'jumps'] %}
{{ word | stem }} {# Outputs: "run", "jump" #}
{% endfor %}
Custom Drivers:
Implement DriverInterface and register via config/packages/dompat_stemmer.yaml:
dompat_stemmer:
drivers:
custom_driver: App\Stemmer\CustomDriver
Locale-Specific Stemming:
Pass a locale to the stem() method or configure a default in YAML:
$stemmer->stem('Lauf', 'german'); // "lauf"
Batch Processing:
Use stemAll() for bulk operations (e.g., search indexing):
$words = ['running', 'jumps', 'quickly'];
$stemmed = $stemmer->stemAll($words); // ["run", "jump", "quick"]
Event Listeners:
Hook into kernel.request to pre-stem query parameters or POST data:
public function onKernelRequest(GetResponseEvent $event): void
{
$request = $event->getRequest();
$request->query->set('q', $this->stemmer->stem($request->query->get('q')));
}
Form Data Sanitization: Stem form inputs before validation/saving:
$stemmedInput = $stemmer->stem($request->request->get('search_term'));
Driver Availability:
dompat/drivers are auto-registered. Missing a language? Install the driver package (e.g., composer require dompat/drivers-german).var/cache/dev/app_config_*.php for registered drivers or manually add missing ones in YAML.Case Sensitivity:
$stemmer->stem('Running'); // "run" (lowercase)
$stemmer->stem(strtolower('Running'));
Performance:
stemAll() in loops. Cache results if processing large datasets:
$cache = $this->cache->get('stemmed_words_' . md5(serialize($words)));
if (!$cache) {
$cache = $stemmer->stemAll($words);
$this->cache->set('stemmed_words_' . md5(serialize($words)), $cache, 3600);
}
Twig Filter Scope:
|stem filter uses the default driver unless overridden in Twig:
{{ 'Lauf' | stem('german') }} {# Explicit locale #}
Check Registered Drivers:
Dump the Stemmer service to verify loaded drivers:
dump($stemmer->getDrivers()); // Array of available locales
Override Core Drivers:
To replace a default driver (e.g., english), configure it in YAML:
dompat_stemmer:
drivers:
english: App\Stemmer\CustomEnglishDriver
Custom Stemmer Class:
Extend Dompat\Stemmer\Stemmer to add pre/post-processing:
class CustomStemmer extends Stemmer {
public function stem(string $word): string {
return parent::stem(str_replace(['-', "'"], '', $word));
}
}
Register it in services.yaml:
services:
App\Stemmer\CustomStemmer: ~
Dompat\Stemmer\Stemmer: '@App\Stemmer\CustomStemmer'
Event-Driven Stemming: Dispatch events before/after stemming (e.g., for analytics):
$stemmer->stem($word, function(string $stemmed) {
$this->eventDispatcher->dispatch(new StemmedEvent($stemmed));
});
Non-Standard Locales: For unsupported languages, create a custom driver and register it as shown above. Example:
class DutchDriver implements DriverInterface {
public function stem(string $word): string {
// Custom Dutch stemming logic
return strtolower($word);
}
}
How can I help you explore Laravel packages today?