sawastacks/ci4-slugify

Codeigniter的简单Slugify库

v2.1.0 2024-08-26 17:36 UTC

This package is auto-updated.

Last update: 2024-09-26 19:29:00 UTC


README

Latest Stable Version GitHub code size in bytes Total Downloads Package License Buy me a coffee

内容

Codeigniter 4的简单Slugify库

这个库提供了一种生成唯一slug的方法。

drawing

背景:什么是slug?

slug是字符串的简化版本,通常是URL友好的。将字符串“slugging”通常涉及将其转换为单一种类,并删除任何非URL友好的字符(空格、带重音的字母、和号等)。然后可以将生成的字符串用作特定资源的标识符。

例如,如果你有一个带帖子的博客,你可以通过ID引用每个帖子

http://yourdomain.com/post/1
http://yourdomain.com/post/2

...但这并不特别友好(特别是对于SEO)。你可能更愿意在URL中使用帖子的标题,但如果你帖子的标题是“André & François took 55% of the whole space in REAC Company”,这也可能是一个问题,因为这个URL看起来也很丑

http://yourdomain.com/post/Andr%C3%A9%20&%20Fran%C3%A7ois%20took%2055%%20of%20the%20whole%20space%20in%20REAC%20Company

解决方案是从标题创建一个slug并使用它。你可能想使用Codeigniter内置的\url_title('This is the title','-', true)辅助函数将标题/字符串转换为slug,如下所示

http://yourdomain.com/post/andre-francois-took-55-of-the-whole-space-in-reac-company

这样的URL会让用户更高兴(它可读,更容易输入等)。

更多信息,你可能想阅读维基百科上的这个描述

slugs通常也是唯一的。所以如果你用相同的标题写另一篇帖子,你将需要以某种方式区分它们,通常是在slug的末尾添加一个递增计数器

http://yourdomain.com/post/andre-francois-took-55-of-the-whole-space-in-reac-company
http://yourdomain.com/post/andre-francois-took-55-of-the-whole-space-in-reac-company-1
http://yourdomain.com/post/andre-francois-took-55-of-the-whole-space-in-reac-company-2

这保持了URL的唯一性。

安装

此软件包可以通过composer require安装。在安装之前,请确保你的系统正在使用PHP >= 7.2。只需在你的cmd或终端中运行以下命令即可

通过Composer安装软件包

composer require sawastacks/ci4-slugify

用法

在您的Codeigniter项目中安装了此软件包后,您现在有许多方法可以生成博客帖子或产品的唯一slug。只需遵循以下指南,这些指南将教您如何在控制器中使用SlugService类。

Slugify类

生成slug的所有逻辑都由SawaStacks\CodeIgniter\Slugify类处理。

通常,您不需要直接访问此类,尽管有一个静态方法可以用来为给定的字符串生成slug,而不实际创建或保存相关的模型。您需要做的,就是在控制器中使用以下策略来生成唯一slug。

<?php

namespace App\Controllers;

use App\Controllers\BaseController;
use App\Models\Post;
use SawaStacks\CodeIgniter\Slugify;

class TestController extends BaseController
{
    public function index(){
        $post = new Post();
        $title = 'André & François won mathematics competion';
        $slug = Slugify::table('posts')->make($title); //When you use table name
        $slug = Slugify::model(Post::class)->make($title); //When you use model object
        //Result for $slug: andre-francois-won-mathematics-competion-3
        $post->save([
            'title'=>$title,
            'slug'=>$slug 
        ]);
    }   
}

以下是一些可能的示例,您可以在控制器中使用SlugService类生成唯一的slug

<?php

namespace App\Controllers;

use App\Controllers\BaseController;
use App\Models\Post;
use SawaStacks\CodeIgniter\Slugify;

class TestController extends BaseController
{
    public function index(){

        $post = new Post();
        $title = 'André & François won mathematics competion';

        /** Default way. Both lines will return same result */
        $slug = Slugify::table('posts')->make($title);
        $slug = Slugify::model(Post::class)->make($title);

        /** When you specify slug field name. defaul is 'slug' */
        $slug = Slugify::table('posts')->make($title,'post_slug');
        $slug = Slugify::model(Post::class)->make($title,'post_slug');

        /** When you specify divider/separator for generated slug. default is '-' */
        $slug = Slugify::table('posts','id')->make($title);
        $slug = Slugify::model(Post::class,'id')->make($title);
    
       /** When you specify divider/separator for generated slug. default is '-' */
        $slug = Slugify::table('posts')->separator('_')->make($title);
        $slug = Slugify::model(Post::class)->separator('_')->make($title);
            
        //Result for $slug: 1: andre-francois-won-mathematics-competion
        //Result for $slug: 2: andre_francois_won_mathematics_competion   
    }   
}

更新记录

当您不是插入新记录,而是更新现有记录时,您需要在链中添加一个额外的函数,即sid()。以下是一个如何生成选定记录的新slug的示例。

<?php

namespace App\Controllers;

use App\Controllers\BaseController;
use App\Models\Post;
use SawaStacks\CodeIgniter\Slugify;

class TestController extends BaseController
{
    public function update_post(){
        $id = $request->getVar('post_id');
        $post = new Post();
        $title = 'André & François won mathematics competion';

        $slug = Slugify::model(Post::class)->sid($id)->make($title);
  
    }

}

类参考

SawaStacks\CodeIgniter\Slugify

table()

参数

  • 此方法有两个参数。第一个参数将是所需表的名字。第二个参数是模型表的键。例如:model('products','pid')。第二个参数的默认值是主键,即'id'。这意味着我们假设产品表有id列/字段。

model()

参数

  • 此方法有两个参数。第一个参数是必需的,它是模型对象的实例。第二个参数是模态表的主键。例如:model(Product::class,'pid')。第二个参数(主键)的默认值是 'id'。这意味着我们假设产品表的结构中有一个名为 id 的列/字段。

sid()

参数

  • 此方法有一个参数。该参数是必需的,并且必须是一个整数。例如:sid(12)。这个数字是所选行的 id。

separator()

参数

  • 此方法有一个参数。在这里,您可以指定将包含在生成的 slug 中的分隔符。例如:separator('_')。默认值是破折号 '-'

make()

参数

  • 此方法有两个参数。第一个参数是从标题中获取的字符串值,是必需的。第二个参数是 slug 字段名。您可以在该方法中指定字段名。第二个参数的默认值是 'slug'。例如:make('您选择的标题','slug')

版权和许可

此软件包由 Sawa Stacks 编写,并按照 MIT 许可证 发布。

版权(c)2023 Sawa Stacks。