alyakin/favorites

Favorites system for Laravel with folder support and polymorphic relations

0.1.1-RC 2025-03-30 20:49 UTC

This package is auto-updated.

Last update: 2025-04-30 21:04:53 UTC


README

Latest Stable Version Latest Unstable Version Total Downloads Laravel Version PHP Version License Tests

πŸ“¦ ОписаниС

Laravel Favorites β€” это ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ для создания ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½Ρ‹Ρ… связСй ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ ΠΈ Π»ΡŽΠ±Ρ‹ΠΌΠΈ ΠΈΠ·Π±ΠΈΡ€Π°Π΅ΠΌΡ‹ΠΌΠΈ сущностями. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Ρƒ (ΠΏΡ€ΠΎΡ„ΠΈΠ»ΡŽ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΈ Ρ‚.ΠΏ.) Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹, ΡΡ‚Π°Ρ‚ΡŒΠΈ, ΠΏΡ€ΠΎΡ„ΠΈΠ»ΠΈ, ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΈ Π΄Ρ€.

ΠŸΠ°ΠΊΠ΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚:

  • ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎ ΠΏΠ°ΠΏΠΊΠ°ΠΌ с ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ названиями,
  • Ρ€Π°Π±ΠΎΡ‚Ρƒ с UUID ΠΈ timestamps "ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ",
  • ΡΡ‚Ρ€ΠΎΠ³ΡƒΡŽ привязку ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Ρƒ.

🎯 ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для

  • πŸ’Ό Π­Π»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½ΠΎΠΉ ΠΊΠΎΠΌΠΌΠ΅Ρ€Ρ†ΠΈΠΈ β€” ΠΏΠΎΠΊΡƒΠΏΠ°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈΠ·Π±Ρ€Π°Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹, Π±Ρ€Π΅Π½Π΄Ρ‹ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π±ΠΎΡ€ΠΊΠΈ.
  • πŸ“š ΠšΠΎΠ½Ρ‚Π΅Π½Ρ‚-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ β€” Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π² ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΠ»ΠΈ Ρ…Π΅ΡˆΡ‚Π΅Π³ΠΈ.
  • πŸ“Š B2B/CRM систСм β€” ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ², Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈΠ»ΠΈ сдСлки Π² "ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠ΅" для быстрого доступа.

🧭 ОглавлСниС

πŸ›  БистСмныС трСбования

  • PHP 8.1 ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅
  • Laravel 10.x ΠΈΠ»ΠΈ Π²Ρ‹ΡˆΠ΅
  • Composer для управлСния зависимостями

πŸ“₯ Установка

УстановитС ΠΏΠ°ΠΊΠ΅Ρ‚ Ρ‡Π΅Ρ€Π΅Π· Composer:

composer require alyakin/favorites

Π€Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ отсутствуСт β€” ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π³ΠΎΡ‚ΠΎΠ² ΠΊ использованию сразу послС установки ΠΈ рСгистрации ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°.

βš™οΈ Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

БСрвисы ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· сСрвис-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Laravel:

use \Alyakin\Favorites\Services\{FavoriteService, FavoriteFolderService};

$favoritesService = app(FavoriteService::class);
$folderService = app(FavoriteFolderService::class);

НиТС прСдставлСны Π±Π°Π·ΠΎΠ²Ρ‹Π΅ сцСнарии использования.

βž• Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠ΅

// Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠ΅
$favoritesService->addToFavorites($ownerId, $model);

// Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ:
$favoritesService->addToFavorites($ownerId, $model, 'read later');

βž– Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ

// Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ· ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ:
$favoritesService->removeFromFavorites($ownerId, $model);

πŸ“‚ Π Π°Π±ΠΎΡ‚Π° с ΠΏΠ°ΠΏΠΊΠ°ΠΌΠΈ

// Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ
$folderService->createFolder($ownerId, 'Папка');

// ΠŸΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ
$folderService->renameFolder($ownerId, $folderId, $newName);

// ΠŸΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ элСмСнт Π² ΠΏΠ°ΠΏΠΊΡƒ:
$favoritesService->moveToFolder($favoriteId, $folderId);

// ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС ΠΏΠ°ΠΏΠΊΠΈ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°:
$folderService->getAllFoldersForOwner($ownerId);

// Π£Π΄Π°Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΏΠΊΡƒ:
// ⚠️ Π’ΠΠ˜ΠœΠΠΠ˜Π•! ΠŸΡ€ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΏΠ°ΠΏΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ всС ΠΈΠ·Π±Ρ€Π°Π½Π½Ρ‹Π΅ элСмСнты Π²Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Ρ‘.
$folderService->deleteFolder($ownerId, $folderId);

πŸ“„ ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ

// ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС ΠΈΠ·Π±Ρ€Π°Π½Π½Ρ‹Π΅ элСмСнты Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°:
$favoritesService->getFavorites($ownerId);

// ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ·Π±Ρ€Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅:
$favoritesService->getFavorites($ownerId, 'funy');

// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, находится Π»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠΌ:
$favoritesService->isFavorited($ownerId, $model);

πŸŽ› ΠšΠ°ΡΡ‚ΠΎΠΌΠΈΠ·Π°Ρ†ΠΈΡ

ΠŸΠ°ΠΊΠ΅Ρ‚ спроСктирован с ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΠΈ ΠΈ Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

  • Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ модСль Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π°, пСрСдавая любой UUID-совмСстимый ownerId.
  • Папки Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ β€” ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠ΅ ΠΈ Π±Π΅Π· Π½ΠΈΡ….
  • Вся бизнСс-Π»ΠΎΠ³ΠΈΠΊΠ° ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π° Π² сСрвисах (FavoriteService, FavoriteFolderService) ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π° ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Ρ‡Π΅Ρ€Π΅Π· DI-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€.
  • Названия Ρ‚Π°Π±Π»ΠΈΡ†, столбцов ΠΈ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΎΠ±Ρ‰ΠΈΠΌ стандартам Laravel ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΏΡ€ΠΈ нСобходимости.

πŸ”„ ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π·Π°ΠΌΠ΅Π½Π° Π»ΠΎΠ³ΠΈΠΊΠΈ добавлСния

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ свой кастомный сСрвис:

class CustomFavoriteService extends \Alyakin\Favorites\Services\FavoriteService {
    // ...
}

ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π½ΡƒΠΆΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄:

public function addToFavorites(string $ownerId, Model $model, ?string $folderName = null): Favorite
{
    // своя Π»ΠΎΠ³ΠΈΠΊΠ° β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅
    \Log::info('Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΠΈΠ·Π±Ρ€Π°Π½Π½ΠΎΠ΅', ['owner_id' => $ownerId]);

    return parent::addToFavorites($ownerId, $model, $folderName);
}

ЗарСгистрируйтС Π² AppServiceProvider:

$this->app->bind(
    \Alyakin\Favorites\Services\FavoriteService::class,
    \App\Services\CustomFavoriteService::class
);

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Laravel Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π°ΡˆΡƒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ вмСсто Π±Π°Π·ΠΎΠ²ΠΎΠΉ.

🀝 БотрудничСство

ΠœΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ ΠΊ прСдлоТСниям ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡΠΌ!

  • Π‘ΠΎΠΎΠ±Ρ‰Π°ΠΉΡ‚Π΅ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Ρ‡Π΅Ρ€Π΅Π· Issues
  • ΠŸΡ€ΠΈΡΡ‹Π»Π°ΠΉΡ‚Π΅ Pull Requests с ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡΠΌΠΈ
  • ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΠΉΡ‚Π΅ ΠΈΠ΄Π΅ΠΈ ΠΏΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

πŸ“„ ЛицСнзия

This package is open-source and available under the MIT License.