正确设计依赖于其他方法结果的方法

时间:2013-10-17 16:33:22

标签: php api oop authentication design-patterns

我正在开发一个与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调用的不必要的调用。

还是其他任何方式?只是寻找这种对象的最佳实践和原因。提前谢谢!

2 个答案:

答案 0 :(得分:2)

“c”是要走的路。

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

事实上...你的auth()方法甚至不应该公开,并且凭证“user,pass”应该通过api类中的构造函数传递。

请参阅:http://en.wikipedia.org/wiki/Separation_of_concerns

答案 1 :(得分:1)

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

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

更新

现在我想到了,拥有一个类,其中一个公共方法将另一个公共方法作为依赖项,可能被视为code smell,与SRP违规相关联。