我正在尝试使用权限,如果用户拥有该权限,则用户将能够编辑表单中的文本字段,否则,该字段将被禁用。
我知道我可以在这里添加一个禁用的参数{{ 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
显示相同表单但禁用字段(
直接的解决方案是使用三元运算符:
<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']
数组。
但是可能还有更好的方法可以做到这一点,因为如果您有其他参数,即当[]
不为空而是类似['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>
如果当前经过身份验证的用户具有权限Permission::EDIT_INFO
,这将向表单字段添加['maxlength' => 15, 'disabled' => 'disabled']
。如果用户没有此权限,则只会添加['maxlength' => 15]
。
由于这与你的要求完全相反(因为您希望在用户没有权限时禁用该字段(,你很可能需要另一种称为merge_if_hasnt_permission()
的方法 - 但我想你现在自己找到了自己的方式。
较短的方法名称对于减少代码是有意义的...但我认为很难用更少的单词来描述函数的作用。
顺便说一下,您还可以使用此方法有条件地重写$base
数组的属性。
这不是最好的方法,但它会起作用:
{{ Auth::user()->can(Permission::EDIT_INFO) ? Form::text('name') : Form::text('name', ['disabled' => 'disabled']) }}
您还应该记住检查服务器端以授权用户。
我建议您查看标准的授权文档,它与大多数 3rd 方解决方案一样具有学习曲线,但最终效果更好/更容易:https://laravel.com/docs/5.6/authorization