uteq/laravel-model-actions

神奇地为模型添加操作

1.2.0 2021-03-19 14:46 UTC

This package is auto-updated.

Last update: 2024-09-30 01:48:53 UTC


README

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

此包将神奇地为模型添加操作。只需添加WithActions特质

将特质添加到模型中

use Uteq\ModelActions\Concerns\WithActions;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use WithActions;
}

然后以各种方式使用它

$user->action()->update($input);
$user->action('update', $input);
$user->action(\App\Actions\User\Update::class, $input);

每当您需要调用模型上的方法,而这个方法还没有在数据库中有活动记录时,您也可以使用这个静态方法。

User::do(Create::class, $input);

此包受到了关于OOP的文章的启发:https://www.tonysm.com/when-objects-are-not-enough/#objects-in-the-large 尤其是关于向模型添加操作的最后一部分对我来说很有意义。这将保持您的模型整洁,并将操作分开。

此包背后的想法是,添加操作可以使您的应用程序更具可扩展性。通过将这些操作添加到模型中,进行“分组”,更容易理解操作的作用。与操作突然出现相比,让模型 $user->action() 执行操作更具声明性。要创建更多上下文,您需要始终使用前缀,例如UserCreateAction来调用操作。

您对在应用程序中使用操作持怀疑态度?请阅读Spatie.be的Brent的这篇出色的博客文章:https://stitcher.io/blog/laravel-beyond-crud-03-actions

您需要php 8.0

安装

您可以通过composer安装此包

composer require uteq/laravel-model-actions

您可以使用以下命令发布配置文件

php artisan vendor:publish --provider="Uteq\ModelActions\ModelActionsServiceProvider" --tag="laravel-model-actions-config"

这是发布配置文件的内容

return [
    /**
     * You can overwrite the method used to handle the
     * action. By default this is __invoke.
     */
    'method' => '__invoke',    
];

使用方法

在模型上

将WithActions特质添加到模型中

use Uteq\ModelActions\Concerns\WithActions;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    use WithActions;
}

目录

操作应添加到以下文件夹结构中

App
├── Actions
│   └── User
│       ├── Create.php 
│       ├── Update.php 
│       ├── Destroy.php
│       └── AddImage.php
└── Models
    └── User.php

之后,您就可以始终从模型访问这些操作

这就是操作类的样子

class Update
{
    public function __invoke(User $model, array $input = [])
    {
        // Now add you own logic here
    }
}

如您所见,$user将自动注入到__invoke方法中。系统知道用户是因为您是从用户那里调用的。请注意,模型始终是第一个参数。

操作类的名称将用作方法名称。因此,UpdateImage类可以通过User::action()->updateImage($input)来访问。

$user->action(Update::class, $input);

操作中的依赖注入

默认情况下,在操作的__construct中进行了依赖注入。因此,您可以这样做

class Destroy
{
    public function __construct(
        protected PublicDestroyer $destroyer,
    ) { }
    
    public __invoke(User $user, array $input = [])
    {
        ($this->destroyer)($user, $input);
    }
}

参数绑定

对于模型操作,参数绑定非常直接。我们有命名参数(见下文)和简单地使用给定的顺序

class Action
{
    public function __invoke($var1, $var2)
    {
    
    }
}
User::do(Action::class, 'var1', 'var2');

命名参数

利用php 8的命名参数,您能够非常严格地指定操作类可以接受的内容。

class Action
{
    public function __invoke($name)
    {
    
    }
}
User::do(Action::class, name: 'test');

示例

将操作应用于所有模型

将WithActions添加到所有模型的一个方便方法是简单地扩展Eloquent模型类并在此基础上扩展。

namespace App\Support;

use Uteq\ModelActions\Concerns\WithActions;

class Model extends \Illuminate\Database\Eloquent\Model
{
    use WithActions;
}
class ActionModel extends \App\Support\Model
{

} 

测试

composer test

变更日志

请参阅CHANGELOG了解最近有哪些变化。

贡献

请参阅CONTRIBUTING了解详细信息。

安全漏洞

请参阅我们的安全策略了解如何报告安全漏洞。

鸣谢

许可证

麻省理工学院许可证(MIT)。有关更多信息,请参阅许可证文件