简体   繁体   中英

Design Pattern for versioning data objects in PHP Rest API

I'm just thinking of API versioning data objects. Let's say you have an object car, which looks like this in version 1 (directory v1):

class Car {
  protected $color;
  protected $brand;
  protected $price;
  protected $custom;

  // getters and setters
}

In version 2, the data object changes (directory v2, $custom removed, added new property $exhaust):

class Car {
  protected $color;
  protected $brand;
  protected $price;
  protected $exhaust;

  // getters and setters
}

We thought of making a "mapper" class, so that we are able to work with different versions in the business logic, eg:

Class CarMapper extends Mapper
{
  // needs to have all member variables from all versions
  protected $color;
  protected $brand;
  protected $price;
  protected $custom;
  protected $exhaust;

  public function out($object) 
  {
    $mapperObj = new self();

    // you need to do this for each version of a data object and
    // prepare the mapperObj according the members of the object for
    // this version
    if ($object instanceof CarV1) {
      $mapperObj->color   = $object->color;
      ...
    }
    return mapperObj;
  }
}

I think this approach will lead a "bloated" Mapper class and I thought there might be a better solution using a design pattern. Could we use a factory pattern here?

I'm don't know what is your situation is but have wrote two object versions is not a best solution. So if you have no ideas to avoid it then you of course you can use the design pattern named factory method https://refactoring.guru/design-patterns/factory-method

In your case it will be something like this

const VERSION = 1;
$app = new App(VERSION)
$car = $app->getCar();

class App 
{
    private $version;

    public function __construct($version)
    {

        if ($version === 1) {
            $this->car = new CarV1()

        } elseif ($version === 2) {
            $this->car = new CarV2()

        } else {
            //Something else

        }

        $this->version = $version;

    }

    public function getCar()
    {
        return $this->car;
    }

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM