0

我正在开发一个与 API 交互的对象。对 API 的某些调用需要身份验证,而其他调用则不需要。就最佳实践而言,应该

a) 认证方法返回一个令牌。该方法在调用需要身份验证的 api 调用/方法之前从控制器调用,并且令牌作为参数传入。

class api {
    public function auth() {
        .....
        return $token;
    }
    public function getInfo($token) {
        .....
    }

b) 认证方法使用token设置类的属性,在调用需要认证的方法之前一定要记得调用该方法

class api {
    private $token;
    public function auth() {
        .....
        $this->token = $token;
    }
    public function getInfo() {
        $token = $this->token;
        .....
    }

c) 需要认证的方法调用认证方法本身

class api {
    private $token;
    public function auth() {
        .....
        return $token;
    }
    public function getInfo() {
        $token = $this->auth();
        .....
    }

我想上面可能有一个缓存的身份验证作为属性来保存对身份验证 api 调用的不必要调用。

还是有什么其他方式?只是寻找这样一个对象的最佳实践以及为什么。提前致谢!

4

2 回答 2

2

“c”是要走的路。

没有其他对象需要知道哪个方法需要验证,哪个不需要。

事实上......您的 auth() 方法甚至不应该是公共的,并且凭据“用户,通过”应该通过 api 类中的构造函数传递。

见:http ://en.wikipedia.org/wiki/Separation_of_concerns

于 2013-10-17T16:49:08.937 回答
1

如果从长期可维护性的角度来看,从三个可用的选项A是更好的一个。这是因为您应该测试所有public方法。直接传递值,而不是对公共方法进行内部调用,可以更轻松地为该特定类编写单元测试。

也就是说,身份验证通常是它自己的事情,而不是作为类的一部分,它也做其他事情,如本文所述。您示例中的方法让我怀疑您违反了SRP

更新

现在我想到了,拥有一个类,其中一个公共方法具有另一个公共方法作为依赖项,可能被认为是与 SRP 违规相关的代码异味。

于 2013-10-17T18:48:40.183 回答