aymanalhattami/laravel-approval

将审批附加到任何模型,以防止未经授权的更新。

1.0.0 2023-11-02 09:39 UTC

This package is auto-updated.

Last update: 2024-09-24 14:58:01 UTC


README

将修改审批附加到任何模型,以防止未经授权的更新。

注意:此包是从cloudcake/laravel-approval分叉而来,以便支持最新的Laravel版本并添加新功能

入门指南

通过composer安装此包

composer require aymanalhattami/laravel-approval

注册服务提供者

此包使用Laravel的自动发现。如果您正在使用Laravel的早期版本(< 5.4),则需要手动注册服务提供者。

Approval\ApprovalServiceProvider::class添加到config/app.php中的providers数组中。

发布配置

php artisan vendor:publish --provider="Approval\ApprovalServiceProvider" --tag="config"

发布迁移

php artisan vendor:publish --provider="Approval\ApprovalServiceProvider" --tag="migrations"

运行迁移

php artisan migrate

设置

设置审批模型

要将模型附加到审批流程,只需简单地给模型添加RequiresApproval特性,例如

use Approval\Traits\RequiresApproval;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use RequiresApproval;
}

条件审批

可能存在某些情况下您不希望模型总是经过审批流程,因此提供了requiresApprovalWhen以供方便使用,默认为false,以防止在后台意外创建审批

/**
* Function that defines the rule of when an approval process
* should be actioned for this model.
*
* @param array $modifications
*
* @return boolean
*/
protected function requiresApprovalWhen(array $modifications) : bool
{
    // Handle some logic that determines if this change requires approval
    //
    // Return true if the model requires approval, return false if it
    // should update immediately without approval.
    return false;
}

可选属性

审批模型包含一些可选属性,以使审批流程尽可能灵活。以下属性默认定义,并具有默认值,您可以根据需要按模型修改它们。

/**
* Number of approvers this model requires in order
* to mark the modifications as accepted.
*
* @var integer
*/
protected $approversRequired = 1;

/**
* Number of disapprovers this model requires in order
* to mark the modifications as rejected.
*
* @var integer
*/
protected $disapproversRequired = 1;

/**
* Boolean to mark whether or not this model should be updated
* automatically upon receiving the required number of approvals.
*
* @var boolean
*/
protected $updateWhenApproved = true;

/**
* Boolean to mark whether or not the approval model should be deleted
* automatically when the approval is disapproved wtih the required number
* of disapprovals.
*
* @var boolean
*/
protected $deleteWhenDisapproved = false;

/**
* Boolean to mark whether or not the approval model should be deleted
* automatically when the approval is approved wtih the required number
* of approvals.
*
* @var boolean
*/
protected $deleteWhenApproved = true;

设置审批者模型

任何其他模型(不仅仅是用户模型)可以通过添加ApprovesChanges特性来审批模型,例如

use Approval\Traits\ApprovesChanges;
use Illuminate\Database\Eloquent\Model;

class Admin extends Model
{
    use ApprovesChanges;
}

任何具有ApprovesChanges特性的模型都继承了审批访问功能。

审批者授权(可选)

默认情况下,任何具有ApprovesChanges特性的模型都将能够审批和拒绝修改。您可以通过在特定的审批者模型上添加authorizedToApprove方法来自定义授权以审批/拒绝修改。

use Approval\Traits\ApprovesChanges;
use Illuminate\Database\Eloquent\Model;

class Admin extends Model
{
    use ApprovesChanges;

    protected function authorizedToApprove(\Approval\Models\Modification $mod) : bool
    {
        // Return true to authorize approval, false to deny
        return true;
    }
}

拒绝者授权(可选)

与审批流程类似,拒绝修改的授权方法遵循相同的逻辑

use Approval\Traits\ApprovesChanges;
use Illuminate\Database\Eloquent\Model;

class Admin extends Model
{
    use ApprovesChanges;

    protected function authorizedToApprove(\Approval\Models\Modification $mod) : bool
    {
        // Return true to authorize approval, false to deny
        return true;
    }

    protected function authorizedToDisapprove(\Approval\Models\Modification $mod) : bool
    {
        // Return true to authorize disapproval, false to deny
        return true;
    }
}

用法

检索待审批的修改

任何包含RequiresApproval特性的模型可能有多个待审批的修改,要访问这些修改,可以在审批模型上调用modifications()方法

$post = Post::find(1);
$post->modifications()->get();

仅检索待创建的修改

$post = Post::find(1);
$post->modifications()->creations()->get();

仅检索待更改的修改

$post = Post::find(1);
$post->modifications()->changed()->get();

检索修改创建者

对于模型上的任何待审批的修改,您可以获取发起修改请求的模型

$post = Post::find(1);
$post->modifications()->first()->modifier();

此(修改者)通常是更改模型并触发审批修改的用户,但由于审批支持不仅仅是用户,因此创建者可以是任何其他模型。

检索模型的修改

$active = Post::find(1)->modifications()->activeOnly()->get();
$inactive = Post::find(1)->modifications()->inactiveOnly()->get();
$any = Post::find(1)->modifications()->get();

添加修改审批

$modification = Post::find(1)->modifications()->first();
$reason = "This is optional reason.";

$approver = Admin::first();
$approver->approve($modification, $reason);

添加修改拒绝

$modification = Post::find(1)->modifications()->first();
$reason = "This is optional reason.";

$approver = Admin::first();
$approver->disapprove($modification, $reason);

检索修改审批

$post         = Post::find(1);
$modification = $post->modifications()->first();
$approval     = $modification->approvals()->get();

检索审批作者

$post         = Post::find(1);
$modification = $post->modifications()->first();
$approval     = $modification->approvals()->get();
$author       = $approval->approver();

检索审批理由

$post         = Post::find(1);
$modification = $post->modifications()->first();
$approval     = $modification->approvals()->first();
$reason       = $approval->reason;

检索修改拒绝

$post         = Post::find(1);
$modification = $post->modifications()->first();
$approval     = $modification->disapprovals()->get();

检索拒绝作者

$post         = Post::find(1);
$modification = $post->modifications()->first();
$approval     = $modification->disapprovals()->get();
$author       = $approval->disapprover();

检索拒绝理由

$post         = Post::find(1);
$modification = $post->modifications()->first();
$approval     = $modification->disapprovals()->first();
$reason       = $approval->reason;

检索剩余所需修改审批

$post         = Post::find(1);
$modification = $post->modifications()->first();
$remaining    = $modification->approversRemaining;

检索剩余的所需修改拒绝

$post         = Post::find(1);
$modification = $post->modifications()->first();
$remaining    = $modification->disapproversRemaining;

强制修改更新

$post         = Post::find(1);
$modification = $post->modifications()->first();
$modification->forceApprovalUpdate();