Разрешения Laravel Entrust отключают ввод текста

Я пытаюсь использовать разрешение, в котором, если у пользователя есть его, пользователь сможет редактировать текстовое поле в форме, в противном случае поле будет отключено.

Я знаю, что могу добавить отключенный параметр здесь {{ 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 показать ту же форму, но отключенные поля)

2 ответа

Прямое решение было бы использовать троичный оператор:

<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>

Это добавит ['maxlength' => 15, 'disabled' => 'disabled'] в поле формы, если авторизованный пользователь имеет разрешение Permission::EDIT_INFO, Если у пользователя нет этого разрешения, он будет только добавлять ['maxlength' => 15],

Поскольку это в точности противоположно тому, что вы спрашиваете (поскольку вы хотели, чтобы поле было отключено, если у пользователя нет разрешения), вам, скорее всего, понадобится другой метод, называемый merge_if_hasnt_permission() - но я полагаю, ты сам сейчас нашел свой путь.

Более короткие имена методов имеют смысл уменьшить код... но я подумал, что довольно сложно описать, что функция делает с меньшим количеством слов.

Кстати, вы также можете использовать этот метод для переопределения свойств $base массив условно.

Это не самый лучший способ сделать это, но это сработает:

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

Вы также должны помнить, чтобы проверить серверную часть для авторизации пользователя.

Я бы посоветовал вам ознакомиться со стандартными документами по авторизации, так как у него есть такая же кривая обучения, как и у большинства сторонних решений, но в конечном итоге он работает лучше / проще: https://laravel.com/docs/5.6/authorization

Другие вопросы по тегам