cybercog/laravel-ownership

Laravel Ownership 简化了 Eloquent 模型所有者的管理。

5.6.0 2024-03-09 17:32 UTC

README

cog-laravel-ownership

Discord Build StyleCI Releases License

简介

Laravel Ownership 简化了 Eloquent 模型所有者的管理。组可以是事件的拥有者,用户可以是聊天室的拥有者,组织可以拥有许可证。它可以用于许多情况,不仅限于作者。在几分钟内将任何模型设置为拥有者并创建可拥有的模型!

内容

特性

  • 专为与 Laravel Eloquent 模型协同工作而设计
  • 使用合约以保持高度定制能力
  • 每个模型都可以有一个类型的所有者或使用多态性
  • 可选择在模型创建时自动分配当前认证用户作为所有者
  • 可选择在模型创建时配置自动所有者解析策略
  • 可选择在模型创建时手动分配所有者
  • 可选择在模型创建时手动跳过自动分配当前用户
  • 转让所有权(更改所有者)
  • 使模型成为孤儿(放弃所有者)
  • 各种所有者检查和查询作用域
  • 遵循 PHP 标准建议
  • 带有单元测试

安装

首先,通过 Composer 拉取此包。

composer require cybercog/laravel-ownership

手动注册包(可选)

如果您禁用了包自动发现,您可以手动注册它。

app/config/app.php 中包含服务提供者。

'providers' => [
    Cog\Laravel\Ownership\Providers\OwnershipServiceProvider::class,
];

使用

Laravel Ownership 允许模型具有严格的所有者模型类型(HasOwner 特性)或使用多态关系(HasMorphOwner 特性)。

严格所有权在模型只能属于一个模型类型时很有用。尝试设置未定义的模型类型的所有者将引发 InvalidOwnerType 异常。 示例:只有用户允许创建帖子。

多态所有权在模型可以属于不同类型的所有者时很有用。 示例:用户和组织可以将应用程序上传到市场。

准备所有者模型

在所有者模型中使用 CanBeOwner 合约并实现它

use Cog\Contracts\Ownership\CanBeOwner as CanBeOwnerInterface;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements CanBeOwnerInterface
{
    // ...
}

准备具有严格所有权的可拥有模型

在将获得所有权行为的模型中使用 Ownable 合约并实现它或只需使用 HasOwner 特性。

use Cog\Contracts\Ownership\Ownable as OwnableInterface;
use Cog\Laravel\Ownership\Traits\HasOwner;
use Illuminate\Database\Eloquent\Model;

class Article extends Model implements OwnableInterface
{
    use HasOwner;
}

具有严格所有权的可拥有模型必须在数据库中具有额外的可空列以存储所有者关系

Schema::table('articles', function (Blueprint $table) {
    $table->integer('owned_by_id')->unsigned()->nullable();

    $table->index('owned_by_id');
});

覆盖严格所有权的所有者外键

默认情况下,所有者模型将与 config('auth.providers.users.model') 提供的相同。

要覆盖严格所有权中的默认所有者模型,请将所有者模型的主键或外键扩展到您的可拥有模型,并添加其他属性

use Cog\Contracts\Ownership\Ownable as OwnableInterface;
use Cog\Laravel\Ownership\Traits\HasOwner;
use Illuminate\Database\Eloquent\Model;

class Article extends Model implements OwnableInterface
{
    use HasOwner;

    protected $ownerModel = Group::class;
    protected $ownerPrimaryKey = 'gid';
    protected $ownerForeignKey = 'group_id';
}

准备具有多态所有权的可拥有模型

在将获得多态所有权行为的模型中使用 Ownable 合约并实现它或只需使用 HasMorphOwner 特性。

use Cog\Contracts\Ownership\Ownable as OwnableInterface;
use Cog\Laravel\Ownership\Traits\HasMorphOwner;
use Illuminate\Database\Eloquent\Model;

class Article extends Model implements OwnableInterface
{
    use HasMorphOwner;
}

具有多态所有权的可拥有模型必须在数据库中具有额外的可空列以存储所有者关系

Schema::table('articles', function (Blueprint $table) {
    $table->nullableMorphs('owned_by');
});

可用方法

获取所有者关系

$article->ownedBy();
$article->owner();

获取模型所有者

$article->getOwner();
$article->ownedBy;
$article->owner;

更改(设置)所有者

$article->changeOwnerTo($owner);

放弃(取消设置)所有者

$article->abandonOwner();

检查是否有所有者

$article->hasOwner();

检查是否由所有者拥有

$article->isOwnedBy($owner);

检查不是由所有者拥有

$article->isNotOwnedBy($owner);

在模型创建时手动定义默认所有者

$article = new Article;
$article->withDefaultOwner()->save();

底层将使用 resolveDefaultOwner() 方法。

或者提供具体的所有者

$user = User::where('name', 'admin')->first();
$article = new Article;
$article->withDefaultOwner($user)->save();

在创建模型时跳过定义默认所有者

$article = new Article;
$article->withoutDefaultOwner()->save();

作用域

按所有者范围模型

Article::whereOwnedBy($owner)->get();

按非所有者范围模型

Article::whereNotOwnedBy($owner)->get();

自动将认证用户设置为所有者

要将当前认证用户设置为可拥有模型的拥有者,请在创建时扩展它并添加属性 withDefaultOwnerOnCreate。它适用于严格和多态所有权行为。

use Cog\Contracts\Ownership\Ownable as OwnableInterface;
use Cog\Laravel\Ownership\Traits\HasOwner;
use Illuminate\Database\Eloquent\Model;

class Article extends Model implements OwnableInterface
{
    use HasOwner;

    protected $withDefaultOwnerOnCreate = true;
}

要覆盖获取默认所有者的策略,请使用 resolveDefaultOwner 方法扩展可拥有模型

use Cog\Contracts\Ownership\Ownable as OwnableInterface;
use Cog\Laravel\Ownership\Traits\HasOwner;
use Illuminate\Database\Eloquent\Model;

class Article extends Model implements OwnableInterface
{
    use HasOwner;

    public $withDefaultOwnerOnCreate = true;

    /**
     * Resolve entity default owner.
     * 
     * @return \Cog\Contracts\Ownership\CanBeOwner|null
     */
    public function resolveDefaultOwner()
    {
        return \App\User::where('name', 'admin')->first();
    }
}

变更日志

请参阅变更日志了解最近的变化。

升级

请参阅升级指南获取详细的升级说明。

贡献

请参阅贡献指南获取详细信息。

测试

使用以下命令运行测试

vendor/bin/phpunit

安全

如果您发现任何安全相关的问题,请通过电子邮件open@cybercog.su联系,而不是使用问题跟踪器。

鸣谢

Laravel Ownership 贡献者列表

替代方案

请随时通过Pull Request添加更多替代方案。

许可

关于 CyberCog

CyberCog 是一个热衷于研究的社交团体。研究产品与软件开发中的最佳解决方案是我们的热情。

CyberCog