• Laravel 博客开发|自动生成 Slug


    前面在文章表中添加了 slug 字段,用于存文章标题的英文翻译,并且在管理后台添加和编辑文章的时候可以填入 slug字段。现在来做一点修改,在添加文章的时候如果没有填入 slug字段的时候,自动将文章标题翻译为英文,并存到 slug字段。

    为了实现自动生成 slug需要两个工具:

    1. 百度翻译 API。
    2. overtrue/pinyin 扩展包。

    在没有填写 slug字段的时候,调用百度翻译 API 将文章标题翻译成英文,百度翻译的 API 免费次数是有限的,如果百度翻译不可用的时候,就使用 overtrue/pinyin将文章标题转换为汉语拼音。

    安装扩展

    运行如下命令安装 overtrue/pinyin扩展:

    composer require "overtrue/pinyin"
    
    • 1

    添加处理器

    现在添加一个处理器来实现上面的逻辑,运行如下命令创建一个 Handlers目录:

    mkdir app/Handlers
    
    • 1

    运行如下命令创建一个 SlugTranslateHandler.php文件:

    touch app/Handlers/SlugTranslateHandler.php
    
    • 1

    添加如下内容:

     namespace App\Handlers;
    
    use GuzzleHttp\Client;
    use Overtrue\Pinyin\Pinyin;
    
    use Illuminate\Support\Str;
    
    class SlugTranslateHandler
    {
        public function translate($text)
        {
            $http = new Client;
    
            $api = 'http://api.fanyi.baidu.com/api/trans/vip/translate?';
            $appid = config('services.baidu_translate.appid');
            $key = config('services.baidu_translate.key');
            $salt = time();
    
            if (empty($appid) || empty($key)) {
                return $this->pinyin($text);
            }
    
            $sign = md5($appid. $text . $salt . $key);
    
            $query = http_build_query([
                "q"     =>  $text,
                "from"  => "zh",
                "to"    => "en",
                "appid" => $appid,
                "salt"  => $salt,
                "sign"  => $sign,
            ]);
    
            $response = $http->get($api.$query);
    
            $result = json_decode($response->getBody(), true);
    
            if (isset($result['trans_result'][0]['dst'])) {
                return Str::slug($result['trans_result'][0]['dst']);
            } else {
                return $this->pinyin($text);
            }
        }
    
        public function pinyin($text)
        {
            return Str::slug(app(Pinyin::class)->permalink($text));
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    配置文件

    要使用百度翻译 API 需要去百度翻译开放平台申请,在「管理后台」可以看到 appidkey,然后将 appidkey存放到 .env文件中。
    .env

    .
    .
    .
    
    BAIDU_TRANSLATE_APPID=xxxxxxxxxxxxx
    BAIDU_TRANSLATE_KEY=xxxxxxxxxxxxxxxxx
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    env.example中也增加相应的键:
    env.example

    BAIDU_TRANSLATE_APPID=
    BAIDU_TRANSLATE_KEY=
    
    • 1
    • 2

    将这种第三方服务授权认证信息存放于 services.php 里:
    config/services.php

     return [
    
        .
        .
        .
    
        'baidu_translate' => [
            'appid' => env('BAIDU_TRANSLATE_APPID'),
            'key'   => env('BAIDU_TRANSLATE_KEY'),
        ],
    
    ];
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    调用翻译

    修改文章模型观察器:
    app/Observers/ArticleObserver.php

    .
    .
    .
    public function saving(Article $article)
    {
      $article->excerpt = $this->make_excerpt($article->content);
      if ( ! $article->slug) {
        $article->slug = app(SlugTranslateHandler::class)->translate($article->title);
      }
    }
    .
    .
    .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    百度翻译报错

    百度翻译可能报INVALID_CLIENT_IP错误,格式如下:

    array:3 [
      "error_code" => "58000"
      "error_msg" => "INVALID_CLIENT_IP"
      "data" => array:1 [
        "client_ip" => "220.165.198.126"
      ]
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    根据错误码来定位错误,客户端 IP 非法,请检查申请里面填写的服务器地址。

  • 相关阅读:
    数学建模--优化类模型
    购物商城6.27待完成
    浅析STL三大组件,容器 算法 迭代器。
    机器人控制器编程实践指导书旧版-实践四 步进电机(执行器)
    linux常用基本命令实例(常用的linux命令建议收藏)
    手机上记录的备忘录内容怎么分享到电脑上查看?
    永无止境——Google传
    vue 2 与 vue3 获取模版引用 (ref)的区别
    php正则笔记-匹配字母、数字、中文
    Unity接入SQLite (一):SQLite介绍
  • 原文地址:https://blog.csdn.net/u010212601/article/details/126518994