gpt4 book ai didi

Symfony2 Sluggable 多个分隔符

转载 作者:行者123 更新时间:2023-12-02 11:19:12 26 4
gpt4 key购买 nike

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

products/some-product

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

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

最佳答案

事实证明,您可以通过创建自己的扩展 Urlizer 的类,然后将其设置为监听器的可调用类(而不是 Gedmo 的类)来实现此目的。

使用 STOF 学说扩展时,会创建一个 sluggable 监听器作为服务,但它被设置为私有(private),因此您无法正常访问。因此,您必须首先在自己的配置中创建此监听器的别名:

services:

sluggable.listener:
alias: stof_doctrine_extensions.listener.sluggable

然后您必须创建您的类。有一个名为 setTransliterator() 的 setter ,您可以使用它来调用您自己的音译器,然后您可以使用它来注入(inject)修改 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();

关于Symfony2 Sluggable 多个分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11353685/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com