CakePHP 3 - набор переключателей BuildRules - PullRequest
0 голосов
/ 19 октября 2018

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

Утвержденные действия должны быть заблокированы, чтобы их пользователь не мог изменить их.Только через административную панель одобренные действия должны быть доступны для редактирования.

Чтобы реализовать это, мы сделали это buildRule:

public function buildRules(RulesChecker $rules)
{
    // Check if activity wasn't locked
    $rules->add(function ($entity, $settings)
    {
        // Return false if already approved before
        return !$entity->approved || $entity->isDirty('approved');
    }, 'alreadySubscribed', ['errorField' => 'name', 'message' => 'Activity has been approved and is now locked']);


    return $rules;
}

(BuildRule вместо правила валидации, потому что валидация также должна срабатывать, когда *Поле 1008 * не изменено и, следовательно, не является частью проверки.)

Приведенное выше правило не позволяет администраторам изменять действия, поэтому мой вопрос:

Можете ли выпереключаться между buildRules в вашей таблице, как вы можете изменить метод проверки?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Полагаю, решение @ ndm является более официальным.В итоге я нашел другое решение, которое сначала хочу попробовать.
По сути, я добавил флаг в модель Деятельности:

class ActivitiesTable extends Table
{

    /** @var bool Flag whether admin is modifying the table */
    private $_admin = false;

    // ...

И сделал построение правил зависимым от него:

    if (!$this->_admin)
    {
        $rules->add(function ($entity, $settings)
        {
            // ...

В контроллере вы можете переключить модель в режим администрирования и сохранить объект, который в противном случае вышел бы из строя:

$this->Activities->_admin = true;

$this->Activities->save($activity);
0 голосов
/ 19 октября 2018

Не совсем, есть событие Model.buildRules, которое можно использовать для добавления правил, но это все.

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

Посмотрите на cakephp / авторизация Это позволяет вам реализовать очень гибкие политики, которые могут обрабатывать такие случаи.В качестве альтернативы есть функция авторизации старой школы, предоставляемая компонентом auth, или (крайне недокументированный) ACL плагин.

Если ваша авторизация действительно очень проста, т.е. область администратора = редактирование разрешено"и" область без прав администратора = редактирование НЕ разрешено", т. Е. В вашем приложении может быть только одна точка, где потребуется проверка, затем вывозможно, сойдет с рук что-то менее сложное, например, передача параметров в процессе сохранения.Опции будут переданы в правила, где вы можете проверить их соответствующим образом, то есть что-то вроде этого:

$options = [
    'updateApproved' => true
];
$Model->save($entity, $options);
function ($entity, $settings)
{
    if (isset($settings['updateApproved']) &&
        $settings['updateApproved'] === true
    ) {
        return true;
    }

    // ...

    return !$entity->approved || $entity->isDirty('approved');
}

Таким образом, сохранение утвержденных объектов будет работать только тогда, когда true передается через updateApproved вариант.Как уже упоминалось, это не слишком удачное решение, в любом случае я бы посоветовал взглянуть на плагин авторизации и узнать, как правильно реализовать авторизацию.

См. Также

...