【问题标题】:Symfony2 Sluggable multiple separatorsSymfony2 Sluggable 多个分隔符
【发布时间】:2012-07-05 23:01:33
【问题描述】:

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

products/some-product

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

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

【问题讨论】:

    标签: symfony doctrine-orm separator


    【解决方案1】:

    事实证明,您可以通过创建自己的扩展 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();
    

    【讨论】:

      猜你喜欢
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多