我正在开发一个与API接口的对象。对API的某些调用需要身份验证,而其他调用则不需要。在最佳实践方面,应该
A) 身份验证方法返回一个令牌。在调用需要身份验证的api调用/方法之前从控制器调用该方法,并将令牌作为参数传入。
class api {
public function auth() {
.....
return $token;
}
public function getInfo($token) {
.....
}
b)中 身份验证方法使用令牌设置类的属性,您必须记住在调用需要身份验证的方法之前调用该方法
class api {
private $token;
public function auth() {
.....
$this->token = $token;
}
public function getInfo() {
$token = $this->token;
.....
}
c)中 需要auth调用auth方法的方法
class api {
private $token;
public function auth() {
.....
return $token;
}
public function getInfo() {
$token = $this->auth();
.....
}
我认为以上内容可以将缓存的auth作为属性来保存对auth api调用的不必要的调用。
还是其他任何方式?只是寻找这种对象的最佳实践和原因。提前谢谢!
答案 0 :(得分:2)
“c”是要走的路。
没有其他对象需要知道哪种方法需要验证,哪种方法不需要。
事实上...你的auth()方法甚至不应该公开,并且凭证“user,pass”应该通过api类中的构造函数传递。
答案 1 :(得分:1)
如果从长期可维护性的角度来看,选项 A 是最好的选项。这是因为您应该测试所有public
方法。直接传递值,而不是对公共方法进行内部调用,使得为特定类编写单元测试变得更加容易。
也就是说,身份验证通常是它自己的事情,而不是成为类的一部分,这也是其他事情,如this post中所述。您的示例中的方法让我怀疑您违反了SRP。
现在我想到了,拥有一个类,其中一个公共方法将另一个公共方法作为依赖项,可能被视为code smell,与SRP违规相关联。