georgehanson/laravel-persisters

用于创建持久化类的laravel包

v1.1 2018-11-23 11:30 UTC

This package is not auto-updated.

Last update: 2024-09-29 04:49:26 UTC


README

Build Status Coverage

此包旨在简化在laravel项目中创建持久化类的过程。持久化的想法是抽象数据存储过程。

安装

要安装此包,只需将以下内容添加到您的composer.json文件中

require: {
    ...
    "georgehanson/laravel-persisters": "^1.0"
    ...
}

使用方法

创建持久化类

要创建持久化类,您只需创建一个新的类,让它继承基本持久化类并实现抽象方法。以下是一个示例

use GeorgeHanson\LaravelPersisters\BasePersister;

class MyPersister extends BasePersister
{
    /**
     * Create a new Model
     *
     * @param array $data
     * @return Model
     */
    protected function create(array $data)
    {
        // Store a new resource here
    }

    /**
     * Update the given Model
     *
     * @param array $data
     * @param Model $model
     * @return Model
     */
    protected function update(array $data, Model $model)
    {
        // Update the given model here
    }
}

为了使用您的新持久化类,您可以简单地实例化该类并调用持久化方法。以下是一个示例

$data = [
    'first_name' => 'John',
    'last_name' => 'Doe'
];

$persister = new MyPersister();

$persister->persist($data);

基本持久化类将自动确定您是在创建记录还是更新记录。

创建记录

要使用持久化类创建新记录,只需调用持久化方法并传递要保存的数据。持久化方法可以接受数据数组或类(如Collection、Request),该类实现了Arrayable接口。以下是从请求创建资源的示例。

use Illuminate\Http\Request;
use App\Persisters\MyPersister;

class MyController extends Controller
{
    public function store(Request $request, MyPersister $persister) 
    {
        $record = $persister->persist($request);
    }
}

这将触发您创建的持久化类中的create方法。在这里,您可以处理创建资源所需的任何逻辑。

更新记录

更新记录与创建记录一样简单。唯一的区别是您必须向persist方法传递第二个参数,即您想要更新的模型。以下是如何从请求更新记录的示例。

use Illuminate\Http\Request;
use App\Persisters\MyPersister;
use App\User;

class MyController extends Controller
{
    public function update($id, Request $request, MyPersister $persister) 
    {
        $user = User::find($id);
        
        // Update the user with the given data
        $record = $persister->persist($request, $user);
    }
}

过滤数据

我们无法确定请求中接收到的数据是否总是我们想要持久化的数据。例如,当我们保存记录时,我们不想存储Laravel传递的用于CSRF保护的_token。我们可以通过在持久化器中指定键来实现这一点。这样,它将过滤传递的数据,并只返回存在该键的数据。但是,如果在键数组中指定了键,而它不在传递给持久化器的数据中,则该键的值将被设置为null。以下是一个过滤数据的示例

use GeorgeHanson\LaravelPersisters\BasePersister;

class MyPersister extends BasePersister
{
    /**
     * The data to filter
     * 
     * @type array
     */
    public $keys = [
        "first_name",
        "last_name"
    ];

    /**
     * Create a new Model
     *
     * @param array $data
     * @return Model
     */
    protected function create(array $data)
    {
        // No matter what is passed to us, $data will only contain "first_name" and "last_name"
    }

    /**
     * Update the given Model
     *
     * @param array $data
     * @param Model $model
     * @return Model
     */
    protected function update(array $data, Model $model)
    {
        // Update the given model here
    }
}

或者,如果您没有指定任何键,它将返回所有数据作为数组。