0

我正在尝试使用权限,如果用户拥有它,那么用户将能够编辑表单中的文本字段,否则,该字段将被禁用。

我知道我可以在这里添加一个禁用的参数{{ Form::text('name', ['disabled' => 'disabled']) }}

我应该怎么做才能实现我需要做的事情而不必编写我的 HTML 表单两次?这是我的表格:

 @if (Auth::user()->can(\Permission::EDIT_INFO))
        <tr>
            <th>Name 1:</th>
                <td>
                {{ Form::text('name') }}
                </td>
            <th>Name 2:</th>
                <td>
                {{ Form::text('name_ar') }}
                </td>
        </tr>
 @endif

换句话说:(if有权限显示正常表单else显示相同的表单但禁用字段)

4

2 回答 2

1

直接的解决方案是使用三元运算符

<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有条件地覆盖数组的属性。

于 2018-05-03T16:44:51.117 回答
0

这并不是最好的方法,但它会起作用:

{{ Auth::user()->can(\Permission::EDIT_INFO) ? Form::text('name') : Form::text('name', ['disabled' => 'disabled']) }}

您还应该记住检查服务器端以授权用户。

我建议您查看标准授权文档,它的学习曲线与大多数第 3 方解决方案一样多,但最终效果更好/更容易:https ://laravel.com/docs/5.6/authorization

于 2018-05-03T16:56:16.770 回答