Symfony2 Sluggable多个分隔符

时间:2012-07-05 23:01:34

标签: symfony doctrine-orm separator

使用Symfony2中的Gedmo Sluggable行为,我需要知道是否有一种方法允许斜杠(/)和破折号( - )作为单词分隔符。换句话说,一个特定的分隔符像往常一样,但只留下另一个特定的特殊字符,因此它被忽略。我想做一个像slug这样的事情:

products/some-product

这允许我在URL中使用通过斜杠分类并通过破折号分隔空格的slugs。但是,例如,如果分隔符为“/”,则“ - ”也将被替换,而不是单独使用。

我查看了相关的Sluggable类代码(Urlizer)并看到了很多正则表达式,但我不知道应该覆盖哪些内容以允许斜线和/或破折号不被替换以及其他一切。

1 个答案:

答案 0 :(得分:6)

事实证明,你可以通过创建自己的扩展Urlizer的类来实现这一点,然后将其设置为侦听器的可调用而不是Gedmo的类。

使用STOF教义扩展时,会将一个可缓慢的侦听器创建为服务,但它被设置为私有,因此您无法正常访问。因此,您必须首先在自己的配置中为此侦听器创建别名:

services:

    sluggable.listener:
        alias: stof_doctrine_extensions.listener.sluggable

然后你必须创建你的课程。有一个名为setTransliterator()的setter可用于调用自己的音译器,然后您可以使用它来注入修改段塞过程所需的内容。函数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();