Files
alfa-bank-sdk/_docs/laravel-libs/laravel-data/as-a-data-transfer-object/mapping-property-names.md

2.3 KiB

title, weight
title weight
Mapping property names 7

Sometimes the property names in the array from which you're creating a data object might be different. You can define another name for a property when it is created from an array using attributes:

class ContractData extends Data
{
    public function __construct(
        public string $name,
        #[MapInputName('record_company')]
        public string $recordCompany,
    ) {
    }
}

Creating the data object can now be done as such:

ContractData::from(['name' => 'Rick Astley', 'record_company' => 'RCA Records']);

Changing all property names in a data object to snake_case in the data the object is created from can be done as such:

#[MapInputName(SnakeCaseMapper::class)]
class ContractData extends Data
{
    public function __construct(
        public string $name,
        public string $recordCompany,
    ) {
    }
}

You can also use the MapName attribute when you want to combine input (see transforming data objects) and output property name mapping:

#[MapName(SnakeCaseMapper::class)]
class ContractData extends Data
{
    public function __construct(
        public string $name,
        public string $recordCompany,
    ) {
    }
}

It is possible to set a default name mapping strategy for all data objects in the data.php config file:

'name_mapping_strategy' => [
    'input' => SnakeCaseMapper::class,
    'output' => null,
],

Mapping Nested Properties

You can also map nested properties using dot notation in the MapInputName attribute. This is useful when you want to extract a nested value from an array and assign it to a property in your data object:

class SongData extends Data
{
    public function __construct(
        #[MapInputName("title.name")]
        public string $title,
        #[MapInputName("artists.0.name")]
        public string $artist
    ) {
    }
}

You can create the data object from an array with nested structures:

SongData::from([
    "title" => [
        "name" => "Never gonna give you up"
    ],
    "artists" => [
        ["name" => "Rick Astley"]
    ]
]);

The package has a set of default mappers available, you can find them here.