事实证明,您可以通过创建自己的扩展 Urlizer 的类来完成此操作,然后将其设置为侦听器的可调用对象,而不是 Gedmo 的类。
使用 STOF 原则扩展时,会创建一个 sluggable 侦听器作为服务,但它被设置为私有,因此您无法正常访问。所以你必须首先在你自己的配置中为这个监听器创建一个别名:
services:
sluggable.listener:
alias: stof_doctrine_extensions.listener.sluggable
然后你必须创建你的类。有一个名为 setTransliterator() 的设置器,您可以使用它来调用您自己的音译器,然后您可以使用它来注入您需要修改 slugging 过程的内容。函数 postProccessText() 是你真正想要修改的, transliterate() 函数就是可调用的:
namespace My\Bundle\Util;
use Gedmo\Sluggable\Util\Urlizer as BaseUrlizer;
class Urlizer extends BaseUrlizer
{
public static function transliterate($text, $separator = '-')
{
// copy the code from the parent here
}
private static function postProcessText($text, $separator)
{
// copy code from parent, but modify the following part:
$text = strtolower(preg_replace('/[^A-Z^a-z^0-9^\/]+/', $separator,
preg_replace('/([a-z\d])([A-Z])/', '\1_\2',
preg_replace('/([A-Z]+)([A-Z][a-z])/', '\1_\2',
preg_replace('/::/', '/', $text)))));
}
}
postProcessText() 的正则表达式是您想要修改的内容。在那之后,你必须在你坚持之前让你的函数成为可调用的,你很高兴:
// custom transliterator
$listener = $this->get('sluggable.listener');
$listener->setTransliterator(array('My\Bundle\Util\Urlizer', 'transliterate'));
$em->flush();