创建 laravel 服务类

Posted

技术标签:

【中文标题】创建 laravel 服务类【英文标题】:Creating laravel service class 【发布时间】:2019-02-19 12:22:01 【问题描述】:

我的正常运行时间.php

<?php 

$curl = curl_init();

curl_setopt_array($curl, array(
CURLOPT_URL => "https://api.uptimerobot.com/v2/getMonitors",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "Your Api Key",
CURLOPT_HTTPHEADER => array(
  "cache-control: no-cache",
  "content-type: application/x-www-form-urlencoded"
 ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

 if ($err) 
   echo "cURL Error #:" . $err;
 else 
$data = json_decode($response);
$custom_uptime = ($data->monitors[0]->custom_uptime_ratio);
$uptime = explode("-",$custom_uptime);


?>

ApiCommand.php

public function handle()

   //include(app_path() . '/Includes/Uptime.php')
   $this->showMonitors();


public function showMonitors(UptimeRobotAPI $uptime_api)

    $monitors = $uptime_api->getMonitors();

    return $monitors;

大家好。我只是想问我怎样才能把它变成一个服务类?我需要使用服务提供者或服务容器吗?提前致谢。

有人将它转换为服务类,这是我的命令的样子。

【问题讨论】:

github.com/guzzle/guzzle @emotality 你能向我解释一下它是如何让服务类造成我很困惑的吗:/ 这太宽泛了。服务类没什么特别的,学习 OOP 和 SOLID。 我现在要粘贴一些东西。 :) 【参考方案1】:

在您的终端中,需要 guzzle 包,因为您将使用它作为 HTTP 客户端:composer require guzzlehttp/guzzle

然后您可以在app/Services/UptimeRobotAPI.php 为您的UptimeRobotAPI 开设课程:

<?php

namespace App\Services;

use GuzzleHttp\Client;

class UptimeRobotAPI

    protected $url;
    protected $http;
    protected $headers;

    public function __construct(Client $client)
    
        $this->url = 'https://api.uptimerobot.com/v2/';
        $this->http = $client;
        $this->headers = [
            'cache-control' => 'no-cache',
            'content-type' => 'application/x-www-form-urlencoded',
        ];
    

    private function getResponse(string $uri = null)
    
        $full_path = $this->url;
        $full_path .= $uri;

        $request = $this->http->get($full_path, [
            'headers'         => $this->headers,
            'timeout'         => 30,
            'connect_timeout' => true,
            'http_errors'     => true,
        ]);

        $response = $request ? $request->getBody()->getContents() : null;
        $status = $request ? $request->getStatusCode() : 500;

        if ($response && $status === 200 && $response !== 'null') 
            return (object) json_decode($response);
        

        return null;
    

    private function postResponse(string $uri = null, array $post_params = [])
    
        $full_path = $this->url;
        $full_path .= $uri;

        $request = $this->http->post($full_path, [
            'headers'         => $this->headers,
            'timeout'         => 30,
            'connect_timeout' => true,
            'http_errors'     => true,
            'form_params'     => $post_params,
        ]);

        $response = $request ? $request->getBody()->getContents() : null;
        $status = $request ? $request->getStatusCode() : 500;

        if ($response && $status === 200 && $response !== 'null') 
            return (object) json_decode($response);
        

        return null;
    

    public function getMonitors()
    
        return $this->getResponse('getMonitors');
    

你可以在下面添加更多的函数,我创建了getMonitors()作为例子。

要在控制器中使用它,您可以简单地将其依赖注入到您的控制器方法中:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Services\Promises\UptimeRobotAPI;

class ExampleController extends Controller

    public function showMonitors(UptimeRobotAPI $uptime_api)
    
        $monitors = $uptime_api->getMonitors();

        return view('monitors.index')->with(compact('monitors'));
    

这只是一个例子,它不处理可能发生的任何错误或超时,这只是为了你理解和扩展。我不知道你想用它做什么,但我无法编写你的整个项目,但这肯定会回答你的问题。 :)

【讨论】:

如果您的 POST 有问题,我会提供替代方案。 我只有一个简单的担心,你做的是对的。我感谢你的努力和工作。基本上我有三个不同的课程,其中之一就是你所做的正常运行时间。我想在我的控制台命令上使用它,之前我必须include(app_path() . '/Includes/Uptime.php')); 你能看看我上面的代码并检查我是否走对了路?谢谢。 我正在创建一个报告工具来检查我所有的 GA 、抓取报告和正常运行时间,我的命令是创建刀片文件并从我提到的三个类中获取值的人。抱歉回复晚了我周末有工作:/我希望你有时间时仍然回复。谢谢。

以上是关于创建 laravel 服务类的主要内容,如果未能解决你的问题,请参考以下文章

Laravel全局传递参数

Laravel 从注册提供者那里获取帮助类

laravel 服务容器实现原理

laravel 的数据表服务器端 php 类

PHPer面试指南-laravel 篇

Laravel创建 Service Provider 测试实例