tobento / service-slugifier
Slugifier服务提供将字符串转换为slug的接口。
Requires
- php: >=8.0
Requires (Dev)
- phpunit/phpunit: ^9.5
- vimeo/psalm: ^4.0
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" }