3

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

products/some-product

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

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

4

1 回答 1

6

事实证明,您可以通过创建自己的扩展 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();
于 2012-07-10T19:12:39.450 回答