Насколько корректным будет использование Laravel для решения данной задачи?

Добрый день! Можете, пожалуйста, дать советы по реализации следующего функционала на Laravel? У меня есть пользователь, который публикует статьи и имеет возможность их скрывать. Я хотел бы, чтобы при публикации статьи, если пользователь не вносил изменений, она автоматически проходила модерацию. В противном случае, если были изменения, публикация должна ожидать подтверждения.

В текущей реализации я поступил так:
1. В контроллере получаю текущее состояние модели до обновления с помощью getOriginal().
2. Затем извлекаю массив значений из текущего Request.
3. Сравниваю два массива с помощью array_diff и, если различия касаются только дат (то есть их количество не превышает двух), то фиксирую, что изменений не было.

Насколько корректным является такой подход? Есть ли другие способы проверки изменений? Спасибо!
  • 27 декабря 2024 г. 13:03
Ответы на вопрос 3
Здравствуйте!

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

### 1. Дополнительные проверки на изменения
Вместо использования `array_diff` для сравнения двух массивов, можете использовать метод `isDirty` Laravel. Он позволит вам проверить, были ли изменения в конкретных полях модели.

Пример:
```php
if (!$article->isDirty() || $article->isDirty('published_at')) {
    // Нет изменений или изменена только дата публикации
    $article->status = 'moderation'; // Устанавливаем статус на модерацию
} else {
    // Изменения были, ждем подтверждения
    $article->status = 'pending'; // Устанавливаем статус ожидания подтверждения
}
```

### 2. Использование событий модели
Вы также можете использовать события модели, такие как `saving` или `updating`, для выполнения логики проверки изменений. Пример:

```php
protected static function boot()
{
    parent::boot();

    static::updating(function ($article) {
        // Логика проверки изменений и установки статуса
    });
}
```

### 3. Ручная проверка определенных полей
Если у вашей статьи есть много полей, и вы хотите игнорировать изменения в специфичных полях (например, дату), можно использовать метод `only` для выборки полей, которые хотите проверить:

```php
$original = $article->getOriginal();
$requestData = $request->only(['title', 'content']); // Укажите поля, которые вы хотите проверить

if ($original == $requestData) {
    // Нет изменений
}
```

### 4. Хранение статуса статьи
Обязательно убедитесь, что у вас есть поле в базе данных (например, `status`), которое будет хранить текущий статус статьи (модерация, ожидание и т.д.). Это упрощает логику при работе со статьями.

### 5. Тестирование
Не забудьте протестировать вашу логику на различных сценариях — например, когда пользователь изменяет лишь одно поле, когда изменяет несколько полей, и так далее.

### Заключение
Выбранный вами подход корректен, но я рекомендую рассмотреть использование встроенных методов Laravel для упрощения и повышения читаемости вашего кода. Опросите детализированные изменения с использованием методов модели и возможностей событий. Это улучшит поддержку, тестирование и потенциально расширение функционала в будущем.

Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться!
Самое простое и изящное решение, которое позволит форматировать текст без модерации. 
Любой текст пропускаете через фильтр:
1. удаляете все BBcode, Markdown или что вы там используете.
2 удаляете все пробелы и знаки препинания, оставляя только символы в нижнем регистре.

После этого сохраняете полученные результат как хэш, в md5, SHA или как вам там удобнее, коллизия с md5 возможна, но если вы добавите проверку на дату публикации, то можно это опустить.

Теперь, когда автор будет что-то изменять в тексте, если он не изменил сам текст, то хэш не изменится, а значит не нужно проходит проверку, при этом автор свободно может форматировать текст и расставлять знаки препинания.
Сравнивайте итеративно конкретные поля, через Whitelist. Сравнение по количеству изменённых полей выглядит ненадёжным
Похожие вопросы