simtecsystem/cakephp-sluggable

为 CakePHP 3.x 开发的插件,可实现数据库字段自动、可配置的缩略词功能

安装次数: 13

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 2

类型:cakephp-plugin

1.0.4 2019-06-04 09:44 UTC

This package is auto-updated.

Last update: 2024-09-04 21:23:47 UTC


README

为 CakePHP 3.x 开发的插件,可实现数据库字段自动、可配置的缩略词功能

为什么?

因为缩略词非常适合人类可读且SEO友好的页面标题、URL、图片URL等!它们现在是标准做法,而 CakePHP 让您轻松地为应用程序提供创建缩略词的功能。

如何?

只需将 Sluggable.Sluggable 行为添加到任何需要缩略词的字段模型中。有关自定义,请参阅 用法 部分。

要求

目录

  1. 插件安装
  2. 用法
  3. 示例
  4. 贡献

插件安装

  1. Composer 安装
  2. 手动安装
  3. 在您的应用程序中加载插件
  4. 设置命名空间/自动加载器

Composer 安装

此插件位于 Packagist 上,这意味着它可以很容易地通过 Composer 安装。

composer require simtecsystem/cakephp-sluggable

然后在您的 config/bootstrap.php 文件中正常加载此插件

# in ../config/bootstrap.php - right after Plugin::load('Migrations') is fine!
Plugin::load('Sluggable');

手动安装

您还可以手动在您的 App 中加载此插件

在您的应用程序中加载插件

将此项目的源代码添加到 plugins/Sluggable

然后配置您的 App 以实际加载此插件

# in ../config/bootstrap.php
Plugin::load('Sluggable');
设置命名空间/自动加载器

在您的 composer.json 文件中告诉自动加载器在何处找到您的命名空间

	(..)
    "autoload": {
        "psr-4": {
           (..)
            "Sluggable\\": "./plugins/Sluggable/src"
        }
    },
    (..)

然后您需要在命令行上运行以下命令

	php composer.phar dumpautoload

如果您无法使 composer 自动加载正常工作,请将 'autoload' => true 行添加到您的 bootstrap.phpPlugin::load(..) 命令(参见加载部分)

缩略词行为

可缩略的行为实现起来非常简单,只需像添加其他行为一样将其添加到您的 Table

class PostsTable extends Table
{
	public function initialize(array $options)
	{
		parent::initialize($options);
		
		$this->addBehavior('Sluggable.Sluggable');
	}
}

默认情况下,插件将自动根据 name 生成缩略词,并将其存储在名为 slug 的列中,使用破折号 - 替换,并且不会在 name 更改时自动覆盖缩略词字段。

当然,所有这些设置都是可配置的。

  • 模式
    • :name (默认)
    • 一个 \Cake\Utility\Text::insert() 友好的标记化字符串。任何实体字段都是有效选项
  • 字段
    • slug (默认)
    • 存储缩略词的实体字段
  • 替换
    • - (默认)
    • 在构建缩略词时用于替换空格的字符串
  • 覆盖
    • false (默认)
    • true,如果缩略词应该在保存时始终重新生成。false,仅生成一次

示例

根据 title 字段而不是 name 生成缩略词

class PostsTable extends Table
{
	public function initialize(array $options)
	{
		parent::initialize($options);
		
		$this->addBehavior('Sluggable.Sluggable', [
			'pattern' => ':title',
		]);
	}
}

基于 id title 生成缩略词

class PostsTable extends Table
{
	public function initialize(array $options)
	{
		parent::initialize($options);
		
		$this->addBehavior('Sluggable.Sluggable', [
			'pattern' => ':id-:title',
		]);
	}
}

基于 title 的最新版本生成缩略词(始终)

class PostsTable extends Table
{
	public function initialize(array $options)
	{
		parent::initialize($options);
		
		$this->addBehavior('Sluggable.Sluggable', [
			'pattern' => ':title',
			'overwrite' => true,
		]);
	}
}

正常生成缩略词,但存储在 foo 列中

class PostsTable extends Table
{
	public function initialize(array $options)
	{
		parent::initialize($options);
		
		$this->addBehavior('Sluggable.Sluggable', [
			'field' => 'foo',
		]);
	}
}

使用点 . 而不是破折号 - 生成缩略词

class PostsTable extends Table
{
	public function initialize(array $options)
	{
		parent::initialize($options);
		
		$this->addBehavior('Sluggable.Sluggable', [
			'replacement' => '.',
		]);
	}
}

缩略词实用工具

Sluggable 插件添加了一个名为 Slug 的实用工具类,可以静态调用。这是行为用于实际生成缩略词的功能。

它能够处理字符串、数组或实体以及简单的字符串或 Text::insert 友好的模式。

要使用实用工具,只需在您的类头中添加以下内容

	use Sluggable\Utility\Slug;

实用工具提供了以下功能

 /**
     * Turns a string (and optionally a dynamic, data-injected string) into a slugged value
     * @param $pattern string a simple string (e.g. 'slug me') 
     * 						  or Text::insert-friendly string (e.g. ':id-:name')
     * @param $data mixed an Array or Entity of data to Text::insert inject into $pattern
     * @param $replacement string the character to replace non-slug-friendly characters with (default '-')
     * @return string the slugged string
     */
    Slug::generate($pattern, $data = [], $replacement = '-');

示例

	use Sluggable\Utility\Slug;

	echo Slug::generate('slug me');
	# 'slug-me'

	echo Slug::generate('SLUG(!@#(ME');
    # 'slug-me'

    echo Slug::generate('a really long slug that i just made');
    # 'a-really-long-slug-that-i-just-made'

通过 array 使用 Text::insert...

	$data = [
		'id' => 123,
		'name' => 'abc',
		'description' => 'Hello, World!',
	];

	$slug = Slug::generate(':id-:name', $data);
	# '123-abc'

	$slug = Slug::generate(':description', $data);
	# 'hello-world'

通过 Entity 属性使用 Text::insert...

	$data = new Entity([
		'id' => 123,
		'name' => 'abc',
		'description' => 'Hello, World!',
	]);

	$slug = Slug::generate(':id-:name', $data);
	# '123-abc'

	$slug = Slug::generate(':description', $data);
	# 'hello-world'

贡献

如果您想贡献力量,请提交带有您更改的 PR!

如果请求附带 测试,将更容易被接受 :D