本文介绍如何改造 laravel nova 中的 `definition()` 方法,使其支持传入不同数值(如 2 或 4)作为参数,动态决定字段渲染数量及依赖条件,从而实现基于复选框状态(`is_active`)灵活切换字段显示次数。
在使用 Epartment/NovaDependencyContainer 构建动态表单时,常需根据某个布尔型字段(如 is_active 复选框)的值,控制另一组字段的重复渲染次数(例如:勾选时显示 4 组字段,未勾选时仅显示 2 组)。原始写法中硬编码了 2 和 4,并试图用两个 $fields 赋值覆盖同一变量,这不仅逻辑冲突、无法同时生效,还违背了依赖容器“单次定义、条件驱动”的设计原则。
正确做法是将重复数抽象为方法参数,并据此智能推导 dependsOn 的触发值。以下是重构后的专业写法:
public function definition(int $fieldCount = 2): array
{
// 根据 fieldCount 自动确定 dependsOn 的 targetValue:
// 当 fieldCount === 4 → 期望 is_active === 1;否则为 0
$targetValue = ($fieldCount === 4) ? 1 : 0;
$fields = NovaDependencyContainer::make([
$this->listDefinition('Field', $this->getFields(), $fieldCount)
])
->dependsOn('is_active', $targetValue)
->meta()['fields'][0];
return array_merge(
[
// 其他基础字段,如 ID、Name 等
Text::make('Name'),
Boolean::make('Is Active', 'is_active'),
],
$fields
);
}
✅ 关键改进点说明: