Laravel 博客开发|自动生成 Slug

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

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

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

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

安装扩展

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

composer require "overtrue/pinyin"

添加处理器

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

mkdir app/Handlers

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

touch app/Handlers/SlugTranslateHandler.php

添加如下内容:

<?php 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));
    }
}

配置文件

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

.
.
.

BAIDU_TRANSLATE_APPID=xxxxxxxxxxxxx
BAIDU_TRANSLATE_KEY=xxxxxxxxxxxxxxxxx

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

BAIDU_TRANSLATE_APPID=
BAIDU_TRANSLATE_KEY=

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

<?php return [

    .
    .
    .

    'baidu_translate' => [
        'appid' => env('BAIDU_TRANSLATE_APPID'),
        'key'   => env('BAIDU_TRANSLATE_KEY'),
    ],

];

调用翻译

修改文章模型观察器:
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);
  }
}
.
.
.

百度翻译报错

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

array:3 [
  "error_code" => "58000"
  "error_msg" => "INVALID_CLIENT_IP"
  "data" => array:1 [
    "client_ip" => "220.165.198.126"
  ]
]

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SevDot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值