Slim PHP可以向其他服务提出请求吗?

时间:2015-02-11 18:09:20

标签: php

我目前正在使用PHP后端构建一个AngularJS应用程序。路由是使用Slim PHP完成的,我发现了一个AngularJs模块来进行基于令牌的身份验证。在后端的模块示例中,他们使用Laravel和一个名为GuzzleHttp \ Client()的客户端。现在,我不确定什么GuzzleHttp做Slim PHP没有(如果有的话),但我试图按照他们的例子,但我不想安装2个基本上可以做同样事情的框架。

所以我完成了路由,以便在向后端(auth / google)发出请求时,它会执行此操作:

public function google()
{
    $app = \Slim\Slim::getInstance();
    $request = $app->request()->getBody();
    $body = json_decode($request);

    $accessTokenUrl = 'https://accounts.google.com/o/oauth2/token';
    $peopleApiUrl = 'https://www.googleapis.com/plus/v1/people/me/openIdConnect';
    $params = array(
        'code' => $body->code,
        'client_id' => $body->clientId,
        'redirect_uri' => $body->redirectUri,
        'grant_type' => 'authorization_code',
        'client_secret' => GOOGLE_SECRET
    );
    $client = new GuzzleHttp\Client();
    // Step 1. Exchange authorization code for access token.
    $accessTokenResponse = $client->post($accessTokenUrl, ['body' => $params]);
    $accessToken = $accessTokenResponse->json()['access_token'];


    $headers = array('Authorization' => 'Bearer ' . $accessToken);
    // Step 2. Retrieve profile information about the current user.
    $profileResponse = $client->get($peopleApiUrl, ['headers' => $headers]);
    $profile = $profileResponse->json();
    // Step 3a. If user is already signed in then link accounts.
    if (Request::header('Authorization'))
    {
        $user = User::where('google', '=', $profile['sub']);
        if ($user->first())
        {
            return Response::json(array('message' => 'There is already a Google account that belongs to you'), 409);
        }
        $token = explode(' ', Request::header('Authorization'))[1];
        $payloadObject = JWT::decode($token, Config::get('secrets.TOKEN_SECRET'));
        $payload = json_decode(json_encode($payloadObject), true);
        $user = User::find($payload['sub']);
        $user->google = $profile['sub'];
        $user->displayName = $user->displayName || $profile['name'];
        $user->save();
        return Response::json(array('token' => $this->createToken($user)));
    }
    // Step 3b. Create a new user account or return an existing one.
    else
    {
        $user = User::where('google', '=', $profile['sub']);
        if ($user->first())
        {
            return Response::json(array('token' => $this->createToken($user->first())));
        }
        $user = new User;
        $user->google = $profile['sub'];
        $user->displayName = $profile['name'];
        $user->save();
        return Response::json(array('token' => $this->createToken($user)));
    }
}

现在这不起作用,因为我没有安装GuzzleHttp,但我的问题是:我可以在Slim PHP中执行此操作,还是需要GuzzleHttp来补充它?

3 个答案:

答案 0 :(得分:2)

Guzzle是一个基于代码的HTTP客户端软件包/框架,它还包含DOM抓取功能,而不是微框架,因此它与Slim不相似。

从他们的自述文件:

  

Guzzle是一个PHP HTTP客户端,可以轻松发送HTTP请求,并且可以轻松地与Web服务集成。

Slim不直接提供此功能,因为它不属于Slim的意图,它将HTTP请求转换为HTTP响应(以及需要在其间发生的核心事物)。

由于你的例子是在Guzzle并且它实现了你想要做的事情,我可能会使用Guzzle。但是,您可以使用cURLext/http或其他HTTP客户端程序包执行相同类型的事务(即与外部Web服务交互)。有几个。

答案 1 :(得分:0)

Slim是一个微框架,它基本上提供来自应用程序的客户端请求和响应。这意味着Slim会响应请求,例如,它不会向外部HTTP发出请求。 Slim的想法是提供路线,在它到来时做一些事情并响应客户。 如果您需要使用外部呼叫,则需要使用任何HTTP客户端,它将提供“响应”请求和威胁的“能力”。你可以原生使用curl(所有其他的只是卷曲的“接口”)或lib。

答案 2 :(得分:0)

Slim和Guzzle有很多共同点,即它们都处理psr-7请求和响应

有一个主要区别 Slim处理请求和发送响应 Guzzle处理发送请求和处理响应

因此它们是不可互换的,并且处理通信管道的相反端

因此,如果您的处理要求某人已发送给您,则您需要苗条或类似的东西 如果您要向其他人发送请求,那么您需要精打细算或类似