etsh/groupable

一个用于分组内容的Laravel包 - 类似于简化版的Laravel Organic Groups。

1.0.0 2016-10-31 20:10 UTC

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特性就可以获得组功能。但是,IsGroupableJoinsGroups特性为用户模型和可分组的内容类型提供了有用的组相关功能。

辅助方法

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();