Symfony2 Sluggable多个分隔符

met*_*ist 3 separator symfony doctrine-orm

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

products/some-product
Run Code Online (Sandbox Code Playgroud)

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

我查看了相关的Sluggable类代码(Urlizer)并看到了很多正则表达式,但我不确定我应该覆盖哪些允许斜线和/或短划线不能与其他所有内容一起替换.

met*_*ist 6

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

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

services:

    sluggable.listener:
        alias: stof_doctrine_extensions.listener.sluggable
Run Code Online (Sandbox Code Playgroud)

然后,您必须创建您的课程.有一个名为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)))));
    }
}
Run Code Online (Sandbox Code Playgroud)

postProcessText()的正则表达式是您想要根据自己的喜好修改的.在那之后,你必须在你坚持之前使你的函数成为可调用的,并且你很高兴去:

// custom transliterator
$listener = $this->get('sluggable.listener');
$listener->setTransliterator(array('My\Bundle\Util\Urlizer', 'transliterate'));
$em->flush();
Run Code Online (Sandbox Code Playgroud)