narcisonunez/laravel-actionable-model

允许Laravel模型执行或接收操作

1.3.2 2021-04-10 15:02 UTC

This package is auto-updated.

Last update: 2024-09-10 22:58:40 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

允许模型执行或接收操作。

安装

您可以通过composer安装此包

composer require narcisonunez/laravel-actionable-model

您可以使用以下命令发布和运行迁移

php artisan vendor:publish --provider="Narcisonunez\LaravelActionableModel\LaravelActionableModelServiceProvider" --tag="actionable-model-migrations"
php artisan migrate

基本设置

注册您的操作

在您的 AppServiceProvider 中添加您的操作

use Narcisonunez\LaravelActionableModel\Facades\ActionableActionTypes;
use App\ActionTypes\KudosActionType;

ActionableActionTypes::register([
    'like',
    'kudos' => KudosActionType::class,
    'celebrate'
]);

您可以通过扩展 ActionableTypeRecord 类来自定义更多逻辑到您的记录。
例如,实现一个 icon 方法来获取特定操作类型的图标。现在,任何 kudos 操作都将有一个名为 icon 的方法。

您的操作将被用作动态方法调用。请参阅以下内容。

创建一个新的操作类型(可选)

php artisan actionable:type LikeActionType

为您的模型添加别名(可选)

在您的 AppServiceProvider 中添加您的别名

use App\Models\Cause;
use App\Models\User;
use Narcisonunez\LaravelActionableModel\Facades\ActionableModelAliases;

ActionableModelAliases::register([
    User::class => 'user',
    Cause::class => 'cause'
]);

在数据库中存储别名可以防止在将模型移动到其他目录时丢失引用。

更新现有模型引用以使用新别名

如果您的数据库中已经有数据,在添加别名后,您可以运行

php artisan actionable:update-aliases // Update all the records

如果您只想更新特定值

php artisan actionable:update-aliases --from="App\\User" --to="App\\Models\\User"

更新所有现有记录。

特质

需要执行所需操作的功能模型

// Imports 
class User extends Authenticatable
{
    use ActionableModel;
    use CanPerformActions;
    ...
}

可以接收操作的功能模型必须实现 CanBeActionable

...
use Narcisonunez\LaravelActionableModel\Traits\ActionableModel;

class Cause extends Model implements CanBeActionable
{
    use ActionableModel;
    ...
}

基本用法

执行操作

// You will use your actions as methods call.
$user->performActionOn($cause)->like();
$user->performActionOn($cause)->kudos();
$user->performActionOn($cause)->celebrate();

检查操作是否已执行

// returns False or an ActionableTypeRecord
$user->hasPerformedAction('like')->on($cause);

切换操作

// remove if exists the action, otherwise creates a new like
$user->performActionOn($cause)->toggle('like');
// OR
// toggleACTIONTYPE
$user->performActionOn($cause)->toggleLike(); 
$user->performActionOn($cause)->toggleKudos(); 
$user->performActionOn($cause)->toggleCelebrate(); 

手动删除操作(见切换部分)

if ($action  = $user->hasPerformedAction('like')->on($cause) ) {
    $action->delete();
}

获取所有操作

$user->actions;

// To help you out filtering your actions. You can use the actionsFilter method
$user->actionsFilter()->get();
$user->actionsFilter()->latest(10);
$user->actionsFilter()->given()->get();
$user->actionsFilter()->received()->get();
$user->actionsFilter()->ofType('like')->get();
$cause->actionsFilter()->by($user)->ofType('like')->get();
$cause->actionsFilter()->by($user)->ofType('like')->count();

- 可用方法 -

操作记录

上述方法将返回一个 ActionableRecord 集合。
要访问所有者或可操作模型,您可以这样做

$actionRecord = $user->actionsFilter()->ofType('like')->get()->first();

$actionRecord->owner; // The model that performed the action
$actionRecord->actionable; // The model that received the action
$actionRecord->action; // Action that was performed. ex. like, kudos, celebrate, etc.
$actionRecord->type; // An alias to action

💖 支持开发

您喜欢这个项目吗?通过捐赠来支持它

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。