zf2 LoginServiceInterface与模型

时间:2016-10-10 16:05:33

标签: php zend-framework zend-framework2

我是ZF2的新手,我正在研究服务和ServiceManager。我想做一个"身份验证"通过API(http://127.0.0.1/api/login),我需要同时与DB进行交互。我会在登录后从API中获得一些数据,另外一个数据我会从数据库获得一些其他数据。

我有一个登录方法

的LoginController
  

$ test = $ this-> loginService-> login($ username,$ password);

我使用其他登录方法创建了一个登录服务:

  

$ apiService = new ApiService();

     

$ userApi = $ apiService-> postRequest('登录/',['电子邮件' => $ username,'密码' => $密码]);

对API的调用我已经投入了另一项服务(ApiService)。

第一个问题是我如何才能不依赖ApiService?我的服务取决于另一个 第二个问题是如何将api数据与此LoginService中的db数据混合使用?将模型注入工厂并在服务中调用它是最佳做法吗?

我脑子里的流动应该是这样的: LoginController - > LoginService - > API调用 - > LoginService - > DB - > LoginService - > LoginController - >观点或其他。

我知道通过API登录不是最佳做法,因为我没有使用授权框架,但目前只需调用端点并获得完整的json即可。

谢谢你的答案。

1 个答案:

答案 0 :(得分:0)

您可以通过创建任意数量的实现新界面的服务来封装登录功能,可能是LoginServiceInterface。此接口将定义身份验证所需的实际方法,具体类将实现它们。

界面看起来像这样。

interface LoginServiceInteface
{
    public function login($username, $password);    
}

然后,具体实现可以定义登录方法。

class ApiLoginService implements LoginServiceInterface
{
    protected $dbAdapter;
    protected $apiService;

    public function __construct(ApiServiceInterface $apiService, Adapter $dbAdapter)
    {
        $this->dbAdapter  = $dbAdapter;
        $this->apiService = $apiService;
    }

    public function login($username, $password)
    {
        // do some queries.
        //$this->dbAdapter->query('')...

        $response = $this->apiService->makeSomeCallToApi([$username, $password]);

        if ($response) {
            return true;
        }
        return false;
    }
}

您还需要向服务管理器注册该类,并创建一个服务工厂来注入依赖项。