PHP 프레임워크 Laravel Laravel에서 API 통합을 위해 Saloon을 사용하는 방법에 대해 이야기해 보겠습니다.

Laravel에서 API 통합을 위해 Saloon을 사용하는 방법에 대해 이야기해 보겠습니다.

Oct 27, 2022 pm 07:28 PM
php laravel

Laravel에서 API 통합을 위해 Saloon을 어떻게 사용하나요? 다음 글에서는 Laravel에서 API 통합을 위해 Saloon을 사용하는 방법을 소개하겠습니다. 도움이 되셨으면 좋겠습니다!

Laravel에서 API 통합을 위해 Saloon을 사용하는 방법에 대해 이야기해 보겠습니다.

우리는 모두 Laravel에서 타사 API와 통합하고 싶었고 "어떻게 해야 할까?"라고 자문했습니다. 저는 API 통합에 관해서는 낯선 사람이 아니지만, 항상 최선의 접근 방식이 무엇인지 궁금합니다. Sam Carré는 2022년 초에 Saloon이라는 패키지를 구축하여 놀라운 API 통합을 구현했습니다. 그러나 이 게시물은 매우 다를 것이며 이를 사용하여 처음부터 통합을 구축하는 방법에 대한 연습이 될 것입니다.

모든 위대한 일과 마찬가지로 laravel new로 시작해서 거기서부터 시작합니다. 이제 Laravel을 설치할 때 laravel 설치 프로그램 또는 composer를 사용할 수 있습니다. 이 부분은 귀하에게 달려 있습니다. 가능하다면 설치 프로그램을 권장합니다. 프로젝트를 생성하는 것 이상의 작업을 쉽게 수행할 수 있는 옵션을 제공하기 때문입니다. 새 프로젝트를 만들고 원하는 코드 편집기에서 엽니다. 일단 거기에 도착하면 갈 수 있습니다. laravel new 开始并从那里开始,所以让我们开始吧。 现在在安装 Laravel 时,你可以使用 laravel installercomposer ——这部分由你决定。 如果可以的话,我会推荐安装程序,因为它提供了简单的选项来做更多的事情,而不仅仅是创建一个项目。 创建一个新项目并在您选择的代码编辑器中打开它。 一旦我们在那里,我们就可以开始了。

我们要建造什么? 我很高回答这个提问! 我们将构建与 GitHub API 的集成,以获取可用于 repo 的工作流列表。 现在,如果你像我一样在命令行上花费大量时间,这可能会非常有用。 你正在开发一个应用程序,将更改推送到一个分支或创建一个 PR - 它通过一个可能正在运行许多其他事情之一的工作流。 了解此工作流程的状态有时会对您接下来的工作产生巨大影响。 功能齐全吗? 我们的工作流程运行是否存在问题? 我们的测试或静态分析是否通过了? 所有这些你通常会等待并检查 GitHub 上的 repo 以查看状态。 此集成将允许您运行 artisan 命令,获取 repo 的可用工作流列表,并允许你触发新的工作流运行。

所以到现在为止,composer 应该已经完成了它的工作并安装了一个完美的起点,一个 Laravel 应用程序。 接下来我们需要安装 Saloon - 但我们要确保安装 laravel 版本,所以在终端中运行以下命令:

composer require sammyjo20/saloon-laravel
로그인 후 복사

就像这样,我们已经离更容易的集成更近了一步。 如果你在此阶段有任何问题,请确保检查您正在使用的 Laravel 和 PHP 版本,因为 Saloon 至少需要 Laravel 8 和 PHP 8!

所以,现在我们已经安装了 Saloon,我们需要创建一个新类。 在 Saloons 术语中,这些是「连接器」,连接器所做的一切就是创建一种以对象为中心的方式来表达 - 此 API 通过此类连接。 有一个方便的 artisan 命令允许您创建这些,因此运行以下 artisan 命令来创建 GitHub 连接器:

php artisan saloon:connector GitHub GitHubConnector
로그인 후 복사

该命令分为两部分,第一个参数是你正在创建的集成,第二个参数是要创建的连接器的名称。这意味着你可以为集成创建多个连接器 - 如果需要的话可以通过多种不同方式进行连接。

这将在 app/Http/Integrations/GitHub/GitHubConnector.php 下为你创建一个新类,让我们看一下,了解发生了什么。

我们看到的第一件事是我们的连接器扩展了「SaloonConnector」,这将使我们能够让我们的连接器在没有大量样板代码的情况下工作。然后我们继承了一个名为「AcceptsJson」的特征。现在,如果我们查看 Saloon 文档,我们知道这是一个插件。这基本上为我们的请求添加了一个标头,告诉第 3 方 API 我们想要接受 JSON 响应。接下来我们看到的是我们有一个方法来定义我们的连接器的基本 URL - 所以让我们添加我们的:

public function defineBaseUrl(): string
{
    return 'https://api.github.com';
}
로그인 후 복사

又好又干净,我们甚至可以更进一步,这样我们就可以处理应用程序中较少的松散字符串 - 所以让我们看看我们如何做到这一点。 在您的 config/services.php 文件中添加新的服务记录:

'github' => [
    'url' => env('GITHUB_API_URL', 'https://api.github.com'),
]
로그인 후 복사

这将允许我们在不同的环境中覆盖它 - 为我们提供更好和更可测试的解决方案。 在本地,我们甚至可以使用他们的 OpenAPI 规范模拟 GitHub API,并对其进行测试以确保其正常工作。 但是,本教程是关于 Saloon 的,所以我离题了……现在让我们重构我们的基本 URL 方法以使用配置:

public function defineBaseUrl(): string
{
    return (string) config('services.github.url');
}
로그인 후 복사

如你所见,我们现在从配置中获取新添加的记录 - 并将其转换为字符串以确保类型安全 - config()

무엇을 만들까요? 이 질문에 답변하게 되어 매우 기쁩니다! 리포지토리에 사용할 수 있는 워크플로 목록을 가져오기 위해 GitHub API와의 통합을 구축하겠습니다. 여러분이 나와 같이 명령줄에서 많은 시간을 보낸다면 이는 매우 유용할 수 있습니다. 애플리케이션을 개발하고, 변경 사항을 브랜치에 푸시하거나 PR을 생성하는 중입니다. 이는 다른 많은 작업 중 하나를 실행할 수 있는 워크플로를 거칩니다. 이 워크플로우의 상태를 아는 것은 때로는 다음에 수행할 작업에 큰 영향을 미칠 수 있습니다. 완벽하게 작동합니까? 작업 흐름이 실행되는 방식에 문제가 있습니까? 우리의 테스트나 정적 분석이 통과되었나요? 이 모든 것은 일반적으로 기다렸다가 GitHub의 저장소를 확인하여 상태를 확인합니다. 이 통합을 통해 장인 명령을 실행하고, 리포지토리에 사용 가능한 워크플로 목록을 가져오고, 실행할 새 워크플로를 트리거할 수 있습니다. 🎜🎜이제 Composer는 작업을 완료하고 완벽한 시작점인 Laravel 애플리케이션을 설치했어야 합니다. 다음으로 Saloon을 설치해야 합니다. 하지만 laravel 버전을 설치해야 하므로 터미널에서 다음 명령을 실행하세요. 🎜
public function defaultConfig(): array
{
    return [
        'timeout' => 30,
    ];
}
로그인 후 복사
로그인 후 복사
🎜이렇게 하면 더 쉬운 통합에 한 걸음 더 가까워집니다. 이 단계에서 질문이 있는 경우 Saloon에는 최소한 Laravel 8 및 PHP 8이 필요하므로 사용 중인 Laravel 및 PHP 버전을 확인하세요! 🎜🎜이제 Saloon이 설치되었으므로 새 클래스를 만들어야 합니다. Saloons 용어에서 이는 "커넥터"이며 커넥터가 수행하는 모든 작업은 이러한 연결을 통해 이 API를 표현하는 객체 중심 방식을 만드는 것입니다. 이를 생성할 수 있는 편리한 artisan 명령이 있으므로 다음 artisan 명령을 실행하여 GitHub 커넥터를 생성하십시오. 🎜
php artisan saloon:request GitHub ListRepositoryWorkflowsRequest
로그인 후 복사
로그인 후 복사
🎜 명령은 두 부분으로 구성되어 있으며 첫 번째 매개변수는 생성 중인 통합이고 두 번째 매개변수는 생성하려는 통합 커넥터의 이름입니다. 이는 통합을 위해 여러 커넥터를 생성하여 필요한 경우 다양한 방법으로 연결할 수 있음을 의미합니다. 🎜🎜이렇게 하면 app/Http/Integrations/GitHub/GitHubConnector.php 아래에 새 클래스가 생성됩니다. 무슨 일이 일어나고 있는지 살펴보겠습니다. 🎜🎜가장 먼저 볼 수 있는 것은 커넥터가 "SaloonConnector"를 확장한다는 것입니다. 이를 통해 많은 상용구 코드 없이도 커넥터가 작동하도록 할 수 있습니다. 그런 다음 "AcceptsJson"이라는 기능을 상속합니다. 이제 Saloon 문서를 보면 이것이 플러그인이라는 것을 알 수 있습니다. 이는 기본적으로 JSON 응답을 수락하기를 원한다는 것을 타사 API에 알리는 요청에 헤더를 추가합니다. 다음으로 볼 수 있는 것은 커넥터의 기본 URL을 정의하는 방법이 있다는 것입니다. 따라서 다음을 추가해 보겠습니다. 🎜
 class ListRepositoryWorkflowsRequest extends SaloonRequest
{
    protected ?string $connector = GitHubConnector::class;

    protected ?string $method = Saloon::GET;

    public function __construct(
        public string $owner,
        public string $repo,
    ) {}

    public function defineEndpoint(): string
    {
        return "/repos/{$this->owner}/{$this->repo}/actions/workflows";
    }
}
로그인 후 복사
로그인 후 복사
🎜 훌륭하고 깔끔합니다. 한 단계 더 나아가 애플리케이션 내에서 처리할 수 있습니다. 덜 느슨합니다. 문자열 - 그럼 어떻게 하는지 살펴보겠습니다. config/services.php 파일에 새 서비스 레코드를 추가하세요. 🎜
php artisan make:command GitHub/ListRepositoryWorkflows
로그인 후 복사
로그인 후 복사
🎜이렇게 하면 다양한 환경에서 이를 재정의할 수 있어 더 좋고 테스트 가능한 솔루션이 제공됩니다. 로컬에서는 OpenAPI 사양을 사용하여 GitHub API를 모의하고 테스트하여 제대로 작동하는지 확인할 수도 있습니다. 하지만 이 튜토리얼은 Saloon에 관한 것이므로 다른 이야기로 넘어갑니다... 이제 구성을 사용하도록 기본 URL 메서드를 리팩토링해 보겠습니다. 🎜
GITHUB_API_TOKEN=ghp_loads-of-letters-and-numbers-here
로그인 후 복사
로그인 후 복사
🎜 보시다시피 이제 구성에서 새로 추가된 레코드를 가져오고 다음으로 변환합니다. 유형 안전성을 보장하는 문자열 - config()는 여러 가지 다른 유형의 결과를 반환할 수 있습니다. 우리는 가능하다면 이에 대해 엄격해지기를 원합니다. 🎜

接下来我们有默认 header 和默认配置,无须担心默认 header 的内容,因为我们将在一段时间内自行处理身份验证。但配置部分是我们可以为集成定义 guzzle 选项的地方,因为 Saloon 在服务引擎下使用了 Guzzle。现在让我们设置超时并继续,我们需要花一些时间配置它:

public function defaultConfig(): array
{
    return [
        'timeout' => 30,
    ];
}
로그인 후 복사
로그인 후 복사

我们现在已经按照我们的需要配置了我们的连接器,如果我们有需要添加的配置,可以稍后再添加。下一步是开始考虑我们要发送的请求。如果我们查看 GitHub Actions API 的 API 文档,我们有很多选择,我们将从列出特定存储库的工作流开始:/repos/{owner}/{repo}/actions/workflows。运行以下 artisan 命令创建一个新请求:

php artisan saloon:request GitHub ListRepositoryWorkflowsRequest
로그인 후 복사
로그인 후 복사

同样,第一个参数是集成,第二个参数是我们要创建的请求的名称。我们需要确保为我们正在创建的请求命名集成,以便它存在于正确的位置,然后我们需要给它一个名称。我将我的命名为 ListRepositoryWorkflowsRequest,因为我喜欢描述性的命名方法 - 但是,你可以随意调整以适应你喜欢的命名方式。这将创建一个新文件供我们查看:app/Http/Integrations/GitHub/Requests/ListRepositoryWorkflowsRequest.php - 现在让我们看一下。

我们再次在这里扩展了一个库类,这次是预期的 SaloonRequest。这里会包含一个连接器属性和一个方法。如果需要,我们可以修改这个方法 - 但默认的 GET 是我们现在需要的。然后我们有一个定义端点的方法。重构你的请求类,使其类似于以下示例:

 class ListRepositoryWorkflowsRequest extends SaloonRequest
{
    protected ?string $connector = GitHubConnector::class;

    protected ?string $method = Saloon::GET;

    public function __construct(
        public string $owner,
        public string $repo,
    ) {}

    public function defineEndpoint(): string
    {
        return "/repos/{$this->owner}/{$this->repo}/actions/workflows";
    }
}
로그인 후 복사
로그인 후 복사

我们所做的是添加一个构造函数,它接受 repo 和 owner 作为参数,然后我们可以在端点定义方法中使用它们。我们还将连接器设置为我们之前创建的 GitHubConnector。所以我们有一个我们知道可以发送的请求,我们可以从集成中走一小步,转而考虑控制台命令。

如果你之前没有在 Laravel 中创建过控制台命令,请务必查看 文档。运行以下 artisan 命令来为此集成创建第一个命令:

php artisan make:command GitHub/ListRepositoryWorkflows
로그인 후 복사
로그인 후 복사

这将创建以下文件:app/Console/Commands/GitHub/ListRespositoryWorkflows.php。我们现在可以开始使用命令来发送请求并获取我们关心的数据。当谈到控制台命令时,我总是做的第一件事就是考虑签名。我希望如何调用它?它需要能够解释它正在做什么,同时具备一定的辨识度。我将会用 github:workflows 作为签名,因为这很好地解释了我想做的事情。我们还可以向控制台命令添加描述,以便在浏览可用命令时更好地解释目的:「通过存储库名称从 GitHub 获取工作流列表」。

最后,我们到了命令的 handle 方法,这部分是我们实际需要做的事情。在我们的例子中,我们将发送一个请求,获取一些数据并以某种方式显示这些数据。然而,在我们能够做到这一点之前,我们还没有完成一件事。那就是身份验证。

对于每一个 API 集成,身份验证都是关键方面之一——我们需要 API 不仅知道我们是谁,而且知道我们实际上被允许发出这个请求。如果你转到 你的 GitHub 设置 并点击进入开发人员设置和个人访问令牌,在此你可以生成自己的设置。我建议使用这种方法,而不是为此使用完整的 OAuth 应用程序。我们不需要 OAuth,我们只需要用户能够访问他们需要的内容。

获得访问令牌后,我们需要将其添加到我们的 .env 文件中,并确保我们可以通过配置提取它。

GITHUB_API_TOKEN=ghp_loads-of-letters-and-numbers-here
로그인 후 복사
로그인 후 복사

我们现在可以在 github 下的 config/services.php 中扩展我们的服务,添加这个令牌:

'github' => [
    'url' => env('GITHUB_API_URL', 'https://api.github.com'),
    'token' => env('GITHUB_API_TOKEN'),
]
로그인 후 복사

现在我们有了一个加载这个令牌的好方法,我们可以回到我们的控制台命令!我们需要修改我们的签名以允许我们接受所有者和存储库作为参数:

 class ListRepositoryWorkflows extends Command
{
    protected $signature = 'github:workflows
        {owner : The owner or organisation.}
        {repo : The repository we are looking at.}
    ';

    protected $description = 'Fetch a list of workflows from GitHub by the repository name.';

    public function handle(): int
    {
        return 0;
    }
}
로그인 후 복사

现在我们可以将注意力转移到 handle 方法上:

public function handle(): int
{
    $request = new ListRepositoryWorkflowsRequest(
        owner: $this->argument('owner'),
        repo: $this->argument('repo'),
    );

    return self::SUCCESS;
}
로그인 후 복사

在这里,我们开始通过将参数直接传递到请求本身来构建我们的请求,但是我们可能想要做的是创建一些局部变量来提供一些控制台反馈:

 public function handle(): int
{
    $owner = (string) $this->argument('owner');
    $repo = (string) $this->argument('repo');

    $request = new ListRepositoryWorkflowsRequest(
        owner: $owner,
        repo: $repo,
    );

    $this->info(
        string: "Fetching workflows for {$owner}/{$repo}",
    );

    return self::SUCCESS;
}
로그인 후 복사

所以我们有一些反馈给用户,这对于控制台命令来说总是很重要的。现在我们需要添加我们的身份验证令牌并实际发送请求:

 public function handle(): int
{
    $owner = (string) $this->argument('owner');
    $repo = (string) $this->argument('repo');

    $request = new ListRepositoryWorkflowsRequest(
        owner: $owner,
        repo: $repo,
    );

    $request->withTokenAuth(
        token: (string) config('services.github.token'),
    );

    $this->info(
        string: "Fetching workflows for {$owner}/{$repo}",
    );

    $response = $request->send();

    return self::SUCCESS;
}
로그인 후 복사

如果你修改上述内容并在 $response->json() 上执行 dd(),然后运行命令:

php artisan github:workflows laravel laravel
로그인 후 복사
로그인 후 복사

这将获得 laravel/laravel repo 的工作流列表。我们的命令将允许你使用任何公共存储库,如果你希望它更具体,你可以建立一个要检查的存储库选项列表,而不是接受参数 —— 但这部分取决于你个人。对于本教程,我将重点关注更广泛更开放的用例。

现在,我们从 GitHub API 得到的响应非常好且信息丰富,但它需要转换才能显示,如果我们孤立地查看它,则没有上下文。相反,我们将在我们的请求中添加另一个插件,这将允许我们将响应转换为 DTO(域传输对象),这是处理此问题的好方法。它将允许我们放松我们习惯于从 API 获取的灵活数组,并获得更具上下文感知的东西。让我们为工作流创建一个 DTO,创建一个新文件:app/Http/Integrations/GitHub/DataObjects/Workflow.php 并向其中添加以下代码:

 class Workflow
{
    public function __construct(
        public int $id,
        public string $name,
        public string $state,
    ) {}

    public static function fromSaloon(array $workflow): static
    {
        return new static(
            id: intval(data_get($workflow, 'id')),
            name: strval(data_get($workflow, 'name')),
            state: strval(data_get($workflow, 'state')),
        );
    }

    public function toArray(): array
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'state' => $this->state,
        ];
    }
}
로그인 후 복사

我们有一个构造函数,其中包含我们要显示的工作流的重要部分,一个 fromSaloon 方法,它将一个数组从一个 saloon 转换为一个新的 DTO,以及一个用于将 DTO 显示回数组的数组方法当我们需要它时。在我们的ListRepositoryWorkflowsRequest 中,我们需要继承一个新特征并添加一个新方法:

 class ListRepositoryWorkflowsRequest extends SaloonRequest
{
    use CastsToDto;

    protected ?string $connector = GitHubConnector::class;

    protected ?string $method = Saloon::GET;

    public function __construct(
        public string $owner,
        public string $repo,
    ) {}

    public function defineEndpoint(): string
    {
        return "/repos/{$this->owner}/{$this->repo}/actions/workflows";
    }

    protected function castToDto(SaloonResponse $response): Collection
    {
        return (new Collection(
            items: $response->json('workflows'),
        ))->map(function ($workflow): Workflow {
            return Workflow::fromSaloon(
                workflow: $workflow,
            );
        });
    }
}
로그인 후 복사

我们继承了 CastsToDto trait,它允许这个请求在响应中调用 dto 方法,然后我们添加一个 castToDto 方法,我们可以控制它的转换方式。我们希望它返回一个新的集合,因为有多个工作流,使用响应正文的工作流部分。然后我们映射集合中的每个项目 - 并将其转换为 DTO。现在我们既可以这样做,也可以使用 DTO 构建集合:

protected function castToDto(SaloonResponse $response): Collection
{
    return new Collection(
        items: $response->collect('workflows')->map(fn ($workflow) =>
            Workflow::fromSaloon(
                workflow: $workflow
            ),
        )
    );
}
로그인 후 복사

你可以在这里选择最适合你的方式。我个人更喜欢第一种方法,因为我喜欢逐步了解逻辑,但是这两种方法都没有错——选择权在你。现在回到命令,我们现在需要考虑我们希望如何显示这些信息:

public function handle(): int
{
    $owner = (string) $this->argument('owner');
    $repo = (string) $this->argument('repo');

    $request = new ListRepositoryWorkflowsRequest(
        owner: $owner,
        repo: $repo,
    );

    $request->withTokenAuth(
        token: (string) config('services.github.token'),
    );

    $this->info(
        string: "Fetching workflows for {$owner}/{$repo}",
    );

    $response = $request->send();

    if ($response->failed()) {
        throw $response->toException();
    }

    $this->table(
        headers: ['ID', 'Name', 'State'],
        rows: $response
            ->dto()
            ->map(fn (Workflow $workflow) =>
                  $workflow->toArray()
            )->toArray(),
    );

    return self::SUCCESS;
}
로그인 후 복사

因此,我们创建一个带有标题的表,然后对于我们想要响应 DTO 的行,我们将映射返回的集合,将每个 DTO 转换回要显示的数组。从响应数组转换为 DTO 再转换回数组,这似乎违反直觉,但这会强制执行类型,以便 ID、名称和状态在预期时始终存在,并且不会给出任何有趣的结果.它允许正常响应数组可能没有它的一致性,如果我们愿意,我们可以将它转换为一个值对象,我们可以在其中附加行为。如果我们现在运行我们的命令,我们现在应该会看到一个漂亮的表格输出,它比几行字符串更容易阅读:

php artisan github:workflows laravel laravel
로그인 후 복사
로그인 후 복사
Fetching workflows for laravel/laravel
+----------+------------------+--------+
| ID       | Name             | State  |
+----------+------------------+--------+
| 12345678 | pull requests    | active |
| 87654321 | Tests            | active |
| 18273645 | update changelog | active |
+----------+------------------+--------+
로그인 후 복사

最后,仅仅列出这些工作流程是很棒的——但让我们以科学的名义更进一步。假设你正在针对你的一个存储库运行此命令,并且想手动运行更新更改日志?或者,也许你希望使用你的实时生产服务器或你可能想到的任何事件在 cron 上触发它?我们可以将变更日志设置为每天午夜运行一次,这样我们就可以在变更日志中获得每日回顾或任何我们可能想要的内容。让我们创建另一个控制台命令来创建一个新的工作流调度事件:

php artisan saloon:request GitHub CreateWorkflowDispatchEventRequest
로그인 후 복사

在这个新文件 app/Http/Integrations/GitHub/Requests/CreateWorkflowDispatchEventRequest.php 中添加以下代码,以便我们浏览它:

class CreateWorkflowDispatchEventRequest extends SaloonRequest
{
    use HasJsonBody;

    protected ?string $connector = GitHubConnector::class;

    public function defaultData(): array
    {
        return [
            'ref' => 'main',
        ];
    }

    protected ?string $method = Saloon::POST;

    public function __construct(
        public string $owner,
        public string $repo,
        public string $workflow,
    ) {}

    public function defineEndpoint(): string
    {
        return "/repos/{$this->owner}/{$this->repo}/actions/workflows/{$this->workflow}/dispatches";
    }
}
로그인 후 복사

通过设置连接器,并继承 HasJsonBody 特征以允许我们发送数据。该方法已设置为 POST 请求,因为我们要发送数据。然后我们有一个构造函数,它接受构建端点的 URL 部分。

最后,我们在 defaultData 中有圆顶默认数据,我们可以使用它来设置此发布请求的默认值。与 repo 一样,我们可以在此处传递提交哈希或分支名称 - 所以我将默认设置为 main,因为这就是我通常所说的生产分支。

我们现在可以触发这个端点来调度一个新的工作流事件,所以让我们创建一个控制台命令来控制它,这样我们就可以从我们的 CLI 运行它:

php artisan make:command GitHub/CreateWorkflowDispatchEvent
로그인 후 복사

现在让我们编写具体的逻辑,我们可以了解正在发生的事情:

class CreateWorkflowDispatchEvent extends Command
{
    protected $signature = 'github:dispatch
        {owner : The owner or organisation.}
        {repo : The repository we are looking at.}
        {workflow : The ID of the workflow we want to dispatch.}
        {branch? : Optional: The branch name to run the workflow against.}
    ';

    protected $description = 'Create a new workflow dispatch event for a repository.';

    public function handle(): int
    {
        $owner = (string) $this->argument('owner');
        $repo = (string) $this->argument('repo');
        $workflow = (string) $this->argument('workflow');

        $request = new CreateWorkflowDispatchEventRequest(
            owner: $owner,
            repo: $repo,
            workflow: $workflow,
        );

        $request->withTokenAuth(
            token: (string) config('services.github.token'),
        );

        if ($this->hasArgument('branch')) {
            $request->setData(
                data: ['ref' => $this->argument('branch')],
            );
        }

        $this->info(
            string: "Requesting a new workflow dispatch for {$owner}/{$repo} using workflow: {$workflow}",
        );

        $response = $request->send();

        if ($response->failed()) {
            throw $response->toException();
        }

        $this->info(
            string: 'Request was accepted by GitHub',
        );

        return self::SUCCESS;
    }
}
로그인 후 복사

就像在我们有签名和描述之前一样,这次我们的签名有一个可选的分支,以防我们想要覆盖请求中的默认值。所以在我们的处理方法中,我们可以简单地检查输入是否有参数 branch,如果有,我们可以解析它并为请求设置数据。然后我们向 CLI 提供一些反馈,让用户知道我们在做什么 - 并发送请求。如果此时一切顺利,我们可以简单地输出一条消息,通知用户 GitHub 接受了请求。但是,如果出现问题,我们希望抛出特定的异常,至少在开发过程中是这样。

最后一个请求的主要警告是,我们的工作流程设置为通过在工作流程中添加一个新的 on 项目来由 webhook 触发:

on: workflow_dispatch
로그인 후 복사

这就对了!我们使用 Saloon 和 Laravel 不仅列出存储库工作流程,而且如果配置正确,我们还可以触发它们按需运行:muscle:

正如我在本教程开始时所说的,有很多方法可以实现 API 集成,但有一点是肯定的 - 使用 Saloon 使它变得干净和简单,而且使用起来也非常愉快。

原文地址:https://laravel-news.com/api-integrations-using-saloon-in-laravel

译文地址:https://learnku.com/laravel/t/69007

【相关推荐:laravel视频教程

위 내용은 Laravel에서 API 통합을 위해 Saloon을 사용하는 방법에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Bangla 부분 모델 검색의 Laravel Eloquent Orm) Bangla 부분 모델 검색의 Laravel Eloquent Orm) Apr 08, 2025 pm 02:06 PM

Laraveleloquent 모델 검색 : 데이터베이스 데이터를 쉽게 얻을 수 있습니다. 이 기사는 데이터베이스에서 데이터를 효율적으로 얻는 데 도움이되는 다양한 웅변 모델 검색 기술을 자세히 소개합니다. 1. 모든 기록을 얻으십시오. 모든 () 메소드를 사용하여 데이터베이스 테이블에서 모든 레코드를 가져옵니다. 이것은 컬렉션을 반환합니다. Foreach 루프 또는 기타 수집 방법을 사용하여 데이터에 액세스 할 수 있습니다 : Foreach ($ postas $ post) {echo $ post->

PHP의 미래 : 적응 및 혁신 PHP의 미래 : 적응 및 혁신 Apr 11, 2025 am 12:01 AM

PHP의 미래는 새로운 기술 트렌드에 적응하고 혁신적인 기능을 도입함으로써 달성 될 것입니다. 1) 클라우드 컴퓨팅, 컨테이너화 및 마이크로 서비스 아키텍처에 적응, Docker 및 Kubernetes 지원; 2) 성능 및 데이터 처리 효율을 향상시키기 위해 JIT 컴파일러 및 열거 유형을 도입합니다. 3) 지속적으로 성능을 최적화하고 모범 사례를 홍보합니다.

PHP vs. Python : 차이점 이해 PHP vs. Python : 차이점 이해 Apr 11, 2025 am 12:15 AM

PHP와 Python은 각각 고유 한 장점이 있으며 선택은 프로젝트 요구 사항을 기반으로해야합니다. 1.PHP는 간단한 구문과 높은 실행 효율로 웹 개발에 적합합니다. 2. Python은 간결한 구문 및 풍부한 라이브러리를 갖춘 데이터 과학 및 기계 학습에 적합합니다.

Laravel 's geospatial : 대화식지도의 최적화 및 많은 양의 데이터 Laravel 's geospatial : 대화식지도의 최적화 및 많은 양의 데이터 Apr 08, 2025 pm 12:24 PM

7 백만 레코드를 효율적으로 처리하고 지리 공간 기술로 대화식지도를 만듭니다. 이 기사는 Laravel과 MySQL을 사용하여 7 백만 개 이상의 레코드를 효율적으로 처리하고 대화식지도 시각화로 변환하는 방법을 살펴 봅니다. 초기 챌린지 프로젝트 요구 사항 : MySQL 데이터베이스에서 7 백만 레코드를 사용하여 귀중한 통찰력을 추출합니다. 많은 사람들이 먼저 프로그래밍 언어를 고려하지만 데이터베이스 자체를 무시합니다. 요구 사항을 충족시킬 수 있습니까? 데이터 마이그레이션 또는 구조 조정이 필요합니까? MySQL이 큰 데이터로드를 견딜 수 있습니까? 예비 분석 : 주요 필터 및 속성을 식별해야합니다. 분석 후, 몇 가지 속성만이 솔루션과 관련이 있음이 밝혀졌습니다. 필터의 타당성을 확인하고 검색을 최적화하기위한 제한 사항을 설정했습니다. 도시를 기반으로 한지도 검색

PHP 및 Python : 두 가지 인기있는 프로그래밍 언어를 비교합니다 PHP 및 Python : 두 가지 인기있는 프로그래밍 언어를 비교합니다 Apr 14, 2025 am 12:13 AM

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP의 현재 상태 : 웹 개발 동향을 살펴보십시오 PHP의 현재 상태 : 웹 개발 동향을 살펴보십시오 Apr 13, 2025 am 12:20 AM

PHP는 현대 웹 개발, 특히 컨텐츠 관리 및 전자 상거래 플랫폼에서 중요합니다. 1) PHP는 Laravel 및 Symfony와 같은 풍부한 생태계와 강력한 프레임 워크 지원을 가지고 있습니다. 2) Opcache 및 Nginx를 통해 성능 최적화를 달성 할 수 있습니다. 3) PHP8.0은 성능을 향상시키기 위해 JIT 컴파일러를 소개합니다. 4) 클라우드 네이티브 애플리케이션은 Docker 및 Kubernetes를 통해 배포되어 유연성과 확장 성을 향상시킵니다.

Laravel 및 백엔드 : 파워링 웹 응용 프로그램 논리 Laravel 및 백엔드 : 파워링 웹 응용 프로그램 논리 Apr 11, 2025 am 11:29 AM

Laravel은 백엔드 논리에서 어떻게 중요한 역할을합니까? 라우팅 시스템, eloquentorm, 인증 및 승인, 이벤트 및 청취자, 성능 최적화를 통해 백엔드 개발을 단순화하고 향상시킵니다. 1. 라우팅 시스템은 URL 구조의 정의 및 요청 처리 로직을 정의 할 수 있습니다. 2. eloquentorm은 데이터베이스 상호 작용을 단순화합니다. 3. 인증 및 인증 시스템은 사용자 관리에 편리합니다. 4. 이벤트와 리스너는 느슨하게 결합 된 코드 구조를 구현합니다. 5. 성능 최적화는 캐싱 및 대기열을 통한 응용 프로그램 효율성을 향상시킵니다.

PHP : 많은 웹 사이트의 기초 PHP : 많은 웹 사이트의 기초 Apr 13, 2025 am 12:07 AM

PHP가 많은 웹 사이트에서 선호되는 기술 스택 인 이유에는 사용 편의성, 강력한 커뮤니티 지원 및 광범위한 사용이 포함됩니다. 1) 배우고 사용하기 쉽고 초보자에게 적합합니다. 2) 거대한 개발자 커뮤니티와 풍부한 자원이 있습니다. 3) WordPress, Drupal 및 기타 플랫폼에서 널리 사용됩니다. 4) 웹 서버와 밀접하게 통합하여 개발 배포를 단순화합니다.

See all articles