{"id":33988528,"url":"https://github.com/iooe/laravel-comments","last_synced_at":"2025-12-13T05:57:50.587Z","repository":{"id":34230895,"uuid":"156405968","full_name":"iooe/laravel-comments","owner":"iooe","description":"Comments system for your Laravel application. Features: can be used to comment on any model, HTML filter customization (HTMLPurifier), API, comment rating, replies, events, auth rules ...","archived":false,"fork":false,"pushed_at":"2025-07-11T04:07:23.000Z","size":180,"stargazers_count":122,"open_issues_count":3,"forks_count":18,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-11-12T05:40:17.713Z","etag":null,"topics":["comments","laravel","package","php"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iooe.png","metadata":{"files":{"readme":"readme-ru.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-06T15:36:35.000Z","updated_at":"2025-07-11T04:07:26.000Z","dependencies_parsed_at":"2024-06-21T14:27:47.542Z","dependency_job_id":"448c6c6e-1f17-42da-bd88-1e333779911a","html_url":"https://github.com/iooe/laravel-comments","commit_stats":{"total_commits":175,"total_committers":3,"mean_commits":"58.333333333333336","dds":"0.011428571428571455","last_synced_commit":"f7d811f613c2514ae6bafcd2952648ccb2afc1a6"},"previous_names":[],"tags_count":50,"template":false,"template_full_name":null,"purl":"pkg:github/iooe/laravel-comments","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iooe%2Flaravel-comments","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iooe%2Flaravel-comments/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iooe%2Flaravel-comments/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iooe%2Flaravel-comments/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iooe","download_url":"https://codeload.github.com/iooe/laravel-comments/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iooe%2Flaravel-comments/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":27698390,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-13T02:00:09.769Z","response_time":147,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["comments","laravel","package","php"],"created_at":"2025-12-13T05:57:49.883Z","updated_at":"2025-12-13T05:57:50.582Z","avatar_url":"https://github.com/iooe.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# laraComments        \n Данная библиотека может быть использована для добавления возможности комментирования любой модели (Laravel model) в вашем приложении.\n   \n### Возможности \n- [x] Просмотр комментариев        \n- [x] Создание комментария\n- [x] Удаление комментария\n- [x] Редактирование комментария\n- [x] Создание ответа на комментарий        \n- [x] Права на действие – удаление, создание и тд (Laravel Gate policies) | Возможность кастомизации      \n- [x] Изменяемый шаблон комментариев        \n- [x] События на создание, редактирование, удаление комментариев.\n- [x] Система рейтинга: лайки, дизлайки.       \n- [x] API: get, update, delete, create …\n- [x] HTML фильтр для комментариев, с возможностью изменения правил (Используется библиотека HTMLPurifier)      \n\n        \n## [Руководства по обновлению](#upgrade-guides)\n+ [From 2.x.x to 3.0](#from-2xx-to-30) \n                           \n## Требования \n- php 7.1 + \n- laravel 5.6 +      \n- `В вашем приложении должент быть установлен модуль аутентификации:`\n    - Laravel 6.x: [https://laravel.com/docs/6.x/authentication](https://laravel.com/docs/6.x/authentication)\n    - Laravel 5.6: [https://laravel.com/docs/5.6/authentication](https://laravel.com/docs/5.6/authentication)\n\n\n## Установка \n```bash \ncomposer require tizis/lara-comments \n```   \n\n### 1. Запустите миграции        \n Это создаст все необходимые для комментариев таблицы в базе данных.    \n        \n```bash  \n php artisan migrate \n ``` \n ### 2.  Добавьте `Commenter trait` к вашей модели пользователя.\n Это добавит все необходимые для комментирования функции вашему пользователю.\n```php \nuse tizis\\laraComments\\Traits\\Commenter;\n     \nclass User extends Authenticatable {   \n\tuse ..., Commenter;   \n ``` \n  ### 3. Создайте модель `Comment`\n  \n\n ```php \n  \n use tizis\\laraComments\\Entity\\Comment as laraComment;\n \n class Comment extends laraComment\n {\n \n }\n ``` \n\n\n ### 4. Добавьте `Commentable trait` и `ICommentable` интерфейс вашим моделям     \n  Добавьте `Commentable trait` и`ICommentable` тем моделям, к которым вы хотите добавить возможность оставлять комментарии: посты, книги, видео и тд\n  \n ```php \n use tizis\\laraComments\\Contracts\\ICommentable;\n use tizis\\laraComments\\Traits\\Commentable;     \n      \n class Post extends Model implements ICommentable {        \n    use Commentable;        \n ```        \n \n ### 5. Пользовательские `политики` (опционально)\n Если вам нужно, то вы можете изменить политики прав пользователей по умолчанию. \n Политики - это условия проверки может ли пользователь сделать то, или иной действие: удалить комментарий, изменит его, ответить и тд\n\n Создаем файл политики с наследованием от правил по умолчанию:\n  ```php \n \u003c?php\n namespace App\\Http\\Policies;\n \n use App\\Entity\\Comment;\n \n use tizis\\laraComments\\Policies\\CommentPolicy as CommentPolicyPackage;\n \n class CommentPolicy extends CommentPolicyPackage\n {\n     // Переписываем проверку прав на удаление комментария\n     public function delete($user, $comment): bool\n     {\n         // Теперь всего будет возвращаться true т.е. любой пользователь может удалить любой комментарий.\n         return true;\n     }\n }\n ```\n Далее необходимо зарегистрировать новые правила политики в `AuthServiceProvider`\n \n ```php \n use Illuminate\\Support\\Facades\\Gate;\n use App\\Http\\Policies\\CommentPolicy;\n ...\n public function boot()\n {\n     Gate::resource('comments_custom', CommentPolicy::class, [\n         'delete' =\u003e 'delete',\n         'reply' =\u003e 'reply',\n         'edit' =\u003e 'edit',\n         'vote' =\u003e 'vote'\n     ]);\n }\n ```\n И добавить название пользовательских правил политики в файл конфигурации\n ```php\n     'policy_prefix' =\u003e 'comments_custom',\n ```\n \n ## Примеры    \n Этот репозиторий содержит только пример реализации с помощью фреймворка bootstrap4, но вы можете создать ваш собственный интерфейс так, как вам угодно. \n \n Пример по умолчанию использует рендеринг комментариев на стороне сервера, и `этот способ имеет плохую производительность` при большом количестве комментариев (100+) на один пост- это связано с необходимостью проверки прав пользователя (удалени, редактирование и тд) для каждого комментарий.\n    \n`Правильный и современный путь реализации` - это получение сырых данных о комментариях через AJAX, и генерации интерфейса на стороне пользователя с помощью Vue js (или иной другой подобной бибилиотеки) с проверкой прав пользователя на различные действия на стороне самого пользователя. Это снимет всю лишнию нагрузку с сервера, но не повредит безопасности вашего приложения - ведь это лишь интерфейс, а все действия вроде сохранения или удаления комментария имеют собственные проверки на стороне сервера (политики).\n\n    \n1. Реализация интерфейса с помощью библиотеки bootstrap 4    \n![3333](https://user-images.githubusercontent.com/16865573/48430227-0124c680-e799-11e8-8cdb-8dd042155550.png)      \n\n      \n ### Публикация конфига и конфигурация приложения (опционально)        \nВ `конфиге` вы можете определить такие настройки, как:\n        \n- путь, по которому находится ваша модель пользователя; по умолчанию это: `\\App\\User::class` \n- путь, по которому находится ваша модель комментария; по умолчанию это: `\\App\\Comment::class` \n- название политики проверки прав пользователя, вы можете создать свою собственную политики, переопределив права по умолчанию, унаследовав политику по умолчанию `tizis\\laraComments\\Policies\\CommentPolicy`;        \n- разрешенные html теги для фильтра \n- префикс API      \n \nПубликация конфига:       \n```bash \nphp artisan vendor:publish --provider=\"tizis\\laraComments\\Providers\\ServiceProvider\" --tag=config \n```        \n ### Публикация примера по умолчанию (кастомизация внешнего вида)        \n \n По умолчанию интерфес реализован с помощью `Bootstrap 4`, но никакой привязки к определенным технологиям нет. Это `лишь пример` использования вомзожностей `laraComments`.\n \n ⚠⚠⚠**Внимание** ⚠⚠⚠\n \n Все примеры по умолчанию включает в себя необходимые для работы скрипты и стили. Это может вызвать конфликт с вашими Js/css файлами.\n        \n```bash \nphp artisan vendor:publish --provider=\"tizis\\laraComments\\Providers\\ServiceProvider\" --tag=views \n```        \n ## Использование \n\n### 1. Рендеринг на стороне сервера:  \n  В том месте представления (view), где вы желаете вывести комментарии, вставьте этот код:      \n``` \nlaravel 6\n\n@comments(['model' =\u003e $post]) @endcomments   \n``` \n``` \nLaravel 7\n\n\u003cx-comments :model=\"$post\"/\u003e  \n``` \nВ примере, мы передаем модель книги в качестве аргумента `model`. Из нее автоматически считывается информации об `commentable_encrypted_key`.\n\nТакже, библиотека автоматически считывает вошел пользователь в систему, или нет.\n        \nЕсли вы откроете в браузере страницу, которая содержит представление с вышеуказанным кодом, то вы должны увидеть работающую форму комментариев.\n        \n### 2. Рендеринг на стороне пользователя (API):  \n\n|Title| Method |  Url | Params| Route name |\n|--|--|--| -- | --|\n|Получить комментарии |GET |  /api/comments/ | commentable_encrypted_key, order_by (column name, default is id), order_direction (default is asc) |  route('comments.get') |\n|Сохранить комментарий| POST | /api/comments/ | commentable_encrypted_key, message |route('comments.store') | \n|Удалить комментарий|DELETE|/api/comments/{comment_id}| -- | route('comments.delete', $comment_id)  |\n|Изменить комментарий|POST|/api/comments/{comment_id}| message|  route('comments.update', $comment_id)\n|Ответить на комментарий|POST|/api/comments/{comment_id}| message | route('comments.reply', $comment_id)\n|Проголосовать за комментарий|POST|/api/comments/{comment_id}/vote| vote(bool) | route('comments.vote', $comment_id)\n\n### 3. Доступ к сервису комментариев\n\nЕсли вы `не желаете` использовать готовый функционал из коробки, вроде API и контроллера с предустановленными методами, но хотите получить доступ к встроенным возможностям данной библиотеки, то вы можете воспользоваться помощью `tizis\\laraComments\\UseCases\\CommentService`\n\nДанный класс используется внутри встроенного контроллера комментариев для обработки запросов, так что, вы не будете ничем не ограничены при его использование.     \n\nДля отключения роутов API по умолчанию установите значение конфига `route.root =\u003e null`\n\n**Методы**:\n1. Создание комментария: `CommentService::createComment`\n  ```\n  $user = Auth::user();\n  $modelId = decrypt($request-\u003ecommentable_encrypted_key)['id']; // считывание ид из зашифрованного ключа  \n  $model = Post::findOrFail($modelId);\n  $message = '123'\n  \n  $parent = rand(1, 100); // Необязательный параметр\n  \n  $createdComment = CommentService::createComment(new Comment(), $user, $model, $message, [опциональный аргумент $parent]);\n```\n 2. Удаление комментария: `CommentService::deleteComment`\n  ```\n  $comment = Comment::findOrFail(123);\n\n  CommentService::deleteComment($comment);\n```\n\n2. Изменение комментария: `CommentService::updateComment`\n  ```\n    $comment = Comment::findOrFail(123);\n    $message = 'new text';\n    \n    $updatedComment = CommentService::updateComment($comment, $message);\n```\n\n## События        \nЭта библиотека содержит события на создание, удаление, и редактирование комментария.\n\n- `tizis\\laraComments\\Events\\CommentCreated` \n- `tizis\\laraComments\\Events\\CommentUpdated` \n- `tizis\\laraComments\\Events\\CommentDeleted`\n\n## API препроцессинг\n\n⚠⚠⚠**ДОСТУПЕН ТОЛЬКО ДЛЯ API**⚠⚠⚠\n\nПоддержка аттрибутов (при получении комментариев):\n- user **[Object]**\n- comment **[String]**\n\n#### 1. Описание\nБывают ситуации, когда перед отправкой данных пользователю необходимо провести с ними какие-либо действия. В подобной ситуации можно воспользоваться препроцессором.\n\n#### 2. Конфиг:\n```\n    'api' =\u003e [\n        'get' =\u003e [\n            'preprocessor' =\u003e [\n                'comment' =\u003e  App\\Helpers\\CommentPreprocessor\\Comment::class,\n                'user' =\u003e  App\\Helpers\\CommentPreprocessor\\User::class \n                ...\n            ]\n        ]\n    ]\n``` \n\n#### 3. Настройки  \nСоздайте класс препроцессора и унаследуйте интерфейс `ICommentPreprocessor`\n \n **Примеры препроцессоров**:\n \n Комментарий:\n ```\n \nnamespace App\\Helpers\\CommentPreprocessor;\n\nuse tizis\\laraComments\\Contracts\\ICommentPreprocessor;\n\nclass Comment implements ICommentPreprocessor\n{\n    public function process($comment): array\n    {\n        return 'Hi, ' . $comment . '!';\n    }\n}\n           \n ```        \n Пользователь:\n  ```\n  \n namespace App\\Helpers\\CommentPreprocessor;\n \n use tizis\\laraComments\\Contracts\\ICommentPreprocessor;\n \n class User implements ICommentPreprocessor\n {\n     public function process($user): array\n     {\n         $user-\u003ename = $user-\u003ename . '[Moderator]' \n         return $user;\n     }\n }\n            \n  ```  \n \n#### 4. Примеры использования:\n\nБез препроцесора:\n```\n$comment = 1;\necho $comment; // 1\n\n$user = Auth::user();\necho $user-\u003ename; // user1\n``` \nС препроцессором:\n\n```\n$comment = 1;\necho $comment; // Hi, 1 !\n\n$user = Auth::user();\necho $user-\u003ename; // user1[Moderator]\n``` \n\n## Возможности Commentable моделей\n- Скоп (scope) withCommentsCount() // сКоличествомКомментариев\n\n#### Пример:\n\n```\n/**\n * Добавляет аттрибут comments_count к получаемой модели поста \n */\nPosts::withCommentsCount()-\u003eorderBy('id', 'desc')-\u003eget() \n``` \n\n## Статический хелпер\n \n ` use tizis\\laraComments\\Http\\CommentsHelper;` \n\n#### Доступные методы:\n- getNewestComments(default $take = 10, default $commentable_type = null) // получить Последние Комментарии\n- getCommenterRating(int $userId, [optional Carbon $cacheTtl]) // получить Рейтинг Пользователя\n- moveCommentTo(CommentInterface $comment, ICommentable $newCommentableAssociate) // переместить Комментарий\n- moveCommentToAndRemoveParentAssociateOfRoot(CommentInterface $comment, ICommentable $newCommentableAssociate) // переместить Комментарий И Удалить Связь С Родителем\n\n#### Пример:\n\n```\nCommentsHelper::getNewestComments(20) // Возвращает последние 20 комментариев \nCommentsHelper::getNewestComments(20, Book::class) // Возвращает последние 20 комментариев модели Книги\n``` \n\n## Upgrade guides\n### From 2.x.x to 3.0\nАттрибуты запроса `commentable_type`  и  `commentable_id` были объединены в один аттрибут```commentable_encrypted_key``` \n \nВам нужно заменить все вызовы устаревших аттрибутов.\n\nПример:\n\n```\nOld /bootstrap4/form.blade.php\n\u003cinput type=\"hidden\" name=\"commentable_type\" value=\"\\{{ get_class($model) }}\"/\u003e\n\u003cinput type=\"hidden\" name=\"commentable_id\" value=\"{{ $model-\u003eid }}\"/\u003e\n\n``` \n```\nNew /bootstrap4/form.blade.php\n\u003cinput type=\"hidden\" name=\"commentable_encrypted_key\" value=\"{{ $model-\u003egetEncryptedKey() }}\"/\u003e\n``` \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiooe%2Flaravel-comments","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fiooe%2Flaravel-comments","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fiooe%2Flaravel-comments/lists"}