直接的解决方案是使用三元运算符:
<tr>
<th>Name 1:</th>
<td>{{ Form::text('name', Auth::user()->can(\Permission::EDIT_INFO) ? [] : ['disabled' => 'disabled']) }}</td>
<th>Name 2:</th>
<td>{{ Form::text('name_ar', Auth::user()->can(\Permission::EDIT_INFO) ? [] : ['disabled' => 'disabled']) }}</td>
</tr>
这将使用[]
参数数组以防万一Auth::user()->can(\Permission::EDIT_INFO)
,['disabled' => 'disabled']
如果用户没有权限则使用该数组。
但是可能有更好的方法来做到这一点,因为如果你有其他参数,这个解决方案也会产生重复的代码,即 when[]
不是空的,而是类似['aria-label' => 'abc', 'maxlength' => 15]
.
编辑:
您还可以创建一个辅助方法,根据是否存在权限来简化使用不同类型的参数。
如果这是您第一次定义自定义辅助方法,您将需要一个放置它们的地方。你基本上需要一个普通.php
文件,所以没问题app/helpers.php
。要加载辅助方法,您必须在某些时候包含该文件 - 我建议在AppServiceProvider::register()
方法中这样做:
/**
* Register any application services.
*/
public function register()
{
require_once app_path().'/helpers.php';
// other code ...
}
然后你必须在app/helpers.php
文件中定义你的辅助方法:
<?php
if (!function_exists('merge_if_has_permission')) {
function merge_if_has_permission(string $permission, array $base, array $optional): array
{
if (\Auth::user()->can($permission)) {
return array_merge($base, $optional);
}
return $base;
}
}
然后,您可以在前端使用此功能:
<td>{{ Form::text('name', merge_if_has_permission(\Permission::EDIT_INFO, ['maxlength' => 15], ['disabled' => 'disabled'])) }}</td>
如果当前经过身份验证的用户具有权限,这将添加['maxlength' => 15, 'disabled' => 'disabled']
到表单字段中Permission::EDIT_INFO
。如果用户没有这个权限,它只会添加['maxlength' => 15]
.
由于这与您所要求的完全相反(因为如果用户没有权限,您希望禁用该字段)您很可能需要另一种方法merge_if_hasnt_permission()
- 但我想您现在自己找到了方法。
较短的方法名称对于减少代码是有意义的……但我认为用更少的词来描述函数的作用是相当困难的。
顺便说一句,您也可以使用此方法$base
有条件地覆盖数组的属性。