Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
聊聊Laravel中怎么用Saloon进行API集成_创想鸟

聊聊Laravel中怎么用Saloon进行API集成

laravel中怎么用saloon进行api集成?下面本篇文章给大家介绍一下在laravel中使用saloon进行api集成的方法,希望对大家有所帮助!

聊聊Laravel中怎么用Saloon进行API集成

我们都去过那里,我们想与 Laravel 中的第三方 API 集成,我们问自己「我应该怎么做?」。 谈到 API 集成,我并不陌生,但每次我都想知道什么是最好的方法。 Sam Carré 于 2022 年初构建了一个 package,名为 Saloon,这可以使我们的 API 集成令人惊叹。 然而,这篇文章将会非常不同,这将是一个关于如何使用它从头开始构建集成的演练。

像所有伟大的事情一样,它以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() 可能会返回多种不同类型的结果。如果可以的话,我们希望对此进行严格处理。

接下来我们有默认 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 中扩展我们的服务,添加这个令牌:

集简云 集简云

软件集成平台,快速建立企业自动化与智能化

集简云 22 查看详情 集简云

'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中怎么用Saloon进行API集成的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/340562.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
马斯克:特斯拉股东投票结果可能“影响世界的未来”
上一篇 2025年11月5日 18:03:43
如何解决Mezzio中常见辅助功能的需求?使用Mezzio-helpers库可以!
下一篇 2025年11月5日 18:03:47

相关推荐

  • WordPress插件定制:使用Filter Hook修改邮件通知接收者

    本教程将指导您如何在WordPress中利用Filter Hook定制插件行为,特别是修改第三方插件的邮件通知接收者。我们将详细讲解如何识别目标Filter、理解其参数,并正确编写回调函数来拦截或修改数据,以实现自定义的邮件发送逻辑,避免因参数不匹配导致的错误。 WordPress Hook机制概览…

    2026年9月21日
    000
  • 谷歌浏览器官方在线访问 最新版Chrome官网登录

    谷歌浏览器官方在线访问入口是https://www.google.cn/chrome/,提供简洁界面、跨设备同步、高效内核、安全防护和丰富扩展生态。 谷歌浏览器官方在线访问入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来最新版Chrome官网登录地址,想要获取纯净浏览体验的网友一起随小…

    2026年9月21日
    100
  • 使用Laravel构建RESTful API:实现现代化的后端开发

    使用Laravel构建RESTful API:实现现代化的后端开发 引言:在现代的Web开发中,构建RESTful API已经成为了一种主流的方式。RESTful API提供了一种灵活、可扩展的方式,用于与前端应用、移动应用或其他第三方服务进行交互。 Laravel是一款优秀的PHP框架,不仅提供了…

    2026年9月21日
    000
  • Swoole如何实现一个UDP服务器

    答案:使用Swoole可轻松创建高性能UDP服务器。通过new SwooleServer()设置UDP套接字,监听Packet事件接收数据,利用sendto()回复客户端;结合set()配置worker_num等参数优化性能,配合PHP UDP客户端测试通信,适用于高并发、低延迟场景。 使用Swoo…

    2026年9月21日
    000
  • PHP简易路由框架构建:从URL解析到动态控制器加载的实践指南

    本文旨在指导读者构建一个基础的PHP路由系统,实现URL路径到控制器方法的高效映射。内容涵盖URL解析、控制器动态加载、方法调用以及关键的错误处理机制,特别强调如何避免常见的“未定义变量”错误和文件包含路径问题,确保路由系统稳定且易于维护。 一、路由系统核心原理 构建一个简单的php路由系统,其核心…

    2026年9月21日
    100
  • Laravel中的表单构建和验证:简化用户输入和数据处理

    Laravel中的表单构建和验证:简化用户输入和数据处理 在Web应用程序开发中,表单是用户与应用程序进行交互的重要方式之一。Laravel作为一种流行的PHP框架,提供了许多便捷的工具和功能来简化表单的构建和验证过程。本文将介绍如何使用Laravel来简化用户输入和数据处理过程。 一、表单构建 L…

    2026年9月21日
    000
  • php switch语句怎么用_php中switch条件判断语句的用法示例

    答案:PHP中switch语句用于多条件判断,语法为switch(表达式){case值:代码;break;},通过松散比较匹配case值,执行对应代码块,遇到break跳出避免穿透,default处理无匹配情况。示例根据$day输出星期几,注意事项包括case值不可为表达式、需注意类型松散比较、省略…

    2026年9月21日
    100
  • Laravel应用的安全审计(Security Audit)方法

    进行安全审计对laravel应用至关重要,因为它能发现并修复安全漏洞,提升整体安全性和用户信任度。具体方法包括:1. 代码审查,确保无未过滤输入和弱密码;2. 配置文件安全性,保护敏感信息;3. 依赖管理,更新第三方包;4. 用户认证和授权,防止未授权访问;5. 日志和监控,检测异常行为。 在讨论L…

    2026年9月21日
    100
  • Laravel 8 登录后重定向到仪表盘的全面指南

    本文深入探讨了 Laravel 8 中用户登录后重定向到仪表盘的多种策略。我们将详细解析默认的重定向机制,包括 LoginController 和 RedirectIfAuthenticated 中间件,并重点介绍如何通过自定义登录逻辑实现精确的重定向控制,同时提供示例代码和常见问题排查建议,确保用…

    2026年9月21日
    000
  • 小可AI小程序入口链接_小可AI小程序官方地址

    小可AI小程序官方入口为https://xcx.xiaokeai.com.cn,用户可在社交平台搜索使用;平台支持多轮对话、文本生成、图像理解及语音转文字功能,界面简洁、响应迅速,具备历史记录查看与持续优化的智能算法。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepS…

    2026年9月21日
    000
  • Bing搜索主页官方地址_Bing搜索官方网站登录网址

    Bing搜索主页官方地址是https://www.bing.com/,页面布局简洁,顶部为搜索框,下方展示个性化信息模块,并每日更新全球高清背景图片。 Bing搜索主页官方地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来Bing搜索官方网站登录网址,感兴趣的网友一起随小编来瞧瞧吧! h…

    2026年9月21日
    000
  • Bing搜索最新官方网址入口 Bing搜索在线使用官网主页直达

    Bing搜索最新官方网址入口是https://www.bing.com,该网站提供每日更新的高清背景图片、简洁的页面布局、深色模式切换及个性化主页定制等视觉体验功能。 Bing搜索最新官方网址入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来Bing搜索在线使用官网主页直达,感兴趣的网友…

    2026年9月21日
    100
  • poki游戏在线网站 poki热门小游戏在线畅玩

    Poki热门小游戏包括《地铁跑酷》《愤怒的小鸟经典版》《Stick先生史诗般的生存》等,涵盖动作、体育、益智等多种类型,支持网页端免下载即玩,适配多设备,无需注册即可畅玩,定期更新并设有实时热门榜单,适合各年龄段玩家在线娱乐。 Poki游戏在线网站热门小游戏有哪些?这是不少网友都关注的,接下来由PH…

    2026年9月21日
    100
  • 如何在Laravel中配置数据库连接?

    在laravel中配置数据库连接需要以下步骤:1. 编辑.env文件,设置db_connection、db_host、db_port、db_database、db_username、db_password。2. 确保config/database.php文件正确引用.env文件中的配置。3. 利用环…

    2026年9月21日
    000
  • mysql如何设置自动重连

    答案:通过连接配置、连接池和应用层逻辑实现MySQL自动重连。启用MYSQL_OPT_RECONNECT选项(旧版本),推荐使用连接池如PooledDB、HikariCP并配置ping机制,应用层捕获连接异常后重试,结合指数退避策略提升稳定性。 MySQL 客户端或应用程序在连接断开后无法自动恢复,…

    2026年9月21日
    100
  • 猎豹浏览器官方网址链接入口 猎豹浏览器平台直达访问官方主页

    猎豹浏览器官方网址是http://m.liebao.cn/?f=www,该网站提供极速浏览体验、个性化界面设置和实用功能整合,如双渲染引擎、安全防护、主题皮肤、广告过滤等。 猎豹浏览器官方网址链接入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来猎豹浏览器平台直达访问官方主页,感兴趣的网…

    2026年9月21日
    200
  • Laravel与Vue.js/React前端框架集成

    laravel可以与vue.js或react集成。1) 使用命令“php artisan preset vue”或“php artisan preset react”设置开发环境。2) 在laravel视图中引入编译后的javascript文件。3) 通过laravel的api路由和前端框架的htt…

    2026年9月21日
    100
  • Grok官方主页登录入口_Grok最新版官方网站地址

    Grok官方主页登录入口是grok.com,用户需通过X账号登录,该网站支持电脑和手机浏览器访问,界面简洁,可进行多轮对话,并与X平台深度关联,提供免费及高级订阅服务。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Grok官方主页登录入口…

    2026年9月21日
    100
  • Laravel中的服务容器(Service Container)是什么?

    laravel中的服务容器是框架的核心组件,充当服务定位器和依赖注入容器。1)它管理类及其依赖,简化依赖管理,提升代码可测试性和可维护性。2)服务容器是应用架构的基石,帮助拆分复杂业务逻辑成独立服务,提高代码灵活性和可扩展性。3)基本用法包括绑定和解析服务,如app()->bind(&#821…

    2026年9月21日
    100
  • 如何为VSCode配置一个高效的PHP开发环境?

    搭建高效PHP开发环境需配置VSCode扩展与工具链:①安装PHP Intelephense实现智能补全;②配置Xdebug实现断点调试;③集成PHP CS Fixer或Prettier实现保存时自动格式化;④利用GitLens和集成终端提升协作与操作效率,一次性配置可长期提升编码质量与开发速度。 …

    2026年9月21日
    100

发表回复

登录后才能评论
关注微信