etsh / groupable
一个用于分组内容的Laravel包 - 类似于简化版的Laravel Organic Groups。
This package is not auto-updated.
Last update: 2024-09-23 07:03:43 UTC
README
Groupable是一个用于分组内容的Laravel包。
它从Drupal社区中汲取灵感 - 可以将其视为简化版的Laravel Organic Groups。
简介
Groupable的核心理念是将任何Eloquent模型转换为可以“加入”并由用户“操作”的“容器”,用于存储“内容”。
此外,用户可以按组分配额外的角色。
Groupable通过向应用程序中需要采用此组行为的模型添加特性来实现。
特性
Groupable提供了三个特性,可以添加到您的模型中
IsGroup
特性用于将您希望被视为组的模型添加到模型中。IsGroupable
特性用于将您希望被视为组内容的模型添加到模型中。JoinsGroups
特性用于您的用户模型。
实际上,只需要IsGroup
特性就可以获得组功能。但是,IsGroupable
和JoinsGroups
特性为用户模型和可分组的内容类型提供了有用的组相关功能。
辅助方法
Groupable包含一个名为Groupable
的类,它提供了内部辅助方法。除非您打算自己修改此项目中的代码,否则您可能不需要使用此类。
数据库结构
Groupable需要在您的模式中添加3个表,并且包括开箱即用的数据库迁移。
不需要将这些迁移发布到您的项目中,因为相应的服务提供者指向您Composer供应商文件夹中的迁移文件夹。
表结构如下
groupables:
id
group_id
group_type
groupable_id
groupable_type
created_at
updated_at
groupable_roles:
id
group_id
group_type
user_id
role
created_at
updated_at
groupable_members:
id
group_id
group_type
user_id
created_at
updated_at
安装
通过composer进行安装
composer require etsh\groupable
然后确保在您的app
配置文件中包含GroupableServiceProvider
Etsh\Groupable\GroupableServiceProvider::class
最后,运行迁移
art migrate
说明:设置
创建组
简单地在您希望成为组的模型中使用IsGroup
特性
use Etsh\Groupable\Traits\IsGroup; class Group extends Model { use IsGroup
然后创建属性$groupable_models
和$groupable_roles
protected $groupable_models = [ GroupableContent::class, ]; protected $groupable_roles = [ 'admin', ]; ...
$groupable_models
应为一个数组,包含允许在此组内分组的模型的完全限定类名。如果您尝试将未在此处指定的内容类型添加到组中,Groupable将抛出异常。
$groupable_roles
应为一个数组,包含您希望成员可授予的额外角色名称。
创建可分组内容
只有指定在您的组模型上的$groupable_models
属性中的模型可以添加到给定的组中。
要添加额外的功能,请在表示您可分组内容的模型中使用IsGroupable
特性。
use Etsh\Groupable\Traits\IsGroup; class Group extends Model { use IsGroupable
允许用户加入组
可以不使用'CanJoinGroups'特性将用户添加到组中,但是它提供了一些有用的辅助函数。
将其包含在您的用户模型中,如下所示
use Etsh\Groupable\Traits\CanJoinGroups; class User extends Authenticatable { use CanJoinGroups;
说明:使用
这些说明假设您已在您的可分组模型中使用了IsGroupable
特性,并在您的用户模型中使用了JoinsTeams
特性。
添加和删除组内容
内容可以像这样添加到组中
$group->addContent($groupable_content);
可以像这样删除
$group->removeContent($groupable_content);
检索组内容
您可以使用如下方式检索所有组内容
$group->content();
这将返回一个包含每个内容模型的Laravel集合。
您还可以通过传递一个所需类型的数组到content()方法,使您的内容请求更加具体。
$group->content([GroupableContentType1::class, GroupableContentType2::class]);
加入和离开一个群组
用户可以像这样加入群组
$group->join($user);
可以像这样删除
$group->leave($user);
检索群组成员
您可以通过这种方式检索所有群组成员
$group->members();
这将返回一个包含每个用户模型的Laravel集合。
您还可以通过指定角色来检索所有群组成员
$group->membersByRole('admin');
检查用户是否是群组成员
您可以通过这种方式检查用户是否是特定群组的成员
$user->belongsToGroup($group);
授予和撤销特殊群组角色
您可能需要在您的群组中为一些用户授予特殊权限,这可以通过以下方式完成
您可以通过这种方式授予用户群组角色
$group->grant($user, $role);
并且可以通过这种方式撤销这些角色
$group->revoke($user, $role);
角色可以在组与组的基础上进行定义,并且应通过在群组模型上添加所需的角色到$groupable_roles
属性来表示。
检查用户是否具有群组角色
您可以通过这种方式检查群组成员是否具有特定的群组角色
$user->hasGroupRole($group, $role);
查看用户拥有的群组角色
您可以通过这种方式查看用户在特定群组中的所有角色
$user->groupRoles($group);
检查哪些内容类型可以添加到群组中
您可以通过这种方式检查哪些内容类型可以添加到群组中
$group->types();
检查群组内可用的角色
您可以通过这种方式检查群组内可用的角色
$group->roles();
查找群组内容所属的其他群组
您可以通过这种方式检索一个包含属于其他群组的群组内容的集合
$groupable_content->groups();