1. 首页
  2. Laravel

Laravel Nova中的群多布尔属性

Laravel Nova带来了一个令人惊奇的领域列表。默认情况下,这些字段非常聪明,几乎适用于所有情况。但是,如果用户界面符合您的需要,但字段处理数据的方式不同呢。是否强制创建自定义字段?好吧,也许不是。
自定义字段
Laravel Nova的字段有很多方法可以让您自定义它们的行为。正如您在文档中看到的,您可以通过附加一个fillUsing()回调来定制相应模型的水合方式。您可以通过附加一个resolveUsing()回调自定义字段的解析方式。因此,让我们使用这些函数,并创建我们自己的\”自定义\”字段。将多个布尔值分组为BooleanGroup
假设您有一个Message模型,它表示可以在多个范围内显示的消息,如:website、app和rss。您希望按作用域轻松查询这些消息,因此添加了3个布尔字段:scope_website、scope_app和scope_rss。
是的,您可以创建类别并创建透视表;但是您只有这些作用域,然后您会想起这是一个示例。
1fillUsing(…) 5function (NovaRequest $request, Message $model, string $attribute, string $requestAttribute) { 6// Make sure the `scopes` value exists on the request. 7if (!$request->exists($requestAttribute)) { 8return; 9}10// Decode the values because it is send as a JSON blob.12// Hydrate the model.13foreach ($values as>15}16}
fillUsing()的回调函数接收4个参数:
– NovaReqeust $request具有POST值的请求对象
– Message $model我们要使用的模型在模型上属性的名称(在我们的示例中不使用此名称)
– string $requestAttribute在$request对象中具有POST值的属性的名称
确保发布了值后,我们可以将所有这些选项映射到它们的模型属性。有效地调用类似这样的东西:
解析场
现在我们实际将布尔值存储在正确的属性上,是时候来看看Nova中场的解析了。虽然模型可能设置了作用域,但所有复选框都将被\”关闭\”。这是因为该字段仍然试图从$model->scopes;中检索它们的值,而***25***;不存在。因此,让我们通过添加一个resolveUsing
回调来解决这个问题。
您可能已经注意到我们在$options变量中定义了字段选项。这是故意的,因为我们需要这些选项的键。此时,resolveUsing回调无法访问字段本身来检索这些选项。这是我们的解决办法。
1// this function goes inside ->resolveUsing(…)2function ($value, Message $model, string $attribute) use ($options) {5return $model->{$key};6}, $options, $keys);78returnarray_combine($keys, $values);9}pre>
用于resolveUsing()的回调函数接收3个参数:
– mixed $valueLaravel Nova试图检索的值

– Message $model提供值的模型

– string $attribute模型上属性的名称(同样,我们不需要这个)
我们的回调只需要从模型中检索每个布尔值,并将这些值作为数组返回。这个代码有点乱。很难看出发生了什么,我们需要在多个函数作用域中use个值。让我们通过使用速记函数和一些laravelcollect魔术来清理一下这个问题:
**36***
好了,一个很好的一行程序可以从正确的模型属性中解析字段。刷新Nova页面时,复选框应正确指示其状态。奖励:将此字段设为required
只是为了好玩,假设您至少需要选择一个作用域。你的第一反应可能是把->required()放在球场上,但这实际上不起作用,尽管它会在表格上给出一个漂亮的星号*。幸运的是,我们还可以通过调用字段上的rules()方法来添加自定义验证规则。
1 $field->rules(\”required\”, function (string $attribute, $value, callable $fail) {2if (!array_filter(json_decode($value, true) ?? [])) {3return $fail(sprintf(\”The \”%s\” field must have at least one option selected.\”, $attribute));4}5})
设置required规则也会将星号*添加到表单中。回调会快速检查是否有值返回为true。如果不是,我们将$fail称为可调用的,并提供验证失败的原因。
就是这样;一个自定义字段,没有实际构建自定义字段。

Laravel Nova中的群多布尔属性 为WP2原创文章,链接:https://www.wp2.cn/laravel/laravel-nova%e4%b8%ad%e7%9a%84%e7%be%a4%e5%a4%9a%e5%b8%83%e5%b0%94%e5%b1%9e%e6%80%a7/