inlm/mappers

Mappers for Lean Mapper.

Maintainers

Details

github.com/inlm/mappers

Source

Issues

Fund package maintenance!
Other

v3.0.0 2021-02-21 20:03 UTC

This package is auto-updated.

Last update: 2024-08-27 10:08:07 UTC


README

Build Status Downloads this Month Latest Stable Version License

Mappers for Lean Mapper.

Donate

Installation

Download a latest package or use Composer:

composer require inlm/mappers

Inlm\Mappers requires PHP 7.2.0 or later.

Usage

DynamicMapper

Dynamic mapper uses explicit mapping of entities and tables.

$mapper = new DynamicMapper;
$mapper->setMapping(
	'order_items', // table name - required
	'OrderItem', // entity class - optional
	'OrderItemRepository', // repository class - optional
	'item_id' // primary key - optional
);

If there's no mapping for entity or table, call is passed to fallback mapper (LeanMapper\DefaultMapper by default):

$mapper = new DynamicMapper;
$mapper->getTable('OrderItem'); // returns 'orderitem'

$mapper = new DynamicMapper(new Inlm\Mappers\UnderScoreMapper);
$mapper->getTable('OrderItem'); // returns 'order_item'

PrefixMapper

PrefixMapper adds & removes prefix from table names.

$mapper = new PrefixMapper('prefix_');
$mapper = new PrefixMapper('prefix_', $fallbackMapper);

PrefixMapper only processes prefixes in table names, everything else is given to fallback mapper (LeanMapper\DefaultMapper by default):

$mapper = new PrefixMapper('prefix_');
echo $mapper->getTable('OrderItem'); // prints 'prefix_orderitem'

$mapper = new PrefixMapper('prefix_', new Inlm\Mappers\UnderScoreMapper);
echo $mapper->getTable('OrderItem'); // prints 'prefix_order_item'

RowMapper

RowMapper maps values to / from LeanMapper\Row (requires Lean Mapper 3.5+).

$mapper = new RowMapper;
$mapper = new RowMapper($fallbackMapper);
$mapper->registerFieldMapping($entity, $field, $fromDbValue, $toDbValue);
$mapper->registerFieldMapping(
	Model\Entity\Client::class,
	'website',
	function ($dbValue) {
		return new Website($dbValue);
	},
	function (Website $rowValue) {
		return $rowValue->getUrl();
	}
);


// multi column mapping
$mapper->registerMultiValueMapping(
	Model\OrderItem::class,
	'price',
	function (array $values, $rowField) {
		return new Price($values[$rowField . '_total'], $values[$rowField . '_currency']);
	},
	function (Price $price, $rowField) {
		return [
			$rowField . '_total' => $price->getPrice(),
			$rowField . '_currency' => $price->getCurrency(),
		];
	}
);

StiMapper

StiMapper simplifies working with Single Table Inheritance.

$mapper = new StiMapper;
$mapper = new StiMapper($fallbackMapper);

Registration of STI types:

$mapper->registerStiType($baseEntity, $typeValue, $entityClass);
$mapper->registerStiType(Entities\Client::class, 'company', Entities\ClientCompany::class);
$mapper->registerStiType(Entities\Client::class, 'individual', Entities\ClientIndividual::class);

Default STI type column is named type, you can change it with:

$mapper->registerTypeField(Entities\Client::class, 'clientType');

You can limit LeanMapper\Fluent for specific STI type:

$fluent = $connection->select('*')->from('client');
$mapper->applyStiMapping($fluent, Entities\ClientCompany::class);
echo $fluent; // SELECT * FROM `client` WHERE `client`.`clientType` = 'company'

How change default entity namespace

$mapper = new Inlm\Mappers\DefaultMapper('App\Entity');
$mapper = new Inlm\Mappers\CamelCaseMapper('App\Entity');
$mapper = new Inlm\Mappers\UnderScoreMapper('App\Entity');

Recommended order of mappers

  • RowMapper
  • StiMapper
  • PrefixMapper
  • DynamicMapper
  • DefaultMapper / CamelCaseMapper / UnderScoreMapper

License: New BSD License
Author: Jan Pecha, https://www.janpecha.cz/