uteq / laravel-model-actions
神奇地为模型添加操作
Requires
- php: ^8.0
- illuminate/contracts: ^8.0
- spatie/laravel-package-tools: ^1.1
Requires (Dev)
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.3
- spatie/laravel-ray: ^1.9
- vimeo/psalm: ^4.4
This package is auto-updated.
Last update: 2024-09-30 01:48:53 UTC
README
此包将神奇地为模型添加操作。只需添加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)。有关更多信息,请参阅许可证文件。