重构了下,请多多指教
我想知道app()实例化一个类和用new实例化,有什么区别?app()只能实例化构造函数不带参数的类吗?
<?php
namespace App\Tools;
use GuzzleHttp\Client;
use Overtrue\Pinyin\Pinyin;
class SlugTranslation
{
private $api = 'http://api.fanyi.baidu.com/api/trans/vip/translate?';
private $appid;
private $key;
private $text;
public function __construct($text, $appid, $key)
{
$this->text = $text;
$this->appid = $appid;
$this->key = $key;
}
public function translate()
{
if(empty($this->appid) || empty($this->key)) {
return $this->pinyin();
}
$http = new Client();
$response = $http->get($this->str_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();
}
}
private function pinyin()
{
return str_slug(app(Pinyin::class)->permalink($this->text));
}
private function str_query()
{
$salt = time();
$sign = md5($this->appid. $this->text . $salt . $this->key);
// 构建请求参数
$query = http_build_query([
"q" => $this->text,
"from" => "zh",
"to" => "en",
"appid" => $this->appid,
"salt" => $salt,
"sign" => $sign,
]);
return $this->api.$query;
}
}
本帖已被设为精华帖!
本帖由系统于 4年前 自动加精
高认可度评论:
看了楼主的代码,有了灵感,所以我也试着重构了一下这部分的代码,想要实现了一个简单的百度翻译接口。
新手的牛刀小试,请多多指教。
既然重构,就来一下啊
看了楼主的代码,有了灵感,所以我也试着重构了一下这部分的代码,想要实现了一个简单的百度翻译接口。
新手的牛刀小试,请多多指教。
@KKKKUNG 调用次数一多,会被百度屏蔽?
@phpero 我觉得应该不会吧。就好比你用百度翻译,你用得多就会把你屏蔽了吗?即使真的要屏蔽,那也应该要在短时间内达到一个对他服务器造成威胁的访问量吧。再或者是需要你充波钱,开个会员之类的。具体的看百度给的文档呀。
@phpero 你是用的我这个这个类吗?api,key,appid 你先确定都写在env文件里了,然后 translate 方法返回的是翻译之后的原字符串,写入数据库的那个数据应该是把字符串内容中的空格用‘-’替换掉的数据,这样的数据在URL里是合格的。
超级棒,面相对象编程。
@phpero 不会被屏蔽 有收费标准的 调的多了就得付费了
@phpero 过多的话会被屏蔽一会的,就像邮箱接口一样,但是翻译字数是计费的
我想知道app()实例化一个类和用new实例化,有什么区别?app()只能实例化构造函数不带参数的类吗?
是的,app是去容器内拿数据,如果构造函数有参数。这时候无论是app()还是依赖注入的方式,都不能。只能使用传统的new一个实例既然重构,就来一下啊