simtecsystem / cakephp-sluggable
为 CakePHP 3.x 开发的插件,可实现数据库字段自动、可配置的缩略词功能
Requires
- php: >=5.4
- cakephp/cakephp: >=3.6.0 <4.0.0
README
为 CakePHP 3.x 开发的插件,可实现数据库字段自动、可配置的缩略词功能
为什么?
因为缩略词非常适合人类可读且SEO友好的页面标题、URL、图片URL等!它们现在是标准做法,而 CakePHP 让您轻松地为应用程序提供创建缩略词的功能。
如何?
只需将 Sluggable.Sluggable
行为添加到任何需要缩略词的字段模型中。有关自定义,请参阅 用法 部分。
要求
- PHP 5.4+
- CakePHP 3.x
目录
插件安装
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.php
中 Plugin::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