telkins/laravel-inquiry

一个(有些主观的)Laravel 扩展包,旨在让提问和获取答案变得更加容易和统一。

v0.8.0 2022-06-18 12:24 UTC

This package is auto-updated.

Last update: 2024-08-30 01:32:40 UTC


README

Latest Version on Packagist GitHub Tests Action Status Quality Score Total Downloads

有时您可能需要查询应用程序或代码的不同部分。您可能需要了解是否已执行某些操作,或者您可能需要构建一组键值对。有时,这些信息可以通过模型属性或数据库查询轻松获取。然而,有时获取这些信息并不像您想象的那样整洁。

本扩展包的目标是提供一种(有些主观的)查询方式。您可以创建 Inquiry 类。当您想要进行特定查询时,您可以通过以下方式“询问”该类:$myInquiry = MyInquiry::ask();。您将获得一个“详细信息”对象,您可以根据自己的需求定义它,以便提供查询的详细信息。然后,您可以通过在详细信息对象上调用 answer() 方法来请求答案。以下是一个简单的示例

$isAllowed = CanChildPlayPS4::ask()
    ->child($junior)
    ->onDateTime(now())
    ->answer();

安装

您可以通过 composer 安装此包

composer require telkins/laravel-inquiry

用法

目前,必须手动创建 InquiryDetails 类。

创建查询

要创建查询类,只需像这样扩展 Inquiry

use Telkins\LaravelInquiry\Inquiry;
use Telkins\LaravelInquiry\Contracts\Details;

class CanChildPlayPS4 extends Inquiry
{
    public function provideAnswer(Details $details)
    {
        if (! $details->child->areChoresDone()) {
            return false;
        }

        if ($details->child->isGrounded()) {
            return false;
        }

        if (! $details->child->isDoneWithHomework()) {
            return false;
        }

        return $this->isItAGoodTimeToPlay($details->dateTime);
    }

    // supporting methods, if needed...
}

创建查询详细信息

要创建查询详细信息类,只需像这样扩展 Details

use App\Child;
use Carbon\CarbonImmutable;
use Telkins\LaravelInquiry\Details;

class CanChildPlayPS4Details extends Details
{
    public $child;
    public $dateTime;

    public function child(Child $child): self
    {
        $this->child = $child;

        return $this;
    }

    public function onDateTime(CarbonImmutable $dateTime): self
    {
        $this->dateTime = $dateTime;

        return $this;
    }
}

提问并获取答案

一旦构建了查询和查询详细信息类,就可以开始使用它们了。提问并获取答案有三个主要步骤

  1. 在您的 Inquiry 类上调用静态 ask() 方法。这将返回查询的详细信息对象。
  2. 使用详细信息对象,提供查询的详细信息。
  3. 最后,通过在详细信息对象上调用 answer() 方法来请求答案。

以下是一个同时提问并获取答案的示例

$isAllowed = CanChildPlayPS4::ask()
    ->child($junior)
    ->onDateTime(now())
    ->answer();

以下是一个使用详细信息对象提供不同详细信息以获取不同场景下不同答案的示例

$inquiryDetails = CanChildPlayPS4::ask();

$canGregPlay = $inquiryDetails
    ->child($greg)
    ->onDateTime(now())
    ->answer();

$canPeterPlay = $inquiryDetails
    ->child($peter)
    ->answer();

约定

默认情况下,每个 Inquiry 类都将查找与 Details 后缀具有相同完全限定名称(FQCN)的“详细信息”类。所以,对于我们的示例 CanChildPlayPS4 类,它将查找 CanChildPlayPS4Details

要覆盖此行为,您可以在您的 Inquiry 类中指定“详细信息”类名称,如下所示

use Telkins\LaravelInquiry\Inquiry;
use Telkins\LaravelInquiry\Contracts\Details;
use My\Custom\Namespace\UnconventionalNameDetails;

class CanChildPlayPS4 extends Inquiry
{
    protected static $detailsClass = UnconventionalNameDetails::class; // override default "details" class

    public function provideAnswer(Details $details)
    {
        // ...
    }

    // ...
}

测试

composer test

变更日志

请参阅 CHANGELOG 了解最近更改的详细信息。

贡献

请参阅 CONTRIBUTING 了解详细信息。

安全性

如果您发现任何与安全性相关的问题,请使用问题跟踪器。

致谢

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件