⚠️ 本站内容为服务 Laravel 中文社区所建立,相关文档均由 ChatGPT 翻译整理,仅供参考。由于自动翻译存在一定局限,内容可能存在误差或遗漏,敬请谅解。如有建议或勘误,欢迎提交反馈。

监听器

建议编辑

Listener 布局是一种特殊类型的布局,用于响应用户输入更新屏幕上显示的数据。当您希望创建动态和交互式屏幕,并根据用户操作改变其外观和行为时,这非常有用。

在此示例中,我们有一个屏幕,其中包含两个数字输入字段,这些数字需要相互减去。我们可以通过使用监听器布局来实现这一点。

要创建监听器布局,您需要在终端中运行以下 artisan 命令:

php artisan orchid:listener SubtractListener

运行上述命令将会在 app/Orchid/Layouts 目录中创建一个名为 SubtractListener 的新类。创建后,您可以在 layouts 方法中添加所需的字段,如下所示:

namespace App\Orchid\Layouts;

use Illuminate\Http\Request;
use Orchid\Screen\Fields\Input;
use Orchid\Screen\Layouts\Listener;
use Orchid\Screen\Repository;
use Orchid\Support\Facades\Layout;

class SubtractListener extends Listener
{
    /**
     * 需要监听其值的字段名称列表。
     *
     * @var string[]
     */
    protected $targets = [];

    /**
     * @return Layout[]
     */
    protected function layouts(): array
    {
        return [
            Layout::rows([
                Input::make('minuend')
                    ->title('第一个参数')
                    ->type('number'),

                Input::make('subtrahend')
                    ->title('第二个参数')
                    ->type('number'),
            ]),
        ];
    }
    
    /**
     * @param \Orchid\Screen\Repository $repository
     * @param \Illuminate\Http\Request  $request
     *
     * @return \Orchid\Screen\Repository
     */
    public function handle(Repository $repository, Request $request): Repository
    {
        return $repository;
    }
}

在这里,targets 属性包含需要在更改时执行操作的字段名称。在我们的示例中,名称为 minuendsubtrahend 的字段被视为目标:

/**
 * 需要监听其值的字段名称列表。
 *
 * @var string[]
 */
protected $targets = [
    'minuend',
    'subtrahend',
];

注意。多选字段如 <select name="users[]"> 需要通过在目标值后加上一个点来表示它们是一个数组,例如 "users."

现在是 handle 方法,它负责处理目标字段。该方法会在目标字段的值发生变化时自动调用。它接受两个参数 – $repository 代表屏幕上所有字段的当前状态,而 $request 代表屏幕的新状态。

namespace App\Orchid\Layouts;

use Illuminate\Http\Request;
use Orchid\Screen\Fields\Input;
use Orchid\Screen\Layouts\Listener;
use Orchid\Screen\Repository;
use Orchid\Support\Facades\Layout;

class SubtractListener extends Listener
{
    /**
     * 需要监听其值的字段名称列表。
     *
     * @var string[]
     */
    protected $targets = [
        'minuend',
        'subtrahend',
    ];

    /**
     * @return Layout[]
     */
    protected function layouts(): iterable
    {
        return [
            Layout::rows([
                Input::make('minuend')
                    ->title('第一个参数')
                    ->type('number'),

                Input::make('subtrahend')
                    ->title('第二个参数')
                    ->type('number'),

                Input::make('result')
                    ->readonly()
                    ->canSee($this->query->has('result')),
            ]),
        ];
    }

    /**
     * @param \Orchid\Screen\Repository $repository
     * @param \Illuminate\Http\Request  $request
     *
     * @return \Orchid\Screen\Repository
     */
    public function handle(Repository $repository, Request $request): Repository
    {
        $minuend = $request->input('minuend');
        $subtrahend = $request->input('subtrahend');

        return $repository
            ->set('minuend', $minuend)
            ->set('subtrahend', $subtrahend)
            ->set('result', $minuend - $subtrahend);
    }
}

以上代码展示了 SubtractListener 类的更新版本。为了处理目标字段中的值,我们解构了 $request 对象,将字段 minuendsubtrahend 中的值赋给同名变量。然后,我们使用这些值以及两个值相减的结果更新 $repository 对象,结果反映在 result 字段中。

我们的朋友