kepka42/laravel-mapper

此包已被弃用且不再维护。未建议替代包。

地图数据包

0.1.2 2019-01-28 03:30 UTC

This package is auto-updated.

Last update: 2021-06-28 09:53:10 UTC


README

关于

laravel-mapper 包允许您非常简单地映射对象

安装

在您的 composer.json 中要求 kepka42/laravel-mapper 包并更新您的依赖项

composer require kepka42/laravel-mapper

您还需要使用命令发布配置

php artisan vendor:publish --provider="kepka42\LaravelMapper\MapperServiceProvider"

使用

要创建映射器,您可以使用命令

php artisan make:mapper NameOfMapper

此命令将在您的应用程序的 app 目录下的 Mapper 文件夹中创建映射器类

<?php 

class NameOfMapper extends AbstractMapper
{
    protected $sourceType = "";

    protected $hintType = ""

    /**
     * @param $object
     * @param array $params
     * @return mixed
     */
    public function map($object, $params = [])
    {
        // TODO: Map here
    }
}

$sourceType 是您想要映射的类型。

$hintType 是您想要映射到的类型。

map 函数是您将具有类型 $sourceType 的对象映射到具有类型 $hintType 的对象的函数实现。

您还需要在 config/mapper.php 中添加您的映射器

<?php

return [
    'mappers' => [
        NameOfMapper::class
    ]
];

这就完成了。您可以使用 Facade

<?php 

$result = Mapper::map($object, HintType::class);

或合约

<?php

$result = $mapperContract->map($object, HintType::class);

示例

我有 DTO 类

<?php

namespace App\Domain;

/**
 * Class SearchInfo
 * @package App\Domain
 */
class SearchInfo
{
    /** @var string */
    private $name;

    /** @var string */
    private $address;

    /**
     * SearchInfo constructor.
     * @param string $name
     * @param string $address
     */
    public function __construct(
        string $name,
        string $address
    )
    {
        $this->name = $name;
        $this->address = $address;
    }

    /**
     * @return string
     */
    public function getName(): string
    {
        return $this->name;
    }

    /**
     * @param string $name
     */
    public function setName(string $name): void
    {
        $this->name = $name;
    }

    /**
     * @return string
     */
    public function getAddress(): string
    {
        return $this->address;
    }

    /**
     * @param string $address
     */
    public function setAddress(string $address): void
    {
        $this->address = $address;
    }
}

并且我想将 Request 映射到 SearchInfo

我需要创建映射器

php artisan make:mapper RequestToSearchInfoMapper

并编写映射函数

<?php

namespace App\Mappers;

use App\Domain\SearchInfo;
use Illuminate\Http\Request;
use kepka42\LaravelMapper\Mapper\AbstractMapper;

/**
 * Class RequestToSearchInfoMapper
 * @package App\Mappers
 */
class RequestToSearchInfoMapper extends AbstractMapper
{
    protected $sourceType = Request::class;

    protected $hintType = SearchInfo::class;

    /**
     * @param Request $object
     * @param array $params
     * @return SearchInfo
     */
    public function map($object, $params = [])
    {
        return new SearchInfo(
            $object->get('name'),
            $object->get('address')
        );
    }
}

现在我需要将我的映射器添加到配置文件中

<?php

return [
    'mappers' => [
        \App\Mappers\RequestToSearchInfoMapper::class,
    ]
];

现在我可以使用这个映射器。我们将在控制器中这样做

<?php
// ...
use kepka42\LaravelMapper\Facades\Mapper;
// ...
public function index(Request $request): Response
{
    $requestInfo = Mapper::map($request, SearchInfo::class);
    //...
    return new Response('{}');
}

<?php
// ...
use kepka42\LaravelMapper\Contracts\MapperContract;
// ...
public function index(Request $request, MapperContract $mapperContract): Response
{
    $requestInfo = $mapperContract->map($request, SearchInfo::class);
    //...
    return new Response('{}');
}

许可证

在 MIT 许可证下发布,请参阅 LICENSE