【发布时间】:2021-09-12 16:18:43
【问题描述】:
我有一个带搜索功能的界面:
interface Searcher
{
public function search($text,$limit)
}
我有一些基于API的实现
class APISeach implements Searcher
{
public function search($text,$limit)
{
$params = [
'name' => $sName,
'maxRows' => $iLimit,
];
$response = Http::get('http://some_api_service/search', $params)->json();
}
}
我有一些代码使用了这个搜索:
class MyController extends Controller
{
private $seacher;
public function __construct(Searcher $mySeacher)
{
$this->seacher = $mySeacher;
}
public function search($text,$limit=10)
{
$this->seacher->search($text,$limit)
}
}
一切看起来都很好(可能)。但是,如果我需要更改 API 实现并且需要其他参数怎么办。例如:
class AnotherAPISeach implements Searcher
{
public function search($text,$language,$fuzzy,$limit)
{
$ApiObjectFromLib = new ApiObjectFromLib();
$response = $ApiObjectFromLib->search($text,$language,$fuzzy,$limit)->json();
}
}
所以它不能再实现 Searcher 接口了。 是否存在使用 API 函数接口的任何方式?所有API都需要各种参数,如果我需要更改每个API的接口或控制器代码,那就不好了。
【问题讨论】:
-
我建议使用
Criterion类型声明和可变参数:search(Criterion ...$criteria)。这本身就是一个接口,它定义了如何将条件更改集成到其他查询中。 -
Jared Farrish - 标准类型对我来说是新事物。你能得到任何文档链接吗?
-
这是过滤器/标准模式,其中一个对象描述了如何修改查询。我很惊讶 Eloquent 没有实现它(或类似的规范模式),所以请查看 Doctrine docs 以了解它的含义。
标签: php laravel interface laravel-api