tobento/service-slugifier

Slugifier服务提供将字符串转换为slug的接口。

1.0.0 2024-09-04 08:13 UTC

This package is auto-updated.

Last update: 2024-09-04 08:17:57 UTC


README

Slugifier服务提供将字符串转换为slug的接口,具有默认实现。

目录

入门

使用此命令添加Slugifier服务项目的最新版本。

composer require tobento/service-slugifier

要求

  • PHP 8.0或更高版本

亮点

  • 框架无关,与任何项目兼容
  • 解耦设计
  • 创建符合您需求的自定义Slugifier

文档

基本用法

创建Slugifier

您可以使用SlugifierFactory轻松创建slugifier。

use Tobento\Service\Slugifier\SlugifierFactory;
use Tobento\Service\Slugifier\SlugifierInterface;

$slugifier = (new SlugifierFactory())->createSlugifier();

var_dump($slugifier instanceof SlugifierInterface);
// bool(true)

创建自定义Slugifier

您可以使用Slugifier类通过使用可用修饰符来构建自定义slugifier。

use Tobento\Service\Slugifier\Modifier;
use Tobento\Service\Slugifier\Modifiers;
use Tobento\Service\Slugifier\Slugifier;
use Tobento\Service\Slugifier\SlugifierInterface;

$slugifier = new Slugifier(
    modifiers: new Modifiers(
        new Modifier\StripTags(),

        // locale specific dictionaries:
        new Modifier\Dictionary\English(),
        new Modifier\Dictionary\German(),
        new Modifier\Dictionary\French(),
        new Modifier\Dictionary\Italian(),
        // supports all locales, acts as a fallback:
        new Modifier\Dictionary\Latin(),

        new Modifier\Lowercase(),
        new Modifier\Trim(),
        new Modifier\AlphaNumOnly(separator: '-'),
        new Modifier\Trim('-'),
        
        // removes repeated separators like -- to -:
        new Modifier\Regex(pattern: '#-+#', separator: '-'),
        
        new Modifier\LimitLength(250),
    )
);

var_dump($slugifier instanceof SlugifierInterface);
// bool(true)

生成Slugs

使用slugify方法从给定的字符串生成slug。

$slug = $slugifier->slugify('Hello World!');
var_dump($slug);
// string(11) "hello-world"

可用修饰符

仅字母数字修饰符

此修饰符将非字母数字字符替换为定义的分隔符

use Tobento\Service\Slugifier\Modifier\AlphaNumOnly;

$modifier = new AlphaNumOnly(
    separator: '-', // default
);

$string = $modifier->modify(
    string: 'lorem ipsum!',
    locale: 'en'
);

var_dump($string);
// string(12) "lorem-ipsum-"

限制长度修饰符

此修饰符将字符串限制为定义的长度

use Tobento\Service\Slugifier\Modifier\LimitLength;

$modifier = new LimitLength(
    length: 10, // default 255
);

$string = $modifier->modify(
    string: 'Some very long string ...',
    locale: 'en'
);

var_dump($string);
// string(10) "Some very "

小写修饰符

此修饰符使字符串小写。

use Tobento\Service\Slugifier\Modifier\Lowercase;

$modifier = new Lowercase(
    // you may change the encoding:
    encoding: null, // 'UTF-8'
);

$string = $modifier->modify(
    string: 'Lorem Ipsum',
    locale: 'en'
);

var_dump($string);
// string(11) "lorem ipsum"

修改修饰符

使用此修饰符通过callable创建自定义修饰符。

use Tobento\Service\Slugifier\Modifier\Modify;

$modifier = new Modify(
    modifier: fn (string $string, string $locale): string => strtoupper($string),
    
    // you may set the supported locales:
    supportedLocales: ['de', 'de-CH'],
    
    // or you may use an asterisk as a wildcard:
    // supportedLocales: ['de*', 'fr*'],
    
    // or empty all supported (default):
    // supportedLocales: [],
);

$string = $modifier->modify(
    string: 'Lorem Ipsum',
    locale: 'de'
);

var_dump($string);
// string(11) "LOREM IPSUM"

防止重复修饰符

此修饰符防止重复的slug。此修饰符应最后添加!

use Tobento\Service\Slugifier\Modifier\PreventDublicate;
use Tobento\Service\Slugifier\Resource;
use Tobento\Service\Slugifier\Slugs;

$modifier = new PreventDublicate(
    slugs: new Slugs(
        new Resource\ArrayResource(['login', 'register']),
    ),
    
    // you may change the separator:
    separator: '-', // default
);

$string = $modifier->modify(
    string: 'login',
    locale: 'en'
);

var_dump($string);
// string(7) "login-1"

您可以通过查看Slugs部分来了解有关它的更多信息。

正则表达式修饰符

使用此修饰符使用定义的模式修改给定的字符串。

use Tobento\Service\Slugifier\Modifier\Regex;

$modifier = new Regex(
    pattern: '#-+#',
    
    // you may change the separator:
    separator: '-', // default
    
    // you may set the supported locales:
    supportedLocales: ['de', 'de-CH'],
    
    // or you may use an asterisk as a wildcard:
    // supportedLocales: ['de*', 'fr*'],
    
    // or empty all supported (default):
    // supportedLocales: [],
);

$string = $modifier->modify(
    string: 'Lorem--Ipsum',
    locale: 'de'
);

var_dump($string);
// string(11) "Lorem-Ipsum"

替换修饰符

此修饰符从给定字符串中替换定义的替换列表。

use Tobento\Service\Slugifier\Modifier\Replace;

$modifier = new Replace(
    replace: ['ö' => 'oe'],
    
    // you may set the supported locales:
    supportedLocales: ['de', 'de-CH'],
    
    // or you may use an asterisk as a wildcard:
    // supportedLocales: ['de*', 'fr*'],
    
    // or empty all supported (default):
    // supportedLocales: [],
);

$string = $modifier->modify(
    string: 'schönes Wetter',
    locale: 'de'
);

var_dump($string);
// string(15) "schoenes Wetter"

去除标签修饰符

此修饰符从给定字符串中去除标签。

use Tobento\Service\Slugifier\Modifier\StripTags;

$modifier = new StripTags();

$string = $modifier->modify(
    string: '<p>lorem ipsum</p>',
    locale: 'en'
);

var_dump($string);
// string(11) "lorem ipsum"

修剪修饰符

此修饰符从给定字符串中去除标签。

use Tobento\Service\Slugifier\Modifier\Trim;

$modifier = new Trim(
    // you may set the characters to trim:
    chars: '-', // default null
);

$string = $modifier->modify(
    string: '-lorem ipsum-',
    locale: 'en'
);

var_dump($string);
// string(11) "lorem ipsum"

字典

英语字典修饰符

此修饰符在以en开头的区域设置中使用英语字典进行替换。

use Tobento\Service\Slugifier\Modifier\Dictionary\English;

$modifier = new English(
    // you may set whether to use the words dictionary:
    withWords: true, // default
    
    // you may change the words separator:
    separator: '', // '-' is default
);

$string = $modifier->modify(
    string: 'Blue & green',
    locale: 'en'
);

var_dump($string);
// string(14) "Blue and green"

法语字典修饰符

此修饰符在以fr开头的区域设置中使用法语字典进行替换。

use Tobento\Service\Slugifier\Modifier\Dictionary\French;

$modifier = new French(
    // you may set whether to use the words dictionary:
    withWords: true, // default
    
    // you may change the words separator:
    separator: '', // '-' is default
);

$string = $modifier->modify(
    string: 'Bleu & vert',
    locale: 'fr'
);

var_dump($string);
// string(14) "Bleu et vert"

德语字典修饰符

此修饰符在以de开头的区域设置中使用德语字典进行替换。

use Tobento\Service\Slugifier\Modifier\Dictionary\German;

$modifier = new German(
    // you may set whether to use the words dictionary:
    withWords: true, // default
    
    // you may change the words separator:
    separator: '', // '-' is default
);

$string = $modifier->modify(
    string: 'Blau & grün',
    locale: 'de'
);

var_dump($string);
// string(14) "Blau und gruen"

意大利语字典修饰符

此修饰符在以it开头的区域设置中使用意大利语字典进行替换。

use Tobento\Service\Slugifier\Modifier\Dictionary\Italian;

$modifier = new Italian(
    // you may set whether to use the words dictionary:
    withWords: true, // default
    
    // you may change the words separator:
    separator: '', // '-' is default
);

$string = $modifier->modify(
    string: 'Blu & verde',
    locale: 'it'
);

var_dump($string);
// string(11) "Blu e verde"

拉丁语字典修饰符

此修饰符在所有区域设置中使用拉丁语字典进行替换。

use Tobento\Service\Slugifier\Modifier\Dictionary\Latin;

$modifier = new Latin();

$string = $modifier->modify(
    string: 'Blau & grün',
    locale: 'en'
);

var_dump($string);
// string(12) "Blau & gruen"

自定义修饰符

您可以通过实现ModifierInterface创建自定义修饰符。

use Tobento\Service\Slugifier\ModifierInterface;

class CustomModifier implements ModifierInterface
{
    /**
     * Returns the modified string.
     *
     * @param string $string
     * @param string $locale
     * @return string The modified string
     */
    public function modify(string $string, string $locale): string
    {
        // do any modification:
        return $string;
    }
}

Slugs

您可以使用Slugs类检查slug是否存在以防止重复的slug。

use Tobento\Service\Slugifier\Resource;
use Tobento\Service\Slugifier\Slugs;
use Tobento\Service\Slugifier\SlugsInterface;

$slugs = new Slugs(
    new Resource\ArrayResource(['login', 'register']),
);

var_dump($slugs instanceof SlugsInterface);
// bool(true)

addResource

您可以使用addResource方法添加资源。

use Tobento\Service\Slugifier\Resource;
use Tobento\Service\Slugifier\Slugs;

$slugs = new Slugs();
$slugs->addResource(new Resource\ArrayResource(['login', 'register']));

exists

使用exists方法检查slug是否存在。

use Tobento\Service\Slugifier\Resource;
use Tobento\Service\Slugifier\Slugs;

$slugs = new Slugs(
    new Resource\ArrayResource(['login', 'register'], ['en']),
);

var_dump($slugs->exists(slug: 'login', locale: 'en'));
// bool(true)

var_dump($slugs->exists(slug: 'login', locale: 'de'));
// bool(false)

findSlug

使用findSlug方法,它根据指定的参数返回单个slug,如果没有找到则返回null。

use Tobento\Service\Slugifier\Resource;
use Tobento\Service\Slugifier\Slugs;
use Tobento\Service\Slugifier\SlugInterface;

$slugs = new Slugs(
    new Resource\ArrayResource(['login', 'register'], ['en']),
);

$slug = $slugs->findSlug(slug: 'login', locale: 'en');
var_dump($slug instanceof SlugInterface);
// bool(true)

var_dump($slug->slug());
// string(5) "login"

var_dump($slug->locale());
// string(2) "en"

var_dump($slug->resourceKey());
// NULL or string

var_dump($slug->resourceId());
// NULL or string|int

var_dump($slugs->findSlug(slug: 'login', locale: 'de'));
// NULL

可用资源

数组资源

use Tobento\Service\Slugifier\Resource\ArrayResource;
use Tobento\Service\Slugifier\SlugInterface;

$resource = new ArrayResource(
    slugs: ['login', 'register'],
    
    // you may set the supported locales:
    supportedLocales: ['en', 'en-GB'],
    
    // or you may use an asterisk as a wildcard:
    // supportedLocales: ['en*'],
    
    // or empty all supported (default):
    // supportedLocales: [],
    
    // you may set a resource key:
    key: 'routes',
    
    // you may change the priority (highest first):
    priority: 1500, // 1000 is default
);

var_dump($resource->slugExists(slug: 'login', locale: 'en'));
// bool(true)

$slug = $resource->findSlug(slug: 'login', locale: 'en');
var_dump($slug instanceof SlugInterface);
// bool(true)

自定义资源

您可以通过实现ResourceInterface创建自定义资源。

use Tobento\Service\Slugifier\ResourceInterface;
use Tobento\Service\Slugifier\Slug;
use Tobento\Service\Slugifier\SlugInterface;

class BlogResource implements ResourceInterface
{
    public function __construct(
        protected BlogRepositoryInterface $blogRepository
    ) {}
    
    /**
     * Returns true if the given slug exists, otherwise false.
     *
     * @param string $slug
     * @param string $locale
     * @return bool
     */
    public function slugExists(string $slug, string $locale = 'en'): bool
    {
        return $this->blogRepository->hasSlug($slug, $locale);
    }
    
    /**
     * Returns a single slug by the specified parameters or null if not found.
     *
     * @param string $slug
     * @param string $locale
     * @return null|SlugInterface
     */
    public function findSlug(string $slug, string $locale = 'en'): null|SlugInterface
    {
        $blog = $this->blogRepository->findBySlug($slug, $locale);
        
        if (is_null($blog)) {
            return null;
        }
        
        return new Slug(
            slug: $slug,
            locale: $locale,
            resourceKey: $this->key(),
            resourceId: $blog->id(),
        );
    }
    
    /**
     * Returns the key.
     *
     * @return null|string
     */
    public function key(): null|string
    {
        return 'blog';
    }
    
    /**
     * Returns the priority.
     *
     * @return int
     */
    public function priority(): int
    {
        return 100;
    }
}

Slugifiers

您可以使用 Slugifiers 类来添加多个 slugifier 以供后续使用。

use Tobento\Service\Slugifier\SlugifierFactory;
use Tobento\Service\Slugifier\SlugifierFactoryInterface;
use Tobento\Service\Slugifier\SlugifierInterface;
use Tobento\Service\Slugifier\Slugifiers;
use Tobento\Service\Slugifier\SlugifiersInterface;

$slugifiers = new Slugifiers([
    'default' => new SlugifierFactory(), // SlugifierFactoryInterface|SlugifierInterface
]);

var_dump($slugifiers instanceof SlugifiersInterface);
// bool(true)

添加

您可以选择使用 add 方法来添加一个 slugifier。

use Tobento\Service\Slugifier\SlugifierFactory;
use Tobento\Service\Slugifier\SlugifierFactoryInterface;
use Tobento\Service\Slugifier\SlugifierInterface;

$slugifiers->add(
    name: 'foo',
    slugifier: new SlugifierFactory(), // SlugifierFactoryInterface|SlugifierInterface
);

存在

使用 has 方法来检查 slugifier 是否存在。

var_dump($slugifiers->has(name: 'foo'));
// bool(false)

获取

使用 get 方法来获取一个 slugifier。如果 slugifier 不存在,将返回一个后备 slugifier。

use Tobento\Service\Slugifier\SlugifierInterface;

$slugifier = $slugifiers->get(name: 'foo');

var_dump($slugifier instanceof SlugifierInterface);
// bool(true)

名称

names 方法返回所有 slugifier 名称。

var_dump($slugifiers->names());
// array(2) { [0]=> string(7) "default" [1]=> string(3) "foo" }

鸣谢